Здравствуйте!
Решил попробовать эту библиотеку для организации сетевого обмена. Модули у меня МДВВ.
Подключил два модуля - читать их получается, а вот записать в регистры нет.
Блок MB_WR_REGS выдает ошибку 3:
Безымянный.png
Мой код:
Раздел описания:
Код:
FUNCTION_BLOCK Comm
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
ModbusAdrDi11,ModbusAdrDi12: MB_RD_HOLD_REGS;
ModbusAdrDo11,ModbusAdrDo12:MB_WR_REGS;
BufferIN: ARRAY[0..255] OF BYTE;
BufferOUT: ARRAY[0..255] OF BYTE;
cmpl: BOOL;
port_opened: BYTE := 0;
Init: BOOL;
Settings:COMSETTINGS;
com_num: PORTS:=0;
enabl: BOOL;
Error, ErrorDI11,ErrorDO11,ErrorDI12,ErrorDO12: INT;
TimeOut: TIME:=T#100ms;
Exception: BYTE;
DataSize: WORD;
master1: BYTE:= 1;
WordAdr11,WordAdr12:WORD;
COM_SERVICE1: COM_SERVICE;
END_VAR
код:
Код:
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
IF port_opened=2 THEN
CASE master1 OF
0:
ModbusAdrDi11(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=11 ,
FirstAddr:=51 ,
Quantity:=1,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=BufferIN ,
Complete=>cmpl ,
Exception=>ErrorDI11 ,
ByteCnt=>DataSize );
IF cmpl
THEN
IF ErrorDI11=0
THEN
WordAdr11:=BYTE_TO_WORD(BUFFERIN[1]) OR SHL(BYTE_TO_WORD(BUFFERIN[0]),8);
END_IF
master1:=1;
END_IF
1:
ModbusAdrDi12(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=12 ,
FirstAddr:=51 ,
Quantity:=1,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=BufferIN ,
Complete=>cmpl ,
Exception=>ErrorDI12 ,
ByteCnt=>DataSize );
IF cmpl THEN
IF ErrorDI12=0
THEN
WordAdr12:=BYTE_TO_WORD(BUFFERIN[1]) OR SHL(BYTE_TO_WORD(BUFFERIN[0]),8);
END_IF
master1:=2;
END_IF
2: ModbusAdrDO11(
Enable:= enabl,
Mode:= MB_RTU,
DevAddr:= 11,
FirstAddr:= 50,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= TimeOut,
Buffer:= BufferOUT,
Complete=> cmpl,
Exception=> ErrorDO11,
RegCnt=> DataSize);
IF cmpl THEN
master1:=0;
END_IF
END_CASE
IF enabl = FALSE THEN
enabl := TRUE;
END_IF(*
IF ErrorDI11<> 0 OR ErrorDI12<> 0 OR ErrorDO11<> 0 OR ErrorDO12<> 0 THEN
enabl := FALSE;
END_IF
*)
END_IF
Что я делаю неправильно, и как записать байт в регистр мдвв??
Объясните пожалуйста зачем в блоке MB_WR_REGS вход buffer имеет тип данных ARRAY[0..255] OF BYTE;