Не могу подружить 2 устройства через modbus.lib
На столе ПЛК100+расходомер взлет + ОВЕН мк110.8дн.4р
Тестовая программа:
Код:
(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта*)
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 );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
IF port_opened=2 THEN (*Удачно проинициализировали*)
CASE master1 OF
0:
get1_modbus(
Enable:=Enable:= NOT get1_modbus.Complete, (* разрешение работы блока *)
Mode:=MB_RTU, (*режим передачи*)
DevAddr:=8 , (*адрес*)
FirstAddr:=2 , (*номер регистра*)
Quantity:=1, (*количество регистров*)
ComHandle:=Settings.Port , (*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer_out, (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=BYTE_TO_WORD(BUFFER_out[1]) OR SHL(BYTE_TO_WORD(BUFFER_out[0]),8);
ELSE
errcount:=errcount +1;
END_IF
master1 := 3;
END_IF
2: get1_modbus(
Enable:= NOT get1_modbus.Complete , (* разрешение работы блока *)
Mode:=MB_RTU, (*режим передачи*)
DevAddr:=48 , (*адрес*)
FirstAddr:=50 , (*номер регистра*)
Quantity:=1, (*количество регистров*)
ComHandle:=Settings.Port , (*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer_out, (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
x:=BYTE_TO_WORD(BUFFER_out[1]) OR SHL(BYTE_TO_WORD(BUFFER_out[0]),8);
ELSE
errcount:=errcount +1;
END_IF
master1 := 3;
END_IF
3:
TimeOut2(IN :=TRUE,PT:=T#50ms);
TimeOut2;
IF TimeOut2.Q THEN
g:=g+1;
master1 := 0;
(*IF g/2 = TRUNC(g/2) THEN
master1 := 2;
END_IF*)
TimeOut2.IN := FALSE;
TimeOut;
END_IF
END_CASE
END_IF
В таком виде программа работает, опрашивается Взлет, ошибок 0. Убираю комментирование в 3м кейсе (подключаю второй модуль ОВЕН) и у Взлета каждая вторая ошибка 255. Что я делаю не так? Через конфигуратор оба работают нормально с редкими ошибками.