PDA

Просмотр полной версии : Поддержка Modbus TCP



Солнечный заяц
07.07.2011, 13:08
С удивлением и сожалением не обнаружил поддержки Modbus TCP в выложенных библиотеках. Может быть есть какие нибудь сырые образцы, или хотя бы библиотека работы с ethernet портом?.. Или я не там ищу?

UPD:
Может быть есть возможность произвести импорт библиотеки из CoDeSys v2?

Евгений Сергеевич
07.07.2011, 15:39
для работы с ethernet есть библиотека SysSocket.

для работы с ModBus TCP можно использовать стандартные средства:
device/add device/ ethernet
ethernet/ add device / ModBus TCP master

capzap
07.07.2011, 17:45
http://oscat.de/files/oscat_basic_331_codesys3.library может здесь что то можно найти

Солнечный заяц
08.07.2011, 12:07
2capzap
Это стандартная библиотека Codesysv3 или одна из ее версий.

2Евгений Сергеевич
Пробую разобраться с Modbus TCP Slave. Настроил на ПЛК110 Modbus TCP Master. Параметр Losterror==0, значит запись и чтение производится нормально, но видать не в те регистры. В справке к Codesysv3 написано про Modbus TCP Slave:
ID входных параметров начинаются с 1000 (таким образом, второй входной параметр “I1” будет иметь ID 1001), ID выходных параметров начинаются с 2000
Делаю все как написано, но результата нет.
На сколько я понял Unit ID в Codesysv3 соответствует ModuleSlaveAddress в Codesysv2

На всякий случай прикладываю проекты.

П.С.
Про Modbus TCP Master в Codesysv3 я вообще молчу. Даже в справке про него ничего не нашел...

Евгений Сергеевич
08.07.2011, 16:10
Режим ПЛК-мастер работает. пример в приложении.
А вот со slave режимом сейчас будем разбираться.

Солнечный заяц
11.07.2011, 16:07
2Евгений Сергеевич
1.Спасибо за пример. Очень помогло с Modbus TCP Master в Codesysv3.
Хотелось бы отметить что чтение регистров не происходит, если они не используются в тексте программы. Уверен что не все пользователи это знают.

2.Столкнулся еще с одной неприятной особенностью: при обрыве соединения (передергивание интерфейсного кабеля, обновление программы на ведомом контроллере) и его последующем восстановлении обмен не возобновляется. Выдается ошибка (см. вложение) и перезапустить обмен можно только сделав Online -> Reset Warm. Может есть какие нибудь программные способы перезапуска обмена, или особые настройки?

3.Удалось разобраться с адресацией в Modbus TCP Slave в Codesysv3: входные регистры начинаются с нуля. А вот с адресацией выходных разобраться не удалось. Пробовал использовать адреса: последний_входной+1, 10х1000, 10х2000, 0х1000, 0х2000.

Солнечный заяц
18.07.2011, 09:29
Еще одна неприятная ситуация:
При настройке СПК207 как мастера сети и создания визуализации происходит прекращение обмена после нескольких секунд работы. Долго разбирался в чем дело - нашел: Увеличил время цикла СПК207 до 100мс.

Как восстанавливать обмен после обрыва соединения так и не придумал. Нет ли возможности производить программную перезагрузку CoDeSys, без перезагрузки СПК207 (для сокращения времени перезагрузки и самостоятельного восстановления канала связи).

Евгений Сергеевич
18.07.2011, 12:45
по поводу ModBus TCP сейчас работаем.

Евгений Сергеевич
19.07.2011, 11:37
1) в приложение пример (использованы ПЛК 304 и Win v3)
2) (режим slave)адреса регистров входов и выходов одинаковые но относятся к разным областям памяти:
есть переменная на запись "А" с адресом 0
есть переменная на чтение "В" также с адресом 0

функция чтения 03 обратится к переменной А
функция чтения 04 обратится к переменной В

3) Так же в примере есть блок возобновления связи (в программе для Win v3)

Солнечный заяц
20.07.2011, 10:16
2Евгений Сергеевич
Что-то у меня не выходит. Возможно из-за того что я объявил Modbus_TCP_Master_Instance и Modbus_TCP_Slave_Instance как глобальные переменные каталога Application. Кажется Вы объявили их как-то по-другому. Но я не понял как.

