Привет форумчанам.
Пытаюсь через библиотеку modbus.lib организовать опрос slave-устройств, однако, что на технологическом оборудовании, что на стенде происходят непонятные вещи.
Исходник программы стенда (опрос МВ110-16ДН):
IF port_opened=0 THEN
Settings.Port := 0; (*COM1*)
Settings.dwBaudRate := 9600;
END_IF;
COM_SERVICE1(Enable:=(port_opened=0),Settings := Settings,Task := OPEN_TSK);
IF COM_SERVICE1.Ready THEN port_opened := 2; END_IF;
IF port_opened=2 THEN
get1_modbus(
Enable := enabl,
Mode := MB_RTU,
DevAddr := 16,
FirstAddr := 16#30,
Quantity := 1,
ComHandle := Settings.Port,
TimeOut := T#100ms,
Buffer := Buffer);
enabl := FALSE;
IF get1_modbus.Complete THEN
IF get1_modbus.Exception= 0 THEN
count := count + 1;
END_IF;
enabl := TRUE;
END_IF;
END_IF;
По алгоритму, опрос должен осуществляться непрерывно, и счетчик count должен постоянно инкрементироваться. Однако, по факту, счетчик идет рывками и редко, и очень часто возникают ошибки Exception 255 (таймаут).
Подключил прослушку RS-485 сети, и вижу следующие пакеты:
ПЛК73: 10 04 00 30 00 01 32 84
МВ110: 10 04 02 00 00 45 33
ПЛК73: 33 04 00 30 00 01 35 D7
МВ110: молчит, потому что обращение идет почему то к устройству с адресом 16#33
Повторяется...
Таким образом:
1) МВ110 отвечает правильно, но почему ПЛК73 не может принять и распознать пакет, и в итоге завершает блок с ошибкой 255 (таймаут)?
2) Почему при повторном запросе блок выставляет адрес 16#33? Причем замечено, что адрес этого ошибочного запроса всегда совпадает с последним байтом последнего ответа от МВ110. Испытывал, и исход такой же при опросе другого оборудования.