Код:
PROGRAM PLC_PRG
VAR
get_modbus: MB_RD_INP_REGS:= (Enable := TRUE); (*функция 04 - чтение трех параметров типа INT*)
Buffer: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
cmpl: BOOL;
port_opened: BYTE := 0;
Init: BOOL; (* признак инициализации пользовательской программы *)
Settings:COMSETTINGS; (* настройки последовательного порта *)
com_num: PORTS:=0; (*0 - RS-485, 1 - RS-232*)
enabl: BOOL; (*состояние работы блока*)
err: INT; (*номер ошибки*)
TimeOut: TIME:=T#50ms; (*таймаут*)
Exception: BYTE;
DataSize: WORD;
t: DWORD; (*переменная для организации счетчика*)
A: WORD := 0; (*счетчик*)
x:WORD; (*считанное значение*)
x1: INT; (*переменная для записи по сети*)
x2: INT; (*переменная для записи по сети*)
x3: INT; (*переменная для записи по сети*)
d: REAL; (*считанное значение*)
ptr_D:POINTER TO BYTE;
COM_SERVICE1: COM_SERVICE;
x_1: INT;
x4: INT;
x5: INT;
x6: INT;
x7: INT;
x8: INT;
END_VAR
--------------------------------
IF port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=19200;
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
get_modbus(
Mode:=MB_RTU ,
DevAddr:=2 ,
FirstAddr:=12 ,
Quantity:=8 ,
ComHandle:= Settings.Port,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>get_modbus.Enable ,
Exception=>err ,
ByteCnt=> DataSize);
IF get_modbus.Complete THEN
IF err=0 THEN
x1:=BYTE_TO_WORD(BUFFER[4]) OR SHL(BYTE_TO_WORD(BUFFER[3]),8);
x2:=BYTE_TO_WORD(BUFFER[6]) OR SHL(BYTE_TO_WORD(BUFFER[5]),8);
x3:=BYTE_TO_WORD(BUFFER[8]) OR SHL(BYTE_TO_WORD(BUFFER[7]),8);
x4:=BYTE_TO_WORD(BUFFER[10]) OR SHL(BYTE_TO_WORD(BUFFER[9]),8);
x5:=BYTE_TO_WORD(BUFFER[12]) OR SHL(BYTE_TO_WORD(BUFFER[11]),8);
x6:=BYTE_TO_WORD(BUFFER[14]) OR SHL(BYTE_TO_WORD(BUFFER[13]),8);
x7:=BYTE_TO_WORD(BUFFER[16]) OR SHL(BYTE_TO_WORD(BUFFER[15]),8);
x8:=BYTE_TO_WORD(BUFFER[18]) OR SHL(BYTE_TO_WORD(BUFFER[17]),8);
END_IF
END_IF
END_IF