Sergey_Byk
20.07.2011, 13:28
Присоединяюсь к вопросу!!! В проекте с ПЛК308+Modbus_Slave всего две глобальные переменные. Опрашиваю их по ModbusTCP. Через некоторое неопределенное время обмен прекращается (появляется такой же треугольник как на вышепреведенных картинках), но сама программа продолжает выполняться. Как быть? Вся надежда только на доблестную поддержку отечественного производителя!

Солнечный заяц
20.07.2011, 13:36
Попробуйте увеличить время цикла. Мне помогло увеличение до 100 мс.

Евгений Сергеевич
20.07.2011, 16:24
как возобновлять связь показано в выложенном ранее примере

var
ModBusTimer: Ton;
end_Var

ModBusTimer(IN := Modbus_TCP_Slave_Instance.xError, PT := T#10S);
IF ModBusTimer.Q THEN
Modbus_TCP_Master_Instance.CheckSlaveConnect();
Modbus_TCP_Slave_Instance.Reconnect();
END_IF

To Солнечный заяц
кстати он у вас заработал, пример в смысле?

Modbus_TCP_Slave_Instance добавлять не надо, эта переменная сама добавится при создание подключения.

А чтобы данные все время получать и не привязывать к переменным надо на вкладке ModBus **** mapping установить галочку "Always update variables"

Солнечный заяц
20.07.2011, 16:58
Добавил в свой проект подпрограмму для восстановления соединения из Вашего примера, но компилятор считает методы Modbus_TCP_Master_Instance и Modbus_TCP_Slave_Instance как переменные и ругается что они не определены.

Если их определить как глобальные - компилятор не ругается, но и соединение не восстанавливается...

Помнится что в первых моих вариантах программы он не ругался при компиляции, а только при попытке загрузки программы в контроллер, или возможно я путаю.

Sergey_Byk
21.07.2011, 07:08
Как возобновлять связь в выложенном примере не работает для ПЛК308. Ошибки аналогичны: Modbus_TCP_Slave_Instance - не известен.

Евгений Сергеевич
21.07.2011, 12:30
Какая у вас версия кодесис? (у меня CoDeSys v3.4 SP2 Hotfix1)
потому что у меня работает и на СПК207 и на ПЛК308.

Sergey_Byk
21.07.2011, 13:28
Версия CoDeSys v3.4 SP2 Hotfix1.
4441

Евгений Сергеевич
21.07.2011, 13:39
То Sergey_Byk
восстановление связи необходимо только если у вас ПЛК работает в режиме Master.

Sergey_Byk
21.07.2011, 14:18
Ну тогда что делать если обмен прекращается в режиме слейв?

Евгений Сергеевич
21.07.2011, 15:37
трясти мастера: это его задача следить за коннектом и возобновлять его если отвалится.

Sergey_Byk
22.07.2011, 06:24
ПЛК308 подключен как ModbusTCP_Slave к компьютеру. В проекте всего две глобальные переменные. Через неопределенное время связь с контроллером по ModbusTCP прекращается, но в кодесис видно, что контроллер работает. Возобновить связь можно только сделав RESET WARM или перезагрузив контроллер. Как исправить?
4446

Sergey_Byk
22.07.2011, 06:59
Какого мастера трясти если на Slave значек с
4447
преобразуется в
4448
???

Солнечный заяц
22.07.2011, 08:59
Разобрался что у меня происходит: Дело в том что я изменил стандартные имена модулей мастера и слейва. Поэтому и программа должна выглядеть подругому (см. вложение). И по этой же причине компилятор требовал объявления методов.

2Sergey_Byk
Какая именно ошибка в слейве? Откройте модуль с ошибкой, там она должна быть описана.

Sergey_Byk
22.07.2011, 11:14
The bus is not running. The show values are perhaps not actual.

Sergey_Byk
22.07.2011, 12:19
Господа техподдержка!!! Обрадуйте чем-нибудь!!! Связь прекращается что при подключении через заводскую сеть, что через кросс!!!
И раз так получилось, будте так сказочно любезны сделать пример программирования сокетов для Codesys v3, а то v2, для которой выложен пример WEB-сервера взять негде.

Евгений Сергеевич
22.07.2011, 14:07
То Sergey_Byk
у вас в системе присутствует мастер? кто опрашивает ваш ПЛК? и как он реагирует на "умирание" слейва

Евгений Сергеевич
22.07.2011, 14:09
Во вложение видео и пример с рабочим слейвом на ПЛК308, в качестве мастера выступает Win PLC v3

Sergey_Byk
25.07.2011, 07:23
Все равно связь через неопределенное время пропадает!!! Появляется вот такой значек
4457.
В качестве клиентов выступает
1)TraceMode 6.07.7
2)Самописная программа.
В обоих случаях результат одинаков: с клиетами связь прекращается, но кодесис переменные отображает. В TaskConfiguration/Monitor время цикла уменьшается с 1000-1500 us до 300us.

