Просмотр полной версии : Примеры по сокетам для ПЛК110/160 M02 и ПЛК1хх
Мастеренко Иван
05.03.2020, 13:37
Добрый день. Для контроллеров ПЛК110/160 M02 и ПЛК1хх подготовлены примеры передачи данных по сетевым протоколам TCP и UDP с помощью библиотеки SysLibSockets.lib (https://owen.ru/product/codesys_v2/libraries).
Библиотека SysLibSockets.lib содержит все необходимые функции для организации обмена на транспортном уровне. Контроллеры ПЛК110/160 M02 и ПЛК1хх имеют свои особенности при работе с библиотекой SysLibSockets.lib, которые описаны в документации CODESYS V2.3. Программная реализация обмена через сокеты (https://ftp.owen.ru/CoDeSys23/10_Sockets/CDSv2.3_Sockets_v1.0.pdf). В документации представлена совместимость функций, особенности работы для разных линеек контроллеров и описаны примеры в CODESYS.
Программы клиента и сервера для ПЛК110/160 M02 и ПЛК1хх:
● TCP ПЛК110/160 М02 (https://ftp.owen.ru/CoDeSys23/10_Sockets/TCP_PLC110_160m02.zip)
● TCP ПЛК1хх (https://ftp.owen.ru/CoDeSys23/10_Sockets/TCP_PLC1xx.zip)
● UDP ПЛК110/160 M02 (https://ftp.owen.ru/CoDeSys23/10_Sockets/UDP_PLC110_160m02.zip)
● UDP ПЛК1хх (https://ftp.owen.ru/CoDeSys23/10_Sockets/UDP_PLC1xx.zip)
Также подготовлен пример NTP клиента на базе примера UDP клиент для контроллеров ПЛК110/160 M02 – NTP_ClientPLC (https://ftp.owen.ru/CoDeSys23/10_Sockets/NTP_Client_PLC.zip).
Библиотека Modbus TCP (клиент/сервер) - Modbus_TCP (https://ftp.owen.ru/CoDeSys23/10_Sockets/modbus_tcp.zip) (бета-версия).
Для обмена по протоколу MQTT можно воспользоваться библиотекой (https://owen.ru/forum/showthread.php?t=20265&page=2&p=227644&viewfull=1#post227644) от пользователя Artshw. Пример обмена по протоколу MQTT – MQTT_OwenPLC (https://ftp.owen.ru/CoDeSys23/10_Sockets/MQTTOwenPLC_upd.zip).
Иван, добрый день!
Может и глуповатый вопрос, но все-таки. Хотел попробовать в учебных целях подключить МК210-302 к ПЛК110[M02] через библиотеку SysLibSocket. Что нужно для этого сделать? Или это вообще глупая затея?
Мастеренко Иван
04.04.2020, 13:02
Добрый! Затея хорошая. Нужно с транспортного уровня перейти на прикладной (modbus). Для этого необходимо правильно сформировать посылку серверу (мк210-302).
Такой пример уже обсуждался на форуме (https://owen.ru/forum/showthread.php?t=26318&page=4&p=291625&viewfull=1#post291625).
Иван, спасибо! Посмотрел, попробовал, но пока ничего не получается. На всякий случай шлю проект, может я чего-то накосячил? Забыл сказать. IP-адрес МК302 = 10.0.6.20, порт = 502, Modbus-адрес = 1. Последнее что мне удалось добиться - это то что на МК302 периодически подмигивает Eth1, а аварийный светодиод тоже горит, но подмигивает в противофазе Eth1
Иван, приветствую!
Я переделал программу на основе примера TcpClient_PLCm02.pro, связь пошла. Но есть несколько вопросов. Во-первых, я вижу, что переменная hClientSocket типа HANDLE постоянно увеличивается. Хоть она и имеет длину 32 бита и мне на столе ее хватит на очень долго, она когда-то закончится. А если это будет уже на объекте, что произойдет? Возможно я что-то делаю не так? А во-вторых, прошу Вас посмотреть, правильно ли я разделяю вызовы чтение и запись, чтобы они не мешали друг другу? По-моему, чтение-запись начали подтормаживать, но может это только кажется (я делал 2 варианта проекта). Ну и в-третьих. Сейчас я работаю с одним модулем МК210. А если понадобится работать с несколькими, то как разделять доступ к ним, чтобы они друг другу не мешали?
Проекты прикрепляю.
Во-первых, я вижу, что переменная hClientSocket типа HANDLE постоянно увеличивается.
возможно в проекте для примера использования предполагали одно, а в итоге поучилось не очень. Но раз переход идет в закрытие сокета, то ни чего особенно страшного, главное есть ограничение на одновременно открытые сокеты. А та счетчик не сможет перепониться, начнется с другой стороны диапазона чисел
Ну вот, что-то наваял. Теперь не перебираются постоянно хэндлы. Пожалуй, можно было и по-оптимальнее сделать, но не стал сильно переделывать программу, честно "стыренную" из примера :)
Если будет конструктивная критика - буду рад услышать.
Может маленько не в тему, поправьте если ошибся адресом.
Подскажите, пожалуйста, на PLCWinNT V2.4.7.42, том, что вместе с CDS 2.3 ставится, получится с сокетами поэкспериментировать?
Разобрался, всё работает...по крайней мере клиента из примеров со сторонним TCP-сервером связать удалось...только пример TCP клиента из шапки для ПЛК1хх ,на PLCWinNT, без исправлений не работает.
Евгений Кислов
09.09.2020, 06:27
пример TCP клиента из шапки для ПЛК1хх, кстати, "из коробки" не рабочий.
Вы его запускали именно на ПЛК1хх или на PLCWinNT?
Если на ПЛК1хх - на каком шаге возникли проблемы?
Вы его запускали именно на ПЛК1хх или на PLCWinNT?
Если на ПЛК1хх - на каком шаге возникли проблемы?
Запускал на PLCWinNT.
Проблема в примере для ПЛК1хх на шаге CLIENT_STATE_CONNECT с этим:
50989
С портом те же "грабли".
Евгений Кислов
09.09.2020, 07:54
Примеры предназначены для запуска именно на ПЛК Овен - на других платформах, естественно, будут свои нюансы.
Почему тогда с примерами для М02 (т.е. там, где используются функции SysSockHtons и SysSockHtonI) этой проблемы нет? Не понимаю какая взаимосвязь порядка передаваемых байт и конкретной платформы?
Пример здесь https://owen.ru/forum/showthread.php?t=29703&p=291852&viewfull=1#post291852 работает с виртуальным контроллером, овеновский плк работают не как все из-за неправильно понимания в свое время описания бибки
Евгений Кислов
09.09.2020, 09:26
Почему тогда с примерами для М02 (т.е. там, где используются функции SysSockHtons и SysSockHtonI) этой проблемы нет? Не понимаю какая взаимосвязь порядка передаваемых байт и конкретной платформы?
Потому что "примеры предназначены для запуска именно на ПЛК Овен".
Поэтому заявления типа "пример TCP клиента из шапки для ПЛК1хх, кстати, "из коробки" не рабочий." справедливо делать только в том случае, если вы запускаете его на ПЛК ОВЕН.
50990
Пример здесь https://owen.ru/forum/showthread.php?t=29703&p=291852&viewfull=1#post291852 работает с виртуальным контроллером, овеновский плк работают не как все из-за неправильно понимания в свое время описания бибки
capzap, спасибо за подсказку. Я это понял еще до того, как задал свои предыдущие вопросы, когда пробовал примеры обоих версий ПЛК и увидел, что один из примеров работает без исправлений, а второй нет. Честно говоря, я ждал подобный ответ от Евгения. Задал вопросы не с целью флуда, а чтобы в будущем, если кто-нибудь будет идти по тем же шагам, по которым сейчас иду я (с PLCWinNT), прочитав эти сообщения, понял в чем загвоздка.
Потому что "примеры предназначены для запуска именно на ПЛК Овен".
Поэтому заявления типа "пример TCP клиента из шапки для ПЛК1хх, кстати, "из коробки" не рабочий." справедливо делать только в том случае, если вы запускаете его на ПЛК ОВЕН.
50990
Евгений, спасибо за наводку по документации, но я имею привычку "сначала читать документацию, а потом уже ломать". Можно же было просто указать, например, что у линейки ПЛК1хх нестандартная реализация работы с сокетами, отличающаяся от других устройств, и ПЛК1хх сами переворачивают байты. Что в документации подобные моменты ни как не упоминаются, что в Ваших ответах, и информация типа "Функция не поддержана в линейке ПЛК1хх." не привносит никакой ясности.
Всем спасибо за помощь.
Евгений Кислов
09.09.2020, 10:08
и ПЛК1хх сами переворачивают байты.
Мы дополним информацию в описании, спасибо за замечание.
Upd. - документация дополнена.
День добрый.
Что-то я запутался с MQTT, если один топик читаем, и один публикуем, как в примере, вроде все понятно.
А если необходимо несколько топиков читать и писать, работает как-то непредсказуемо.
Пробовал и несколько экземпляров MQTT_Client вызывать, и один экземпляр последовательно с разными топиками в одном цикле ПЛК, и один экземпляр последовательно в разных циклах ПЛК.
Подскажите, как правильно организовать обмен?
В идеале, в виде примера хотя бы два топика на чтение и два на запись.
Хочу прикрутить MQTT на ПЛК-110-60 М02.
Мастеренко Иван
21.12.2020, 18:42
День добрый.
Что-то я запутался с MQTT, если один топик читаем, и один публикуем, как в примере, вроде все понятно.
А если необходимо несколько топиков читать и писать, работает как-то непредсказуемо.
Пробовал и несколько экземпляров MQTT_Client вызывать, и один экземпляр последовательно с разными топиками в одном цикле ПЛК, и один экземпляр последовательно в разных циклах ПЛК.
Подскажите, как правильно организовать обмен?
В идеале, в виде примера хотя бы два топика на чтение и два на запись.
Хочу прикрутить MQTT на ПЛК-110-60 М02.
Добрый день.
Обновил пример по MQTT и библиотеку MQTTOwenPlc_udp.lib: https://owen.ru/forum/showthread.php?t=32898&p=327664&viewfull=1#post327664
Публикация выполняется последовательно в два топика (по временному интервалу) и добавлены 2 топика подписчика.
Добрый день.
Обновил пример по MQTT и библиотеку MQTTOwenPlc_udp.lib: https://owen.ru/forum/showthread.php?t=32898&p=327664&viewfull=1#post327664
Публикация выполняется последовательно в два топика (по временному интервалу) и добавлены 2 топика подписчика.
День добрый.
Спасибо за пример.
Но по идее правильнее тогда
sPublic: ARRAY [0..1] OF STRING:='Test0', 'Test1';
Публиковать ведь нужно разные сообщения.
И дальше получается что данные с брокера, из топика на который подписаны, попадают по порядку сначала в asSubscriber[0], потом в asSubscriber[1] и так далее (если массивы расширить до большего числа элементов, то это более наглядно просматривается).
(*когда получаем сообщение от издателя xMess равна TRUE)
IF xMess THEN
iNumberSubTopic:=iNumberSubTopic+1;
xSub:=TRUE;
xMess:=FALSE;
END_IF
Но ведь при большом числе топиков, они не все обновляются по порядку, и соответственно в массив получения они будут попадать по порядку обновления а не по тем топикам где находятся.
получается что необходимо доработать библиотеку и внести на выход еще одну переменную, чтоб при получении понимать в какой топик пришло новое значение.
В общем, запутался еще больше. :D
-=Vovka=-
13.01.2021, 11:24
Программы клиента и сервера для ПЛК110/160 M02 и ПЛК1хх
TCP ПЛК110/160 М02
Вот смотрю в примере есть функция StopPrg, но она нигде в коде не вызывается, а по идее по таймеру должна вызываться?
Евгений Кислов
13.01.2021, 11:27
Вот смотрю в примере есть функция StopPrg, но она нигде в коде не вызывается, а по идее по таймеру должна вызываться?
Она вызывается по событию, см. документацию к примерам, п. 4.4:
https://ftp.owen.ru/CoDeSys23/10_Sockets/CDSv2.3_Sockets_v1.0.pdf
-=Vovka=-
22.01.2021, 09:22
Добрый день!
Ничего не получается с примерами! Не могу понять в чем причина
Выложите, пожалуйста, рабочий пример для ПЛК110-30 МО2 с кодом приема и отправки данных.
И какой программной под Windows 7 можно проверить обмен с ПЛК?
Евгений Кислов
22.01.2021, 09:34
Добрый день!
Ничего не получается с примерами! Не могу понять в чем причина
Выложите, пожалуйста, рабочий пример для ПЛК110-30 МО2 с кодом приема и отправки данных.
И какой программной под Windows 7 можно проверить обмен с ПЛК?
Добрый день.
Рабочие примеры выложены в первом сообщении.
Для проверки можно использовать, например, Hercules Setup Utility.
-=Vovka=-
22.01.2021, 09:51
Рабочие примеры выложены в первом сообщении.
Скачиваю TCP ПЛК110/160 М02 и открываю проект TcpServerPLCm02.pro:
53139
Евгений Кислов
22.01.2021, 09:53
Скачиваю TCP ПЛК110/160 М02 и открываю проект TcpServerPLCm02.pro:
53139
Ресурсы - Настройка целевой платформы - выберите нужный таргет-файл
-=Vovka=-
22.01.2021, 10:12
1. В PLC_PRG по какому событию отлавливать прием от клиента?
2. В Hercules после отправки сообщения клиенту зарывается соединение - так и должно быть? Т.е. обмен по принципу: Соединились - Обмен - Закрыли соединение ?
Евгений Кислов
22.01.2021, 10:17
1. В PLC_PRG по какому событию отлавливать прием от клиента?
2. В Hercules после отправки сообщения клиенту зарывается соединение - так и должно быть? Т.е. обмен по принципу: Соединились - Обмен - Закрыли соединение ?
1. В рамках примера это не реализовано (только если не контролировать изменение sReadFromClient), вы можете добавить собственный код для этого.
2. Да, сервер закрывает соединение в случае отсутствия запросов.
День добрый.
Спасибо за пример.
Но по идее правильнее тогда
sPublic: ARRAY [0..1] OF STRING:='Test0', 'Test1';
Публиковать ведь нужно разные сообщения.
И дальше получается что данные с брокера, из топика на который подписаны, попадают по порядку сначала в asSubscriber[0], потом в asSubscriber[1] и так далее (если массивы расширить до большего числа элементов, то это более наглядно просматривается).
(*когда получаем сообщение от издателя xMess равна TRUE)
IF xMess THEN
iNumberSubTopic:=iNumberSubTopic+1;
xSub:=TRUE;
xMess:=FALSE;
END_IF
Но ведь при большом числе топиков, они не все обновляются по порядку, и соответственно в массив получения они будут попадать по порядку обновления а не по тем топикам где находятся. Попробуйте расширить количество топиков хотя бы до 10.
получается что необходимо доработать библиотеку и внести на выход еще одну переменную, чтоб при получении понимать в какой топик пришло новое значение.
В общем, запутался еще больше.
Добрый день. Для контроллеров ПЛК110/160 M02 и ПЛК1хх подготовлены примеры передачи данных по сетевым протоколам TCP и UDP с помощью библиотеки SysLibSockets.lib (https://owen.ru/product/codesys_v2/libraries).
Библиотека SysLibSockets.lib содержит все необходимые функции для организации обмена на транспортном уровне. Контроллеры ПЛК110/160 M02 и ПЛК1хх имеют свои особенности при работе с библиотекой SysLibSockets.lib, которые описаны в документации CODESYS V2.3. Программная реализация обмена через сокеты (https://ftp.owen.ru/CoDeSys23/10_Sockets/CDSv2.3_Sockets_v1.0.pdf). В документации представлена совместимость функций, особенности работы для разных линеек контроллеров и описаны примеры в CODESYS.
Программы клиента и сервера для ПЛК110/160 M02 и ПЛК1хх:
● TCP ПЛК110/160 М02 (https://ftp.owen.ru/CoDeSys23/10_Sockets/TCP_PLC110_160m02.zip)
● TCP ПЛК1хх (https://ftp.owen.ru/CoDeSys23/10_Sockets/TCP_PLC1xx.zip)
● UDP ПЛК110/160 M02 (https://ftp.owen.ru/CoDeSys23/10_Sockets/UDP_PLC110_160m02.zip)
● UDP ПЛК1хх (https://ftp.owen.ru/CoDeSys23/10_Sockets/UDP_PLC1xx.zip)
Также подготовлен пример NTP клиента на базе примера UDP клиент для контроллеров ПЛК110/160 M02 – NTP_ClientPLC (https://ftp.owen.ru/CoDeSys23/10_Sockets/NTP_Client_PLC.zip).
Библиотека Modbus TCP (клиент/сервер) - Modbus_TCP (https://ftp.owen.ru/CoDeSys23/10_Sockets/modbus_tcp.zip) (бета-версия).
Для обмена по протоколу MQTT можно воспользоваться библиотекой (https://owen.ru/forum/showthread.php?t=20265&page=2&p=227644&viewfull=1#post227644) от пользователя Artshw. Пример обмена по протоколу MQTT – MQTT_OwenPLC (https://ftp.owen.ru/CoDeSys23/10_Sockets/MQTTOwenPLC_upd.zip).
Добрый день. Есть описание библиотеки modbus_tcp? Смогу я ей читать функцией 0x01, 0x02 по одной ячейки?
Добрый день.
Обновил пример по MQTT и библиотеку MQTTOwenPlc_udp.lib: https://owen.ru/forum/showthread.php?t=32898&p=327664&viewfull=1#post327664
Публикация выполняется последовательно в два топика (по временному интервалу) и добавлены 2 топика подписчика.
Добрый день.
В том примере что вы сделали, пишет в топики отлично. а вот при чтении данные попадают куда им хочется, совсем не в те топики куда должны.
Попробуйте растяните пример на большее количество топиков, и вы увидите.
-=Vovka=-
20.05.2021, 09:54
Добрый день!
Появилась такая проблема. Обмен работает какое-то время, но потом перестает!
Посмотрел, все крутится в цикле: SERVER_STATE_CREATE - SERVER_STATE_BIND - SERVER_STATE_CLOSE
Вот код:
CASE eState OF
SERVER_STATE_CREATE:
hServerSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP );
IF hServerSocket <> SOCKET_INVALID THEN
SysSockSetOption(hServerSocket, SOCKET_SOL, c_diSoNbio, ADR(diOption), SIZEOF(diOption) );
eState := SERVER_STATE_BIND;
ELSE
eState := SERVER_STATE_CLOSE;
END_IF
SERVER_STATE_BIND:
stServerSettings.sin_family := SOCKET_AF_INET;
stServerSettings.sin_addr := SysSockHtonl(SOCKET_INADDR_ANY);
stServerSettings.sin_port := SysSockHtons(wPort);
xBinded := SysSockBind(hServerSocket, ADR(stServerSettings), SIZEOF(stServerSettings) );
IF xBinded THEN eState := SERVER_STATE_LISTEN;
ELSE eState := SERVER_STATE_CLOSE;
END_IF
SERVER_STATE_LISTEN:
xListened := SysSockListen(hServerSocket, INT_TO_DINT(c_iMaxConnections) );
IF xListened THEN eState := SERVER_STATE_ACCEPT;
ELSE eState := SERVER_STATE_CLOSE;
END_IF
SERVER_STATE_CLOSE:
SysSockShutdown(hServerSocket, c_diHow);
SysSockClose(hServerSocket);
hServerSocket := SOCKET_INVALID;
eState := SERVER_STATE_CREATE;
-=Vovka=-
20.05.2021, 11:47
Мо2 ? На результаты сетопшина, бинда и листена можно покласть. Да и за раз сделать.
Да, МО2
Как сделать? Можно пример рабочего кода?
Товарищи форумчане, всем доброго времени суток.
Подскажите, пожалуйста, возможно ли каким-либо "волшебным" способом на ПЛК100 (сервер) определить IP-адрес подключившегося клиента?
SOCKADDRESS.sin_addr даже в процессе обмена данными равен нулю...
Вопрос так же относится и к представителям ОВЕН, потому как в том же PLCWinNT24 с этим проблем нет.
Задача организовать связь сервера с одним единственным клиентом, имеющим определенный IP-адрес.
Мастеренко Иван
25.10.2021, 14:33
Добрый день!
Появилась такая проблема. Обмен работает какое-то время, но потом перестает!
Посмотрел, все крутится в цикле: SERVER_STATE_CREATE - SERVER_STATE_BIND - SERVER_STATE_CLOSE
Вот код:
CASE eState OF
SERVER_STATE_CREATE:
hServerSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP );
IF hServerSocket <> SOCKET_INVALID THEN
SysSockSetOption(hServerSocket, SOCKET_SOL, c_diSoNbio, ADR(diOption), SIZEOF(diOption) );
eState := SERVER_STATE_BIND;
ELSE
eState := SERVER_STATE_CLOSE;
END_IF
SERVER_STATE_BIND:
stServerSettings.sin_family := SOCKET_AF_INET;
stServerSettings.sin_addr := SysSockHtonl(SOCKET_INADDR_ANY);
stServerSettings.sin_port := SysSockHtons(wPort);
xBinded := SysSockBind(hServerSocket, ADR(stServerSettings), SIZEOF(stServerSettings) );
IF xBinded THEN eState := SERVER_STATE_LISTEN;
ELSE eState := SERVER_STATE_CLOSE;
END_IF
SERVER_STATE_LISTEN:
xListened := SysSockListen(hServerSocket, INT_TO_DINT(c_iMaxConnections) );
IF xListened THEN eState := SERVER_STATE_ACCEPT;
ELSE eState := SERVER_STATE_CLOSE;
END_IF
SERVER_STATE_CLOSE:
SysSockShutdown(hServerSocket, c_diHow);
SysSockClose(hServerSocket);
hServerSocket := SOCKET_INVALID;
eState := SERVER_STATE_CREATE;
Добрый день.
Похоже на некорректное закрытие сокетов после сброса работы программы. Попробуйте привязать в системное событие "stop" закрытие сокетов. (стр. 30 https://ftp.owen.ru/CoDeSys23/10_Sockets/CDSv2.3_Sockets_v1.0.pdf )
Мастеренко Иван
26.10.2021, 16:54
Товарищи форумчане, всем доброго времени суток.
Подскажите, пожалуйста, возможно ли каким-либо "волшебным" способом на ПЛК100 (сервер) определить IP-адрес подключившегося клиента?
SOCKADDRESS.sin_addr даже в процессе обмена данными равен нулю...
Вопрос так же относится и к представителям ОВЕН, потому как в том же PLCWinNT24 с этим проблем нет.
Задача организовать связь сервера с одним единственным клиентом, имеющим определенный IP-адрес.
Добрый день!
Для старой линейки ПЛК1хх возможно только по протоколу UDP. IP-адрес клиента можно увидеть в sin_addr после выполнения функции SysSockRecvFrom.
Иван, спасибо за подсказку.
Bahtijaro
09.11.2021, 04:41
Добрый день.
Прошу подсказать.
Имеется ПЛК 110-30 [М].
Для считывания данных с другого устройства по modbus tcp в конфигураторе ПЛК в строке состояния ошибки пишет - ошибка 84.
Модбас сканом удается считать регистры другого устройства.
Делали пустой проект с одним соединением по modbus tcp, все равно пишет ошибка 84.
Прошивка контроллера сейчас стоит 0.3.67.
Какие предпринять шаги для устранения данной проблемы?
Может быть обновить прошивку ?
Если обновить прошивку, то возможен ли даунгрейд прошивки ?
Филоненко Владислав
09.11.2021, 11:37
84 - проблемы с сокетами (например они кончились)
Евгений Кислов
09.11.2021, 19:10
Добрый день.
Прошу подсказать.
Имеется ПЛК 110-30 [М].
Для считывания данных с другого устройства по modbus tcp в конфигураторе ПЛК в строке состояния ошибки пишет - ошибка 84.
Модбас сканом удается считать регистры другого устройства.
Делали пустой проект с одним соединением по modbus tcp, все равно пишет ошибка 84.
Прошивка контроллера сейчас стоит 0.3.67.
Какие предпринять шаги для устранения данной проблемы?
Может быть обновить прошивку ?
Если обновить прошивку, то возможен ли даунгрейд прошивки ?
Выложите ваш пустой проект с одним соединением, пожалуйста.
Филоненко Владислав
16.11.2021, 07:48
У человека пустой проект. Конфигурация. Кончились ? Отлично))
Если сделать проект где открывается сокет (но не закрывается по событию STOP), то через N перезаливок проекта они внезапно кончатся.
Спорягин Кирилл
06.01.2022, 13:56
День добрый, тех. поддержка.
Разбираю примеры с сокетами.
Вопрос в следующем.
Для проекта TCP сервера в конфигурации задач к событию "Стоп" привязана подпрограмма закрывающая сокеты. А для проекта TCP клиента нет никакой подпрограммы для закрытия сокетов в случае остановки ПЛК.
Это недосмотр авторов примеров или нужно закрывать только серверные сокеты по событию "Стоп"?
Спорягин Кирилл
06.01.2022, 14:19
И еще вопрос по клиентским сокетам.
Пусть я из ПЛК110 М02 хочу опрашивать модули серии Мх210 по протоколу Modbus TCP.
Мне для каждого модуля нужно создавать сокет?
Или можно открыть один сокет и при опросе очередного модуля "соединяться" с ним с помощью функции SysSockConnect?
Alex42630
03.06.2022, 19:30
Добрый день. Помогите разобраться в подключении к плк160 (м2) мк110-8д.4р в конфигураторе ПЛК.
Помогите разобраться в подключении к плк160 (м2) мк110-8д.4р в конфигураторе ПЛК.
А для чего во вложении пустой, без конфигурации, да ещё и запароленный проект? :confused:
Alex42630
04.06.2022, 21:32
Извиняюсь. Исправил.
kondor3000
05.06.2022, 01:17
Добрый день. Помогите разобраться в подключении к плк160 (м2) мк110-8д.4р в конфигураторе ПЛК.
Так у вас всё правильно с подключением блоков, только непонятно почему ASCII использовано, а не RTU.
А саму программу лучше разбить на части, например ФБ ( функц. блоки), настраивать и проверять частями будет удобней.
Alex42630
05.06.2022, 13:58
Программа ошибок не выдает, но я не вижу подключения блоков расширения. Сам ПЛК работает нормально.
Вот:
только непонятно почему ASCII использовано, а не RTU.
Настройки самих модулей где ?
Минцикл = 10, накой ?
Max timeout = 150, накой ?
Work mode = both, накой ?
Polling time = 100, накой ?
го я не вижу подключения блоков расширения.
Вы видите сетевой обмен без очков ?
Для квадратиков : порядок по потоку
ps
тема - не здесь
kondor3000
05.06.2022, 23:28
Вот:
Work mode = both, накой ?
Для модулей МК110-8д.4р нужен именно режим Both, для одновременного опроса дискретных входов и записи выходов ( и чтобы не разносить по разным UMD). Очевидно вы никогда эти блоки не использовали. Все настройки в конфиге рабочие.
Вопрос только в настройке самих модулей.
.. вы никогда эти блоки не использовали..
Зачем ? МДВВ до сих пор пашут. Это другое ? ))
.. Все настройки в конфиге рабочие...
А кто спорит ? "Кому и кобыла - невеста" (С)
Для модулей МК110-8д.4р нужен именно режим Both,
Вот обьясните - накой конкретно здесь для both 100мc ?
и чтобы не разносить по разным UMD..
Именно для этих модуля (in/out) - разносить. Pool time для in-части, by change для out-части.
Both ("по изменению но не режe") оптимален для чистых out-модулей. Причем можно и несколько секунд ставить (соотнести с t.out на той стороне) Не, если устраивает порожняк в виде poll-отправки без изменения (а здесь - 3 раза) - то удачи.
Очевидно вы никогда ...
.. не юзали десятка-другого модулей на 1-й линии с задачей не допустить "а чо это - жму кнопу, а свет не сразу включается" или с ситуацией где индивидуальное рандомное возникновение/пропадание модулей из сети - штатная задача.
ps
Ну и опять - к сокетам все это никак ))
Alex42630
06.06.2022, 09:05
Спасибо. Поменял на RTU.
Alex42630
06.06.2022, 09:08
Добрый день. Я в этом чайник. Если Вам не сложно подправьте прогу как считаете нужно. Спасибо.
kondor3000
06.06.2022, 15:58
Добрый день. Я в этом чайник. Если Вам не сложно подправьте прогу как считаете нужно. Спасибо.
Написал же работать должно, а если не работает, выкладывайте скрины конфигурации и пишите, что конкретно. Так же просили выложить скрины настройки модулей.
Модули после прошивки перезагрузить по питанию.
Надеюсь залить в ПЛК и старт программы не забываете включить?
Alex42630
06.06.2022, 20:45
Добрый вечер. Спасибо что откликнулись. Можете разъяснить, что Вы имеете ввиду настройка модулей, прошивка модулей, где об этом можно прочитать. По поводу заливки в ПЛК и старт- все понятно, делалось.
kondor3000
07.06.2022, 00:11
Добрый вечер. Спасибо что откликнулись. Можете разъяснить, что Вы имеете ввиду настройка модулей, прошивка модулей, где об этом можно прочитать. По поводу заливки в ПЛК и старт- все понятно, делалось.
У вас модули в программе с адресами 30,31 и 32, вы их запрограммировали через Конфигуратор M110 ?
Скорость 115200 тоже надо запрограммировать в модули
( по умолчанию скорость 9600 и адрес 16 на всех модулях с завода)
Конфигуратор Мх110 здесь в "Документации и ПО" https://owen.ru/product/moduli_diskretnogo_vvoda_vivoda_s_interfejsom_rs_4 85/documentation_and_software
Видео по подключению модулей https://www.youtube.com/watch?v=hOhLY8GVbMo
Советую посмотреть все видео их штук 15
Александр_76
13.07.2022, 14:50
Добрый день. Помогите пожалуйста разобраться, почему не запускается пример tcp client на плк 110-24.32.p-l. Код в примере не изменял, поставил только свой ip адрес (на плк 10.0.6.10 на компьютере 10.0.6.5). Запускаю кодесис, подключаюсь онлайн, записываю проект в плк, на ПК запускаю Геркулес в режиме tcp server, порт 502. Из кодесис по шагам прогоняю программу, дохожу до отправки сообщения и в переменной diSendBytes=-1. Дальше сокет закрывается. Никакой отправки не происходит, и подключения похоже тоже, так как Геркулес вообще не реагирует никак. В переменной eStatus=IP_ERR_PIPE ругается на сокет.
Второй пример tcp server работает.
Александр, во-первых, в таких случаях желательно проект или листинг кода прикладывать, а во-вторых, если мне память не изменяет, то в примерах клиента не подразумевается непрерывный обмен данными, а лишь разовый запрос - ответ, хотя у Вас и это не работает. Вообще, программные сокеты у ОВЕН'а еще тот "квест" (и их реализация, в виде соответствующей библиотеки, на ПЛК лично меня не совсем устраивает), в свое время пришлось информацию по крупицам по всему форуму собирать, но "кто ищет, тот всегда найдет"...
Александр_76
14.07.2022, 09:54
Spawn, проект взят из шапки темы, без изменений, ну кроме ip адреса. Все делал по инструкции. И, что самое интересное, tcp server работает в связке ПЛК-геркулес (на ПК), а вот клиент никак не запускается. Пробовал на двух ПК запускать кодесис в режиме эмуляции, как будто два плк, на одном клиента, а на другом сервер, безрезультатно. Да и ошибка IP_ERR_PIPE говорит о том, что сокет не открылся, поэтому и Геркулес не видит плк и соответственно обмен не идёт.
Мастеренко Иван
14.07.2022, 11:19
Spawn, проект взят из шапки темы, без изменений, ну кроме ip адреса. Все делал по инструкции. И, что самое интересное, tcp server работает в связке ПЛК-геркулес (на ПК), а вот клиент никак не запускается. Пробовал на двух ПК запускать кодесис в режиме эмуляции, как будто два плк, на одном клиента, а на другом сервер, безрезультатно. Да и ошибка IP_ERR_PIPE говорит о том, что сокет не открылся, поэтому и Геркулес не видит плк и соответственно обмен не идёт.
В эмуляции работать не будут примеры. Если вы загрузили проект, потом отключились изменили ip-адрес в переменных инициализации, и заново подключились, то новые значения не применятся, нужно сделать Сброс холодный. Если значения переменных правильные и всё равно не работает, то предоставьте удаленный доступ (в личку, скайп, на почту).
Александр_76
14.07.2022, 15:52
Иван, здравствуйте.
Я ещё раз попытаюсь описать весь процесс получения.
1. Скачиваю проект с форума и открываю в кодесис (все библиотеки и таргет файлы заранее установлены).
2. Подключаю плк к ПК через ethernet, настраиваю подключение: ip:10.0.6.5, mask: 255.255.0.0 (на плк заранее прописаны: ip:10.0.6.10, mask: 255.255.0.0, getway: 10.0.6.10).
3. В коде программы меняю переменную sIpv4 на 10.0.6.5.
4. Подключаюсь онлайн в кодесис в плк, проект загружается в контроллер.
5. На ПК запускаю программу Геркулес, tcp server, меняю порт на 502, запускаю (listen).
6. В кодесис нажимаю F5 (start), открываю визуализацию, в строке "отправляемое сообщение" пишу hello и нажимаю кнопку отправить.
Подскажите пожалуйста, ведь таким образом пример должен работать? В Геркулес должна прийти отправляемая строка? Или я что-то делаю не так?
Мастеренко Иван
14.07.2022, 16:36
Или я что-то делаю не так?
Все верно написано. Только наверно, gate ПЛК: 10.0.6.1.
Проверьте не блокирует ли пк посылки, брандмауэр, например. Или попробуйте увеличить tSendServer до 10 мс или измените порт (может что-то блочит 502 порт).
Проверил у себя по вашим пунктам (ПЛК110 М02, прошивка 1.2.42) - всё работает.
Александр_76
15.07.2022, 17:04
Все верно написано. Только наверно, gate ПЛК: 10.0.6.1.
Проверьте не блокирует ли пк посылки, брандмауэр, например. Или попробуйте увеличить tSendServer до 10 мс или измените порт (может что-то блочит 502 порт).
Проверил у себя по вашим пунктам (ПЛК110 М02, прошивка 1.2.42) - всё работает.
Иван, большое Вам спасибо!!!
Брандмауэр блокировал работу Геркулес, поэтому и не шел обмен. Поправил настройки брендмауэра и все заработало.
Александр_76
08.12.2022, 18:18
Иван, добрый вечер.
Нужна Ваша помощь.
Программа на ПЛК написана с использованием примера из этой темы (почти ничего не редактировал, добавил несколько переменных). ПЛК общается с сервером, передавая шестизначное число в формате STRING, принимает от сервера ответ в формате STRING (принимает 0 или 1).
Программа успешно работает несколько часов (то 2, то 4), но спустя время ПЛК начинает дописывать в переменную sReadFromServer букву я (WireShark четко показывает, что сервер передал '1', а в ПЛК отображается '1я'). Помогает только перезагрузка ПЛК, после которой этот дефект пропадает.
Если пробовать обрезать переменную функцией DELETE, то это помогает убрать лишнюю букву. Но, как только делаю проект загрузочным и перезагружаю ПЛК, то в переменной sReadFromServer при обмене передается 1, а после функции DELETE проскакивают числа (ip адрес сервера, к которому обращается ПЛК).:confused:
Что это может быть? В какую сторону смотреть?
Работу сервера проверили, программа WireShark показывает, что ничего лишнего не передается. Откуда ПЛК вообще берет лишнюю информацию и почему она появляется в переменной sReadFromServer???
64424
Мастеренко Иван
09.12.2022, 11:26
Здравствуйте!
Очищать переменную типа string следует через функцию SysMemSet() из библиотеки SysLibMem.lib
SysMemSet(ADR(sReadFromServer), 0, SIZEOF(sReadFromServer) );
64444
Александр_76
10.12.2022, 10:36
Иван, спасибо, попробую.
Сейчас я это делаю так: sReadFromServer:='';
Переменная обнуляется, все работает, но через несколько часов выскакивают лишние символы.
Посмотрим, сработает ли ваш вариант.
Всем доброго дня!
У меня такой вопрос, есть owen ПЛК110-30, программа написана на функциональных блоках, работаем с ним по TCP отправляя регистры
Сама программа отрабатывает претензий к ней нет, но эпизодически при переподключении не можем подключиться к контроллеру.
почитав документацию выяснилось что есть ограничение по количеству созданных сокетов, а проверка их если и есть, то она по таймингам совсем не вписывается.
Собственно вопрос: есть ли возможно пример или сможете подсказать как осуществлять контроль за неиспользуемыми сокетами, в проекте который написан на ФБ.
возможно есть какая-то возможность получить список открытых сокетов, пробежаться по ним и закрыть неактивные, или что то в таком духе
я видел пример клиент\сервер, но если честно не могу сообразить как его применить в текущей программе
Вероятно мой вопрос останется без ответа или возможно меня закидют гневными словами типа учи мат часть, но так вышло что это совсем не моя тема и от связи с контроллером зависит стабильность работы приложения. Очень надеюсь на хоть какю-то помощь.
Филоненко Владислав
22.01.2023, 17:19
В ПЛК программист должен полностью контролировать использование ресурсов - и если Вы открываете сокет - то и должны его закрыть для переиспользования
Коллеги, добрый день. Делаю попытки оживить пример UDP клиента. Платформа - ПЛК110-60М (старый, не М02). Сеть состоит из ПЛК и ноутбука, на котором Codesys и прочее необходимое. В качестве сервера, с которым связывается UDP клиент, выступает самописная серверная программа, которая при каждой прилетевшей посылке отправляет обратно коротенький ответ. Процесс контролирую в WireShark. Наступаю на грабли в двух местах. Первые: при однократном нажатии на кнопку в визуализации, происходит отправка нескольких посылок (от 2 до 4). Вторые: ответы от сервера не принимаются. Сервер в ответ на каждую принятую посылку отправляет ответ, но клиент ничего не принимает.
Подскажите, куда копать дальше.
ЗЫ. Пример UDP сервера работает в паре с примерно таким же самописным клиентом, данные передаются и принимаются нормально.
Могу посоветовать следующее:
1) После отправки пакета блокировать отправку следующего, пока кнопка не будет отпущена (только по фронту).
2) Проверить куда отправляет ответ сервер (IP и порт клиента). Проверить алгоритм, чтобы проверка на входящий пакет производилась на каждом цикле.
С кнопкой проверю. Сервер отправляет на IP контроллера, на тот порт, с которого пришло сообщение.
Проверил версию с кнопкой. Всё без изменений. при МинВЦ=0 пролетает 4 запроса, при 1 мс - три запроса, при 50мс- 2 запроса.
Назаров Александр
28.07.2023, 14:01
Добрый день коллеги! ПЛК110-30М2. Пробую запустить экземпляр modbus servera. Клиентом является Лектус. Связи не наблюдаю. Не силен в протоколах. Что не так?
Лог после запуска в студию.
Назаров Александр
29.07.2023, 11:16
А по 651 норм ?
MB от конфигуратора работает
kondor3000
29.07.2023, 11:34
Тогда выкладывайте modbus_tcp.lib. Какие еще варианты ?
На первой странице этой темы выложен.
.. и забудте про эти таски, пока не разберетесь с стандартой работой
На первой странице этой темы выложен.
ну вот и пусть TC выкладывет что со state/error и в динамике. Кому это надо-то ?
Назаров Александр
29.07.2023, 19:09
Один раз, не знаю с чего, заработало соединение и данные пошли. От чего так произошло не знаю. По трассировке в шаге state = 1; BindSock= false; и все по кругу.
Назаров Александр
29.07.2023, 19:34
Один раз, не знаю с чего, заработало соединение и данные пошли. От чего так произошло не знаю. По трассировке в шаге state = 1; BindSock= false; и все по кругу.
Назаров Александр
31.07.2023, 15:31
Выяснил, что:
1. ФБ Modbus TCP Server работает только после перезагрузки ПЛК по питанию. Никакие программные сбросы через CDS не помогают.
2. Чтобы ФБ перешел в режим обмена (state = 3) надо перезапустить клиент (в моем случае Лектус). Работающий Лектус без рестарта не видится как клиент для сервера.
3. Если что-то поменять в программе и переподключиться к ПЛК связь обрывается, до перезагрузки ПЛК.
Кто нибудь это может пояснить, и как с этим бороться?
PS. Судя по постам специалистов Овен это вообще не интересует.
Назаров Александр
01.08.2023, 14:52
Проблема не рассосалась. Программа стартует только после подключения питания или резета. В случае подгрузки кода или программного сброса закрывает и открывает сокеты, но без вязки с IP адресом.
Господа от ОВЕНА что не так? Официального, кроме конфигуратора, MB TCP не существует и не стоит надеяться. Нет контроллеров нет проблем?
Назаров Александр
04.08.2023, 20:42
Написал в поддержку. Дали вразумительный ответ. Все причастным Спасибо!
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot