ModBus.lib - это был мой следующий шаг. Есть примеры как читать несколько регистров со slave устройства одним запросом. Жизнь удалась!!!
Логика у меня была следующая:
1. Создаем POU (программа) Read10s_PRG.
2. В конфигурации задач настраиваем Тип - циклический, Интервал - 10000ms
3. В программе Read10s_PRG настраиваем параметры порта -> открываем порт -> читаем -> обрабатываем данные -> закрываем порт.
4. Получаем считывание нескольких регистров slave устройства и их обработку 1 раз в 10 сек.
На мой взгляд все логично=) А вот не тут-то было!!!!!
конструкция COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK ); должна открыть порт и выставить COM_SERVICE1.ready в TRUE, и на это ей нужно
299!!! циклов (запусков Read10s_PRG).
299 КАРЛ
т.е. если Read10s_PRG запускается 1 раз в 10 мс то требуется 299*10мс.
если Read10s_PRG запускается 1 раз в 10000 мс то требуется 299*10000мс.
Вот этого я никак не ожидал вообще!!! Но справедливости ради надо отметить что порт открывается, обмен идет, и можно одним запросом прочитать сразу несколько регистров =) На 10000мс не проверял конечно, остановился на 800мс. Далее "логика" была понятна.
Но и тут казалось можно было выкрутиться:
Создаем POU OpenPort_PRG -> настраиваем циклически 10мс -> вставляем туда код:
Код:
IF port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
Порт открывается быстро. А теперь в Read10s_PRG просто работаем с этим портом (естественно нужные переменные делаем глобальными)
Код:
get1_modbus: MB_RD_HOLD_REGS
get1_modbus(
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=1 ,
FirstAddr:=300 ,
Quantity:=14,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );
cmpl будет TRUE когда get1_modbus получит данные.
НО
получит она их через 13 циклов (запусков Read10s_PRG )
13!!!
т.е. если Read10s_PRG запускается 1 раз в 10000мс то мы получим данные через 13*10000мс
Все данные получены экспериментально.
Код:
PLCInfo
PLC model MODEL PLC 110-32 Версия ПО метр: 2.0
Binary VERSION 2.15.8
Need Target version 2.10
Compiled: 11:51:53 Dec 26 2015
MAC 6A:77:00:81:4F:67
IP 10.0.6.10
GATE 10.0.6.1
MASK 255.255.255.0
PIC upper version is 15
Licence unlimited
Ну и напоследок
Если кто-то захочет на одном интерфейсе по ModBus опрашивать часть устройств через конфигуратор а часть в программе через modbus.lib
ничего не выйдет - проверено! После открытия порта в программе конфигуратор больше не может подключиться к интерфейсу.
Вот такая интересная ночка выдалась =)