PDA

Просмотр полной версии : Программная реализация ModbusTCP Master



kantv
29.10.2015, 16:42
Добрый день.

Есть необходимость организовать взаимодействие ПЛК100 с ПК (собственная программа) по Modbus TCP, при этом ПЛК работает в режима Мастер (инициирует передачу данных). Знаю, что данную задачу можно решить с помощью конфигуратора ПЛК, но данный вариант меня не вполне устраивает, поскольку не дает полного контроля над процессом передачи (выбор момента начала передачи и контроль результатов передачи данных). Поэтому хотел бы реализовать работу ПЛК в режиме мастера ModbusTCP программно. Для RS485 я уже реализовывал такое взаимодействие используя библиотеки SysLibCom.lib и ModBus.lib. Изучая форум пришел к выводу, что для установления подключения по TCP роль роль библиотеки SysLibCom.lib будет выполнять SysLibSockets, но остается непонятным с помощью какой библиотеки реализовать протокол Modbus, поскольку функции в библиотеке ModBus.lib требуют в качестве параметра ComHandle, которого в случае TCP подключения не будет.

Собственно вопрос - Какими библиотеками можно программно (не через конфигуратор) реализовать работу ПЛК100 (Codesys 2.3) в режиме Мастер по протоколу ModbusTCP?
Хотелось бы конечно узнать не только названия самих библиотек, но и хотя бы в общих чертах последовательность использования функций для установки соединений и обмена (пример программы был бы наилучшим описанием :) )

murdemon
29.10.2015, 17:18
воспользуйся библиотекой OSCAT Network для Codesys 2 там уже все реализовано за нас но придется (корявые сокеты овеновские подправить чуть-чуть)

kantv
02.11.2015, 13:05
Спасибо за совет.
Библиотека помогла и все получилось. Могло бы получиться и легче и быстрее, если бы реализации функции SysSockConnect из библиотеки SysLibSockets.lib для Овен`овских контроллеров возвращала BOOL, как это ожидается в библиотеке OSCAT. В результате целый день был потрачен на поиск причины почему данные не передаются. Ошибка конечно известная и на данном форуме обсуждалась уже годы тому назад, но когда делаешь что-то в первый раз, то доверяешь документации и не ждешь подвоха.
На всякий случай, для тех кто еще может столкнуться с данной проблемой сообщаю:
Библиотека OSCAT использует функции из системной библиотеки SysLibSockets.lib в которой, в свою очередь, есть функция для установления TCP подключения SysSockConnect, которая по идее должна возвращать BOOL - TRUE если подключение установлено и FALSE если подключение не установлено. Так вот в контроллерах ОВЕН функция SysSockConnect возвращает не BOOL, а DINT, при этом признаком удачного подключения является возвращаемое значение больше -1 (то есть и 0 тоже), а -1 является признаком неудачного подключения. Такая не стыковка приводит к тому, что код из библиотеки OSCAT при проверке возвращаемого функцией SysSockConnect значения считает, что соединение никак не может состояться.
В результате пришлось в библиотеке OSCAT внести изменения в реазлизацию функциональных блоков IP_CONTROL и IP_CONTROL2 - заменить строки

IF SysSockConnect(socket, ADR(sockaddr), SIZEOF(sockaddr)) THEN
на

IF BOOL_TO_DINT(SysSockConnect(socket, ADR(sockaddr), SIZEOF(sockaddr))) > -1 THEN
На данный момент это все трудности с которыми пришлось столкнуться. Было бы неплохо узнать в каких еще функциях стандартных библиотек у Овена есть не стыковки, чтобы не тратить время на поиск системных ошибок.

Yegor
02.11.2015, 13:14
Было бы неплохо узнать в каких еще функциях стандартных библиотек у Овена есть не стыковкиВсё, что есть в SysLibCom (http://owen.ru/forum/showthread.php?t=16787&p=175848&viewfull=1#post175848).

murdemon
02.11.2015, 13:16
Да это нормально.. тот же ваго для своих ПЛК в разных моделях немного по разному с сокетами работает, да и PLCWinNT тоже.

Yegor
17.11.2015, 13:41
Где? Не вижу.