This is topic Групповые запросы по Modbus in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.
Проверка обмена между 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, кроме того регистра, значение которого управляется отдельным каналом. Там все отображается правильно. Т.е. групповой запрос на запись регистра не работает. В чем ошибка?
Posted by Nico (Участник № / Member № 5342) on :
W_Word(6) и W_Word(16) это разные функции "Запись по Modbus/TCP в HoldingRegisters" этот топик рядом.
[ 17.09.2020, 15:00: Сообщение отредактировал / Message edited by АдАстра. Техподдержка ]
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Групповая запись по Modbus по стандарту осуществляется функцией W_Word(16) . Надо создать именно такой компонент в слое "Источники/Приемники" и привязать к нему канала CALL.ChGroupReq.
переделал давно уже, только не мог на форум войти удалил W_Word(6), создал W_Word(16) и привязал CALL заново. индивидуальная привязка работает, а групповая не работает. 4 синусоиды одна отображает значение отдельного канала, ее значения видны и на тренде и в окне монитора регистров контроллера. 3 синусоиды аргументы канала CALL.ChGroupReq. на графике видны, монитор же показывает нули может я с типом аргументов что-то не так сделал?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Канал CALL.ChGroupReq в данном случае будет создаваться типа OUT. В топике http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/31/t/001318.html указано, что для реализации записи надо в атрибут ВХОД этого канала подавать 1. Запись будет осуществляться однократно для каждой каждой поданной "1".
Posted by merny (Участник № / Member № 2290) on :
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)
Posted by merny (Участник № / Member № 2290) on :
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".
все заработало, спасибо
Posted by Yurik. N. (Участник № / Member № 3294) on :
Добрый день! Просьба, по возможности, прислать пример групповой записи по протоколу modbus на адрес: xxx@yyy.ru Заранее большое спасибо!
[ 15.08.2014, 15:31: Сообщение отредактировал / Message edited by AdAstra Technical Support ]
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Пример отослан.
Posted by Berdiugin (Участник № / Member № 8483) on :
Здравствуйте. Прошу выслать пример группового чтения и записи по протоколу Modbus. Адрес электронной почты: xxx@yyy Заранее спасибо.
[ 15.09.2020, 11:46: Сообщение отредактировал / Message edited by АдАстра. Техподдержка ]
Posted by АдАстра. Техподдержка (Участник № / Member № 4) on :
Пример отослан.
Posted by Berdiugin (Участник № / Member № 8483) on :
Здравствуйте. Стоит задача записывать и отображать аварийные и предупредительные уставки. Запись осуществляется из нескольких мест: 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. После ввода в поле текст значения я нажимаю кнопку «Готово». Можно ли отследить момент нажатия этой кнопки?
Posted by АдАстра. Техподдержка (Участник № / Member № 4) on :
Вы правы, во множестве проектов возникает необходимость управления одним регистром из нескольких мест.
Однако, при попытке записи в один приемник информации из двух источников, всегда приводит к состязательности. Обычно, решается в пользу последней пришедшей информации (т.к. она затирает более раннюю информацию).
Рекомендуется эту задачу решать созданием последовательной цепочки. ПК с МРВ передается и получает данные с Панели Оператора из шкафа, Панель же передает и получает данные от ПЛК.
В этом случае избавляемся от состязательности и увеличиваем надежность системы.
1. Одним источником считываем информацию с ПЛК, другим - записываем. Рекомендуется написать программу в среде TRACE MODE, которая при заданных условиях будет обновлять значения аргументов канала Call ChGroupReq (на запись в ПЛК).
2. если аргумент экрана связан с числовым каналом, то по атрибуту 45,Т Время изменения.
Posted by Berdiugin (Участник № / Member № 8483) on :
Спасибо за ответ. 1. При выходе из строя панели оператора мы лишимся всех устройств управления, что явно не повысит надежность 2. Таких панелей оператора у меня 3, что при вашем подходе усложнит жизнь. Конфликта между панелями оператора у меня не возникает, поэтому у меня сложилось мнение что данный вопрос в TRACE MODE должен решаться сам собой.
Posted by АдАстра. Техподдержка (Участник № / Member № 4) on :
1. В АСУ ТП разделяют средний уровень АСУТП (Шкафы управления) и верхний (Автоматизированное Рабочее Место Оператора).
В надежной системе задачи и функции одного уровня не дублируются другим уровнем. Каждый выполняет свою задачу. При том, при возникновении проблем на одном уровне, все связанные с ним нижестоящие устройства должны продолжать выполнять свою задачу. Например, при выходе из строя АРМ в Операторской, Шкаф управления должен продолжать управлять устройствами. С другой стороны, если Шкаф Управления вышел из строя, то, при наличии, должен включится резерв Шкафа Управления.
2. Правильно разработанная АСУ упрощает жизнь Оператору. Конфликта между Панелями не возникло, так как они располагаются на одном уровне АСУТП. Достаточно добавить верхний уровень, который будет общаться с этими Панелями и задача решена.
Однако, если Вы настроены на "дублирование" функции Шкафа Управления, то Вы можете одним источником считывать данные с устройства, другим записывать, а самостоятельно разработанной программой что и когда делать с полученными данными. Чтение происходит с заданным периодом. Запись в момент изменения атрибута Входное Значение.
Posted by Berdiugin (Участник № / Member № 8483) on :
И если можно, еще один вопрос на эту тему. На форуме есть следующий пост "Если "ChGroupReq с параметром 0 направлением Output", то он будет отрабатывать только по принудительной команде, например, через передачу "1" в атрибут 39 (EXEC). Можно компонент W_Word(16)#3 задать с напривлением INPUT и соответствующий "ChGroupReq с параметром 0 направлением INPUT". Такой канал будет передавать любые изменения значений его аргументов." У меня работает групповая запись сразу всех аргументов ChGroupReq через передачу "1" в атрибут 39 (EXEC), но если я меняю направление на INPUT у W_Float(16) и у ChGroupReq данные записать не удается. Хотелось бы выполнять запись только измененного аргумента.
Posted by АдАстра. Техподдержка (Участник № / Member № 4) on :
Вы всегда можете задать интересующий Вас вопрос.
Для групповой записи по изменению одного аргумента необходимо использовать modbus-функцию 16. В настройках источника направление изменить с output на input. Аналогично в настройках канала Call.ChGroupReq. Типы аргументов канала Call.ChGroupReq установить в соответствии с типом данных в устройстве. (Справочная Система - Каналы и Системные переменные - Каналы класса Call - Канал класса Call.ChGroupReq - Привязка источника MODBUS чтения или записи)
Posted by Berdiugin (Участник № / Member № 8483) on :
Сделал согласно вашей подсказки. Имею следующее: При запуске профайлера на служебной панели МРВ в атрибуте №124 ArgSize канала Call.ChGroupReq есть все мои аргументы, причем они имеют значения которые я ввожу, но в ПЛК данные не передаются. Запись выделенного аргумента в ПЛК происходит только если я вручную нажму на кнопку с тремя точками на служебной панели МРВ. Как сделать чтобы запись происходила автоматически?
Posted by АдАстра. Техподдержка (Участник № / Member № 4) on :
Пришлите на адрес Службы технической Поддержки Ваш проект.
Описанных инструкций должно быть достаточно.
Posted by АдАстра. Техподдержка (Участник № / Member № 4) on :
У аргументов канала Call.ChGroupReq (канал с привязкой к источнику W_Float(16)) есть привязки к числовым каналам. Это мешает штатной работе.
Рекомендуется значения из числовых каналов передавать в аргументы канала Call.ChGroupReq с помощью канала Call.Move.