Sergey_Byk
25.07.2011, 11:59
Ёмаё. МодбусТСП_Славе виснет даже если соединить контроллер с компьютером по кросс-кабелю и при этом не запускать никакого опроса( кроме кодесис)!!! Может заткнуться или через несколько минут или часов.

Sergey_Byk
25.07.2011, 14:55
Абсолютно то же самое происходит и с выложенным ModBus TCP Slave.zip проектом.

Евгений Сергеевич
25.07.2011, 17:39
ModBusTcp master на ПЛК3хх не поддержан.
ModBusTcp slave на ПЛК3хх работает в демо режиме (пол часа).
Сейчас мы работаем над устранением этой проблемы.
Извините за доставленные неудобства.

Sergey_Byk
26.07.2011, 06:34
Евгений Сереич, Вы (именно Вы) второй раз лопухнулись, причем оба два раза конкретно. Но раз вы спустились с небес до проблем, с которыми сталкиваются простые смертные при эксплуатации вашей продукции, то относительно ПЛК30х:
- допилите наконец библиотеку MODBUS RTU/ASCII до нормального состояния, почитав хотябы на википедии как оно должно работать на самом деле, а не как кажется Вам;
- при установке времени цикла 20 ms, время цикла совсем не 20ms. Чтобы получить цикл менее 20 ms необходимо выставлять меньшие интервалы.
Относительно остального:
- конфигураторы всего и вся весьма убоги. Создается впечатление что их делал либо студент-пофигист, либо пенсионер. Почему в них нельзя работать с несколькими приборами одновременно? Почему при использовании протокола модбас необходимо извращаться с адресами? Почему не реализуются элементарные функции copy/paste(это про ИП320).
Относительно качества продукции:
- у двух из семи полученных ТРН200 не работали вторые каналы, у одного из этих RS485.
- при покупке Вашей продукции продавец не рекомендовал ее к использованию аргументировав это негативными отзывами предыдущих клиентов: она тормознутая - подтверждено кривой библиотекой модбас, и глючная - подтверждено вашим последним сообщением.
А вообще с Вас пиво за потеряное время и переживания.

Солнечный заяц
28.07.2011, 18:45
СПК207+3хПЛК110. СПК207 Мастер сети ModbusTCP: принимает и передает около 200 регистров. Но почему-то принимаются и передаются не все (но всегда одни и те же). Пробовал увеличивать время цикла СПК - это проблему не решило. Может есть еще какие настройки? Пока еще не разобрался, по какому принципу располагаются непередающиеся/нечитаемые регистры, но часть из них в конце одного из листов.
Подскажите, в какую сторону копать?

Евгений Сергеевич
29.07.2011, 09:50
Возможно стоит увеличить время опроса каждого параметра. по умолчанию это время составляет 100мс. Задается при добавление канала опроса.

Солнечный заяц
29.07.2011, 11:13
Происходит непонятное смещение регистров (см. вложения). На ПЛК110 нет возможности настраивать номера регистров Слейва, поэтому они длжны идти последовательно. На СПК тоже, для чтения используется один к***** и соответственно регистры тоже должны идти последовательно... Но данные как-то перепрыгивают через один регистр :confused:

Евгений Сергеевич
29.07.2011, 11:37
можете выложить сами проекты? так тяжело что либо сказать

Солнечный заяц
29.07.2011, 12:18
В CoDeSys v3 сделаю .projectarchive
В CoDeSys v2 достаточно будет экспортного файла всего проекта, или нужно еще добавлять библиотеки?

Напомните пожалуйста свой е-мейл.

