merny
Active Forum Member / Активный участник форума
Участник № / Member № 2290
отправлено / posted
Проверка обмена между TRACE MODE и контроллером показали, что все работает "как надо" за исключением групповых запросов на запись (на чтение не проверял). По подсказке использовался канал CALL.ChGroupReq и источник/приемник W_Word(6). В узле была создана группа "каналы", в группе "каналы" создан компонент CALL. В редакторе канала указан тип вызова ChGroupReq, в разделе редактора Системные.Основные указан тип Output. В разделе источники/приемники создана группа Modbus, в группе создан компонент W_Word(6). Настройки параметров Modbus аналогичные работоспособным примерам. В программе ST добавлены 3 переменные USINT типа Out. Первой присваивалось значение одной из переменных программы (синусоида+10), две другие были равны синусоида+60 и синусоида+110 (три параллельные синусоиды). В канале CALL.ChGroupReq созданы 3 аргумента USINT типа In/Out Дополнительные переменные программы были привязаны к аргументам канала. Для визуальной проверки были созданы 3 аргумента экрана типа In, которые были привязаны к аргументам канала CALL.ChGroupReq. Создан ГЭ Тренд, в котором созданы три кривые, отображающие значения аргументов экрана, привязанных к аргументам канала CALL.ChGroupReq. Канал CALL.ChGroupReq привязан к источнику/приемнику W_Word(6).
Результаты: при запуске мрв ГЭ Тренд показывает 3 параллельные синусоиды, что означает, что аргументы канала CALL.ChGroupReq корректно отображают значения переменных ST программы. Но программа-монитор, отображающая значения Modbus регистров, показывает значения 0, кроме того регистра, значение которого управляется отдельным каналом. Там все отображается правильно. Т.е. групповой запрос на запись регистра не работает. В чем ошибка?
Сообщения / Posts 70 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
отправлено / posted
W_Word(6) и W_Word(16) это разные функции "Запись по Modbus/TCP в HoldingRegisters" этот топик рядом.
отправлено / posted
Групповая запись по Modbus по стандарту осуществляется функцией W_Word(16) . Надо создать именно такой компонент в слое "Источники/Приемники" и привязать к нему канала CALL.ChGroupReq.
merny
Active Forum Member / Активный участник форума
Участник № / Member № 2290
отправлено / posted
переделал давно уже, только не мог на форум войти удалил W_Word(6), создал W_Word(16) и привязал CALL заново. индивидуальная привязка работает, а групповая не работает. 4 синусоиды одна отображает значение отдельного канала, ее значения видны и на тренде и в окне монитора регистров контроллера. 3 синусоиды аргументы канала CALL.ChGroupReq. на графике видны, монитор же показывает нули может я с типом аргументов что-то не так сделал?
Сообщения / Posts 70 | Из / From: Россия
| IP / IP: IP адрес / IP address |
merny
Active Forum Member / Активный участник форума
Участник № / Member № 2290
отправлено / posted
quote:Отправитель / Originally posted by AdAstra Technical Support: Канал CALL.ChGroupReq в данном случае будет создаваться типа OUT. В топике http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/31/t/001318.html указано, что для реализации записи надо в атрибут ВХОД этого канала подавать 1. Запись будет осуществляться однократно для каждой каждой поданной "1".
атрибут ВХОД это атрибут "Входное значение" с Id=2? нужно подавать именно 1, или достаточно управлять только младшим битом? сойдет как вариант автоматического управления: создание переменной в ST программе и регулярная запись в нее 1 с привязкой переменной к "входному значению"? или лучше воспользоваться функцией setAttributeI(UDINT ch_id, UINT attr_id, DINT value)
Сообщения / Posts 70 | Из / From: Россия
| IP / IP: IP адрес / IP address |
merny
Active Forum Member / Активный участник форума
Участник № / Member № 2290
отправлено / posted
quote:Отправитель / Originally posted by AdAstra Technical Support: Канал CALL.ChGroupReq в данном случае будет создаваться типа OUT. В топике http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/31/t/001318.html указано, что для реализации записи надо в атрибут ВХОД этого канала подавать 1. Запись будет осуществляться однократно для каждой каждой поданной "1".
Yurik. N.
Forum Member / Участник форума
Участник № / Member № 3294
отправлено / posted
Добрый день! Просьба, по возможности, прислать пример групповой записи по протоколу modbus на адрес: xxx@yyy.ru Заранее большое спасибо!
[ 15.08.2014, 15:31: Сообщение отредактировал / Message edited by AdAstra Technical Support ]
Сообщения / Posts 35 | Из / From: Russia
| IP / IP: IP адрес / IP address |
Berdiugin
Junior Member / Новичок
Участник № / Member № 8483
отправлено / posted
Здравствуйте. Прошу выслать пример группового чтения и записи по протоколу Modbus. Адрес электронной почты: xxx@yyy Заранее спасибо.
[ 15.09.2020, 11:46: Сообщение отредактировал / Message edited by АдАстра. Техподдержка ]
Сообщения / Posts 5 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Berdiugin
Junior Member / Новичок
Участник № / Member № 8483
отправлено / posted
Здравствуйте. Стоит задача записывать и отображать аварийные и предупредительные уставки. Запись осуществляется из нескольких мест: 1. ПК с МРВ Trace mode) и 2. Панели оператора на шкафах управления. Переменных достаточно много тип Float, в памяти ПЛК они лежат последовательно. Было принято решение использовать возможность групповой записи с применением канала CALL ChGroupReq. В слое источники приемники была создана группа Modbus. Был добавлен канал W_Float(16) тип output, Аналог. Был оздан канал CALL ChGroupReq тип output и привязан к каналу W_Float(16). Далее были созданы аргументы канала CALL тип IN. По количеству аргументов канала CALL были созданы каналы Float типа IN. Аргументы канала CALL были привязаны к каналам Float реальное значение. Создал аргументы экрана тип IN и привязал их к входному значению каналов Float. Создал на экране элемент «Текст» с него ввожу данные. Если ввести данные и в атрибут 39 канала CALL подать 1, то произойдет запись требуемых переменных. В начальный момент времени каналы Float имеют нулевые значения, поэтому в начальный момент времени приравниваю их к считанным с ПЛК значениям переменных. Возникли следующие сложности: 1.Не удается организовать корректную запись в регистр ПЛК данных с двух источников. Мне нужно отслеживать текущее значение переменной в ПЛК и в случае его изменения с панели перезаписывать во входное значение канала Float, а в случае изменения оператором этого значения тоже менять входное значение канала Float. Данная операция требуется в любом проекте. Есть ли так называемое заводское решение, как это делать предполагалось производителем. Пытаюсь решить вопрос созданием программы, но, мне кажется, что я полез в дебри, и решение гораздо проще. 2. После ввода в поле текст значения я нажимаю кнопку «Готово». Можно ли отследить момент нажатия этой кнопки?
Сообщения / Posts 5 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Вы правы, во множестве проектов возникает необходимость управления одним регистром из нескольких мест.
Однако, при попытке записи в один приемник информации из двух источников, всегда приводит к состязательности. Обычно, решается в пользу последней пришедшей информации (т.к. она затирает более раннюю информацию).
Рекомендуется эту задачу решать созданием последовательной цепочки. ПК с МРВ передается и получает данные с Панели Оператора из шкафа, Панель же передает и получает данные от ПЛК.
В этом случае избавляемся от состязательности и увеличиваем надежность системы.
1. Одним источником считываем информацию с ПЛК, другим - записываем. Рекомендуется написать программу в среде TRACE MODE, которая при заданных условиях будет обновлять значения аргументов канала Call ChGroupReq (на запись в ПЛК).
Berdiugin
Junior Member / Новичок
Участник № / Member № 8483
отправлено / posted
Спасибо за ответ. 1. При выходе из строя панели оператора мы лишимся всех устройств управления, что явно не повысит надежность 2. Таких панелей оператора у меня 3, что при вашем подходе усложнит жизнь. Конфликта между панелями оператора у меня не возникает, поэтому у меня сложилось мнение что данный вопрос в TRACE MODE должен решаться сам собой.
Сообщения / Posts 5 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
1. В АСУ ТП разделяют средний уровень АСУТП (Шкафы управления) и верхний (Автоматизированное Рабочее Место Оператора).
В надежной системе задачи и функции одного уровня не дублируются другим уровнем. Каждый выполняет свою задачу. При том, при возникновении проблем на одном уровне, все связанные с ним нижестоящие устройства должны продолжать выполнять свою задачу. Например, при выходе из строя АРМ в Операторской, Шкаф управления должен продолжать управлять устройствами. С другой стороны, если Шкаф Управления вышел из строя, то, при наличии, должен включится резерв Шкафа Управления.
2. Правильно разработанная АСУ упрощает жизнь Оператору. Конфликта между Панелями не возникло, так как они располагаются на одном уровне АСУТП. Достаточно добавить верхний уровень, который будет общаться с этими Панелями и задача решена.
Однако, если Вы настроены на "дублирование" функции Шкафа Управления, то Вы можете одним источником считывать данные с устройства, другим записывать, а самостоятельно разработанной программой что и когда делать с полученными данными. Чтение происходит с заданным периодом. Запись в момент изменения атрибута Входное Значение.
Сообщения / Posts 17315 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Berdiugin
Junior Member / Новичок
Участник № / Member № 8483
отправлено / posted
И если можно, еще один вопрос на эту тему. На форуме есть следующий пост "Если "ChGroupReq с параметром 0 направлением Output", то он будет отрабатывать только по принудительной команде, например, через передачу "1" в атрибут 39 (EXEC). Можно компонент W_Word(16)#3 задать с напривлением INPUT и соответствующий "ChGroupReq с параметром 0 направлением INPUT". Такой канал будет передавать любые изменения значений его аргументов." У меня работает групповая запись сразу всех аргументов ChGroupReq через передачу "1" в атрибут 39 (EXEC), но если я меняю направление на INPUT у W_Float(16) и у ChGroupReq данные записать не удается. Хотелось бы выполнять запись только измененного аргумента.
Сообщения / Posts 5 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Вы всегда можете задать интересующий Вас вопрос.
Для групповой записи по изменению одного аргумента необходимо использовать modbus-функцию 16. В настройках источника направление изменить с output на input. Аналогично в настройках канала Call.ChGroupReq. Типы аргументов канала Call.ChGroupReq установить в соответствии с типом данных в устройстве. (Справочная Система - Каналы и Системные переменные - Каналы класса Call - Канал класса Call.ChGroupReq - Привязка источника MODBUS чтения или записи)
Сообщения / Posts 17315 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Berdiugin
Junior Member / Новичок
Участник № / Member № 8483
отправлено / posted
Сделал согласно вашей подсказки. Имею следующее: При запуске профайлера на служебной панели МРВ в атрибуте №124 ArgSize канала Call.ChGroupReq есть все мои аргументы, причем они имеют значения которые я ввожу, но в ПЛК данные не передаются. Запись выделенного аргумента в ПЛК происходит только если я вручную нажму на кнопку с тремя точками на служебной панели МРВ. Как сделать чтобы запись происходила автоматически?
Сообщения / Posts 5 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
У аргументов канала Call.ChGroupReq (канал с привязкой к источнику W_Float(16)) есть привязки к числовым каналам. Это мешает штатной работе.
Рекомендуется значения из числовых каналов передавать в аргументы канала Call.ChGroupReq с помощью канала Call.Move.
Сообщения / Posts 17315 | Из / From: Россия
| IP / IP: IP адрес / IP address |