Добрый день! Подскажите, пожалуйста, как сформировать буфер для записи значений WORD в МУ110-8И с помощью библиотеки modbus.lib. С записью битовой маски проблем нет, но записать 6 значений WORD возникли проблемы.
Уважаемые разработчики могли бы и выложить РАБОЧИЕ примеры чтения/записи значений по modbus для Мх110
PHP код:
FUNCTION_BLOCK mbus_set
VAR_INPUT
In:BOOL:=FALSE;
Dev_adr:BYTE;
Start_reg:WORD;
TimeOut: TIME;
Polling_Time:TIME;
y1:WORD;
y2:WORD;
y3:WORD;
y4:WORD;
y5:WORD;
y6:WORD;
END_VAR
VAR_OUTPUT
Ready:BOOL:=FALSE;
err: WORD;
END_VAR
VAR
com_num: PORTS;
Settings: COMSETTINGS;
COM_SERVICE1: COM_SERVICE;
com_ready: BOOL;
buffer: ARRAY [0..255] OF BYTE;
set_modbus:MB_WR_REGS;
stat :WORD;
rt:R_TRIG;
y:WORD;
timer:TON;
ptr_byte:POINTER TO BYTE;
rt_in:R_TRIG;
y1_old:WORD;
y2_old:WORD;
y3_old:WORD;
y4_old:WORD;
y5_old:WORD;
y6_old:WORD;
END_VAR
PHP код:
rt_in(CLK:=IN);
IF rt_in.Q THEN
stat:=0;
Ready:=FALSE;
err:=0;
com_ready:=FALSE;
END_IF
IF IN=TRUE THEN
IF COM_SERVICE1.ready=FALSE THEN
com_num:=0;
Settings.Port:=com_num;
Settings.dwBaudRate:=115200;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
COM_SERVICE1(Enable:=TRUE , Settings:=Settings , Task:=OPEN_TSK );
com_ready:=FALSE;
ELSE
COM_SERVICE1.Enable:=FALSE;
com_ready:=TRUE;
END_IF
IF com_ready=TRUE THEN
CASE stat OF
0:
Ready:=FALSE;
set_modbus(
Enable:=TRUE ,
Mode:=MB_RTU ,
DevAddr:=Dev_adr,
FirstAddr:=Start_reg,
Quantity:=6,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=buffer ,
Complete=> ,
Exception=> ,
RegCnt=> );
IF set_modbus.Complete THEN
ptr_byte:=ADR(y1_old);
ptr_byte^:=buffer[0] ;
buffer[1] :=WORD_TO_BYTE (y2_old);
buffer[2] := WORD_TO_BYTE(y3_old);
buffer[3] := WORD_TO_BYTE(y4_old);
buffer[4] := WORD_TO_BYTE(y5_old);
buffer[5] := WORD_TO_BYTE(y6_old);
set_modbus(
Enable:=FALSE ,
Mode:=MB_RTU ,
DevAddr:=Dev_adr,
FirstAddr:=Start_reg,
Quantity:=6,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=buffer ,
Complete=> ,
Exception=> ,
RegCnt=> );
stat:=1;
END_IF
1:
timer(IN:=TRUE , PT:=Polling_Time );
timer;
stat:=2;
2:
timer;
IF timer.Q THEN
timer(IN:=FALSE , PT:=Polling_Time );
timer;
stat:=0;
Ready:=TRUE;
END_IF
END_CASE
END_IF
END_IF;
y1_old:=y1;
y2_old:=y2;
y3_old:=y3;
y4_old:=y4;
y5_old:=y5;
y6_old:=y6;