Евгений Сергеевич
29.07.2011, 14:10
посмотрите личные сообщения

Евгений Сергеевич
01.08.2011, 17:03
to Солнечный заяц
это связано с выравниванием в области памяти ввода вывода контроллера (документ "PLC configuration" с 51. пункт 3.1.4.1) переменные типа флоат должны стоять с адресами регистров кратными 2 (т.е. четными), а в вашем примере получаются оба раза с нечетными. чтобы выравнять вставляется незаполненный регистр с нулевым значением.
P.S.
А пример у вас красивый.

Солнечный заяц
01.08.2011, 17:11
Проблема со смещением решена. Она возникала в группе из 4-х переменных типа DWORD (8 регистров). Данные в codesys3 принимались со сдвигом вниз на один регистр.
- Сначала я попробовал заменить в codesys2 первый из регистров DWORD на WORD, таким образом сместить регистры вверх и компенсировать сдвиг вниз в codesys3. Но при проверке оказалось что сдвиг вниз в codesys3 исчез. В результате в codesys3 данные уже смещались вверх.
- Тогда я сделал по-другому, заменил первую переменную DWORD на 2-е WORD. Но снова получил сдвиг вниз...
- Только замена всех 4-х переменных DWORD на 8 переменных WORD решило проблему.

Такое ощущение что происходило какое-то выравнивание или переключение между банками данных.

Филоненко Владислав
04.08.2011, 12:45
Правильные (достаточно большие) таймауты ожидания ответа - и наступает счастье, данные не сдвигаются.

Филоненко Владислав
04.08.2011, 12:47
Евгений Сереич, Вы (именно Вы) второй раз лопухнулись, причем оба два раза конкретно. Но раз вы спустились с небес до проблем, с которыми сталкиваются простые смертные при эксплуатации вашей продукции, то относительно ПЛК30х:
- допилите наконец библиотеку MODBUS RTU/ASCII до нормального состояния, почитав хотябы на википедии как оно должно работать на самом деле, а не как кажется Вам;
- при установке времени цикла 20 ms, время цикла совсем не 20ms. Чтобы получить цикл менее 20 ms необходимо выставлять меньшие интервалы.


Ни один ПЛК30х с 3-м Кодесис пока не в состоянии гарантировать цикл меньше 20мс. Так что и переод опроса не может быть меньше.

Sergey_Byk
09.08.2011, 14:05
Я в смысле не меньше 20мс, а чтобы получить 20 мс, надо ставить меньшее значение.

Sergey_Byk
09.08.2011, 14:08
Что с ModBusTCP Slave? Починили?

Евгений Сергеевич
11.08.2011, 11:31
еще нет. Как что-то станет известно я отпишусь.

Sergey_Byk
03.10.2011, 12:33
Есть успехи с ModBusTCP Slave?
Если нет, то такой вопрос:
пытаюсь получать/отсылать что-либо через сокеты, но не удается получить/отослать. Настраиваю сокет

tcp_adr.sin_family:=SOCKET_AF_INET;
tcp_adr.sin_port:=SysSockHtons(555);
tcp_adr.sin_addr.ulAddr:=SOCKET_INADDR_ANY;
sock:=SysSockCreate(SOCKET_AF_INET,SOCKET_STREAM,S OCKET_IPPROTO_TCP,serr);
serr1:=SysSockBind(sock,ADR(tcp_adr),SIZEOF(tcp_ad r));
serr2:=SysSockListen(sock,1);
param_ctrl:=1;
SysSockIoctl(sock,SOCKET_FIONBIO,ADR(param_ctrl));

Затем в цикле:

rcv_bytes_cnt:=SysSockRecv(sock,ADR(rcv_snd_buf[0]),1024,SOCKET_MSG_OOB,serr3);
IF rcv_bytes_cnt>0 THEN
SysSockSend(sock,ADR(rcv_snd_buf[0]),10,0,serr);
END_IF

...и ничего не происходит. тишина.

Евгений Сергеевич
04.10.2011, 13:57
на сайт выложили новую прошивку с поддержкой ModBusTCP http://www.owen.ru/catalog/32050189

Sergey_Byk
05.10.2011, 06:14
и все-таки как сокеты заставить работать?

Малышев Олег
05.10.2011, 12:05
Начните с библиотеки oscat.net

