Цитата(Ivan_P @ 21.6.2019, 14:08)

Всем привет!
Возникла проблема с READ_VAR. Хочу считывать данные по modbus RTU на M241 (TM241CE40T) от устройства MK110 (ОВЕН).
Собрал прогу на CFC как по примеру в хэлпе, но там правда на FBD...
Нажмите для просмотра прикрепленного файлаПроблема заключается в том, что нужно запустить опрос и тут в проге получается запара. Для этого я форсом перевожу start в TRUE а потом снимаю форс и только тогда идёт опрос.
1. Подскажите, пожалуйста, как мне лучше подправить прогу? Может какой оборот ввести на проверку связи?
2. Я большую часть кода пишу в ST можно ли read_var написать в ST? Помогите с синтаксисом для ST.
3. С write_var я так понимаю такой же оборот получается судя по хэлпу? У меня правда выдаёт ошибку, но это скорее всего вызвано проблемой с устройством.
4. Для считывания данных с другого M241 тоже использовать READ_VAR или есть какие-нибудь драйвера?
5. И подскажите как писать адрес для Mobdus TCP устройств.
Заранее спасибо!
Ответил на другом форуме, продублирую и здесь.
Проблема в том, что вы в первом цикле пытаетесь запустить обмен, добавьте небольшую задержку. Т.е. TON таймер который скажем через 50-100мс будет устанавливать Bool переменную, а уже эта переменная через AND вместе с вашей start на вход 'Execute'.
Вызывать блок ADDM не нужно в каждом цикле, если вы не собираетесь формировать каждый раз строку адреса для нового устройства, это удобно когда у вас много однотипных устройств и вы создаете один алгоритм, привязываете к входам блоков массивы и меняя индекс опрашиваете разные устройства.
1. По поводу почему не идет обмен я уже написал, но я бы ещё добавил алгоритм обработки ошибок связи.
2. Используйте помощник ввода. В редакторе кода ST щелкните правой кнопки мыши по полю ввода кода, выберете Input Assistant.... найдите нужный блок или функцию и подтвердите ввод.
3. Не забывайте про особенность протокола Modbus, а главное про задержку между фреймами, по умолчанию в настройки протокола она установлена 10мс. Вам нужно добавить задержку между вызовами блоков Read и Write. Можно просто пропускать один цикл для вызова следующего ФБ, если время цикла больше или равно задержки между фреймами.
4. Можно по Modbus TCP(IOscanner или ФБ из PLCcommunication), можно по EthernetIP(на сайте SE есть EDS файлы контроллеров M2xx для импорта в SoMachine) и можно использовать метод глобальных сетевых переменных(network variablr list особенность Codesys), можете почитать в онлайн справке.
5. Есть описание в онлайн справке.
'<communication port number>{<IP address A.B.C.D>}<slave address>'
<communication port number> - для контроллеров M2xx встроенный Ethernet это номер 3.
<IP address A.B.C.D> - IP адрес опрашиваемого устройства. По моему в онлайн справке ошибка, должно быть так
<IP address A.B.C.D>:<port> - т.е. плюс порт, по умолчанию 502(можно не писать, если не отличается).
<slave address> - это для случая опроса через шлюз Modbus TCP<->Modbus RTU, указываете Modbus адрес устройства в сети RS485.(бывает что на ПЛК можно использовать несколько Modbus серверов с разными id, тогда тоже используется). Так же ПЧ Altivar 600/900 требую указанием правильного Id(248).
Пример: Опрос устройства с IP 192.168.1.10, строка '3{192.168.1.10}'.
Опрос устройства с IP 192.168.1.10(порт 552, id 240) строка '3{192.168.1.10:552}240'