http://oscat.de/index.php?option=com_content&task=blogcategory&id=28&Itemid=57

там есть любопытные примеры

Sergey_Byk
06.10.2011, 08:42
Послали вы меня, конечно, интересно, но подскажите мне глупому, убогому и квадратному где там на какую кнопочку нажать чтоб oscat.net для Codesys v3 чудейснейшим образом на компьютер транклюкировался. А лучше, все-таки, поделитесь примером сокетов для v3, а то делаю по подобию v2 из примера и ничего не получается.

capzap
06.10.2011, 10:13
Заходите на вышеупомянутый сайт, в разделе для скачивания находите библиотеку для третьего КДС, там же скачиваете библиотеку для локальных сетей, правда я её использовал во второй версии, зато расписана работа сокетов в различных вариациях

Малышев Олег
06.10.2011, 10:32
И что характерно - библиотека в исходниках

Sergey_Byk
06.10.2011, 13:55
Перепрошил контроллер - модбас слейв попрежнему не работает. Только если ранее вис только модбас, то теперь выкидывает и саму CODESYS.
Пример ВЕБ-сервера, выложенный на форуме, тоже с исходниками, но будучи переделанным для версии v3 не работает. Уважаемая техподдержка, будте так сказачно любезны , пожалуйста, попробуйте сделать ВЕБ-сервер для третьей версии.

Sergey_Byk
06.10.2011, 13:58
Или каким образом можно массив значений передать/считать с ПЛК308 по езернету. Или тоже все ручками по 485 делать?

Sergey_Byk
07.10.2011, 09:01
Товарисчи!!! Модбас не работает!!!! Как получить эхо по езернету? В вышеуказанных ссылках oscat.net есть только для CODESYS v2. Там сделано абсолютно также как я указывал ранее, но нифига не работает!

Евгений Сергеевич
07.10.2011, 15:28
прошивку сейчас правим.

Sergey_Byk
10.10.2011, 13:05
А с сокетами примером не подскажете? Чтоб что принял, то назад отправил?

Sergey_Byk
21.10.2011, 09:47
Несмотря на обновление прошивки так ничего и не заработало. Все-таки как с сокетами в третьем кодесисе необходимо обращаться?

Евгений Сергеевич
21.10.2011, 10:18
на сайт выложил исправленную прошивку для 308го. попробуйте.

Sergey_Byk
21.10.2011, 11:32
Пробывал. То же самое. Вы их сами совсем не проверяете?
На каком-то сайте увидел надпись, которая говорила о том, что для программирования сокетов в третьем кодесисе необходим отдельнооплачиваемый модуль. Вы можете это как-то прокомментировать?

Евгений Сергеевич
21.10.2011, 13:04
Версия 1,011? Да эту версию проверил сам, на 308 работает. На всякий случай рекомендую обновить и саму программу пользовательской прошивки

Sergey_Byk
24.10.2011, 13:21
Заработало, но периодически подвисает. Связь восстанавливается через весьма заметный промежуток времени. Как устранить?

Евгений Сергеевич
24.10.2011, 14:03
У меня терялась связь каждый час+-полчаса, восстанавливалась менее чем за секунду. проверял я вот этой программой (http://depositfiles.com/files/3wmm422hz)

Sergey_Byk
25.10.2011, 06:17
Связь рвется каждые 3-5 минут. Восстанавливается от менее секунды - до десятков секунд.

capzap
25.10.2011, 10:09
пробовали перезапускать соединение принудительно после каждого запроса, чтоб не ждать когда связь сама отвалится

Sergey_Byk
27.10.2011, 08:45
Попробовал перезапускать - не сильно отличается. Соединил контроллер с ПК кроссом получилось работоспособно, но все-таки отваливается гораздо чаще, чем указал Евгений Сергеич. Связь при таком соединении восстанавливается быстро. Но все-таки, на мой взгляд, такого не должно быть.

Sergey_Byk
27.10.2011, 08:55
Если на вкладке ModbusTCP_Slave->Config-Page указать количество Holding Registers(IW) = 2, а Input Registers(QW)=40, то на вкладке Mapping регистры появляются соответственно указанным значениям, но считать больше 2-х QW регистров нельзя до тех пор пока не поставить IW=40. Из чего я могу сделать вывод, что что-то в кодесисе напутано.

capzap
27.10.2011, 09:23
а количество передаваемых байт за один раз каково, у меня на плк100 если выше 490, то начинает зависать

Sergey_Byk
27.10.2011, 11:56
40 слов (80 байт). Я не нашел способ изменить параметр MAX_IOBUFFER_SIZE=40 в библиотеке модбусТСП

enginegr74
30.11.2011, 18:20
нужно передать с ПЛК308 по ModBusTCP в Lectus 6 массивов по 255 байт, и получать несколько байт.
а переменных iw/qw всего 40
пробовал присвоить массив - присваивание вроде бы происходит, но только ничего толком не передается...

uJluac
13.10.2014, 09:55
привет всем.. а как передать real значаение по модбас тсп

Sergeba
01.03.2018, 00:33
ПЛК304. Осваиваю Modbus_TCP_Slave. Значит так, есть регистры временного хранения (чтение 03, запись 06 или 16), входные регистры (чтение 04).
1. Правильно я понял, что сопрягать регистры временного хранения я могу только с переменными типа INPUT?
2. Не понял применение функции 16. По идее это групповая передача значений. Как это организовать на ST не понятно...

Евгений Кислов
01.03.2018, 07:22
ПЛК304. Осваиваю Modbus_TCP_Slave. Значит так, есть регистры временного хранения (чтение 03, запись 06 или 16), входные регистры (чтение 04).
1. Правильно я понял, что сопрягать регистры временного хранения я могу только с переменными типа INPUT?
2. Не понял применение функции 16. По идее это групповая передача значений. Как это организовать на ST не понятно...

1. Нет - можно привязать к ним любые переменные.
2. Если у вас ПЛК - слэйв, то организацией группового запрос занимается мастер. Вам ничего делать не нужно.

См. пример из п. 8 документа СПК. Modbus (он написан для СПК, но принцип идентичен).
https://ftp.owen.ru/CoDeSys3/11_Documentation/01_SPK/SPK_Modbus_v.1.1.pdf

Sergeba
01.03.2018, 09:51
1. Нет - можно привязать к ним любые переменные.[/url]

Если привязываю обычные переменные, после компиляции, выскакивает предупреждение:
------ Компиляция : Приложение: Device.Application -------
[WARNING] Без имени1: ModbusTCP_Slave_Device [Device: Ethernet]: 'Application.PLC_PRG.i2' - не корректный объект для присваивания
[WARNING] Без имени1: ModbusTCP_Slave_Device [Device: Ethernet]: 'Application.PLC_PRG.i2' - не корректный объект для присваивания

i2 - обычная переменная, если же присваиваю переменную VAR_INPUT - проблем и предупреждений нет

Евгений Кислов
01.03.2018, 09:59
У меня ошибок не возникает.

35884

Sergeba
01.03.2018, 20:42
У меня ошибок не возникает.

35884

Да, компиляция пропускает без ошибок и предупреждений, но при загрузке в ПЛК сразу появляется предупреждение.

Евгений Кислов
02.03.2018, 07:03
На ПЛК в данный момент проверить не могу - но на виртуальном контроллере и СПК таких предупреждений не возникает.
Если оно не приводит ни к каким последствиям, то просто игнорируйте его.

Sergeba
23.04.2018, 02:12
ПЛК304. Месяц бьюсь с ModbusTCP_Slave. Работает очень не стабильно. SCADA постоянно отваливается, причём как-то странно, сначала начинает жутко тормозить - реакция на какое-нибудь включение в визуализации SCADA доходит до 10-ков секунд, иногда реакция мгновенная, при этом, когда тормозит, SCADA на секунды отваливается, потом восстанавливается. Через несколько минут работы на ModbusTCP_Slave появляется красный треугольник. Перезагрузка по питанию помогает не всегда, иногда даже вредит - во время инициализации в переменные проекта, я так понимаю, по сети, "залетает" какой-то мусор (смотрю значения переменных и массивов). Помогает сброс из среды программирования. Не уверен, но такое ощущение что проблемы и глюки с портом "набирают отбороты" т.к. первое время всё работало более-менее нормально, но заметил периодически, при загрузке проекта в ПЛК, начала слетать SCADA. Сейчас это уже не привязано к загрузке... Причём программа контроллера продолжает работать нормально.