PHP код:
VAR
get1_modbus: MB_RD_HOLD_REGS; (*МВ110.8АС*) (*функция 04 - чтение параметров float*)
send2_modbus: MB_WR_REGS; (*МУ110.8И*) (*функция 16 - запись параметров float*)
get3_modbus: MB_RD_HOLD_REGS; (*МК110.8ДН.4Р*) (*функция 04 - чтение параметров типа int*)
send4_modbus: MB_WR_REGS; (*МК110.8ДН.4Р*) (*функция 16 - запись параметров 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;
master1: BYTE:= 1;
COM_SERVICE1: COM_SERVICE;
ptr_D:POINTER TO BYTE;
(* Каналы модуля МВ110 8АС *)
i : BYTE;
pAI : POINTER TO BYTE;
pDiag : POINTER TO BYTE;
x: ARRAY[1..8] OF REAL;
ReciveBuffer : ARRAY[0..255] OF BYTE; (* Буфер ответов*)
SendBuffer : ARRAY[0..255] OF BYTE; (* Буфер посылок *)
AI : ARRAY[1..8] OF INT; (* Данные с каналов модуля*)
Diag : ARRAY[1..8] OF INT; (* Диагностические данные с каналов модуля*)
(* Каналы модуля МУ110 8И *)
pAO : POINTER TO BYTE;
y: ARRAY[1..8] OF REAL;
(* Каналы модуля МК110.8ДН.4Р *)
dwDI : WORD; (* Данные с входов модуля в формате word*)
DI : ARRAY[1..8] OF BOOL; (* Данные с входов модуля*)
DICntr : ARRAY[1..16] OF WORD; (* Счетчики входов модуля *)
pData : POINTER TO BYTE;
END_VAR
(*Устанавливаем настройки 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:=enabl , (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=adr1 , (*адрес*)
FirstAddr:=100 , (*номер регистра*)
Quantity:=1, (*количество регистров*)
ComHandle:=Settings.Port ,(*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
master1:=1;(*переходим к выполнению следующего ФБ*)
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа FLOAT*)
FOR i := 1 TO 8 DO
pAI := ADR(AI[i]);
pAI^ := Buffer[(i-1)*4 + 1];
pAI := pAI + 1;
pAI^ := Buffer[(i-1)*4];
pDiag := ADR(Diag[i]);
pDiag^ := ReciveBuffer[(i-1)*2 + 33];
pDiag := pDiag + 1;
pDiag^ := ReciveBuffer[(i-1)*2 + 32];
END_FOR;
END_IF
END_IF
1:
(*запись в буффер параметра типа Float*)
pAO:=ADR(y);
buffer[5] := pAO^;
pAO:=pAO+1;
buffer[4] := pAO^;
pAO:=pAO+1;
buffer[7] := pAO^;
pAO:=pAO+1;
buffer[6] := pAO^;
send2_modbus(
Enable:= enabl, (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=adr2 , (*адрес*)
FirstAddr:= 0, (*номер регистра*)
Quantity:= 6, (*количество записываемых регистров*)
ComHandle:=Settings.Port ,(*номер сом-порта*)
TimeOut:=TimeOut , (*таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
RegCnt=> DataSize); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
master1:=2;(*переходим к выполнению следующего блока*)
END_IF
2:
get3_modbus(
Enable:= enabl, (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=adr3 , (*адрес*)
FirstAddr:=51 , (*номер регистра*)
Quantity:=1 , (*количество регистров*)
ComHandle:= Settings.Port,(*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
ByteCnt=> DataSize); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
dwDI:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
END_IF
master1:=3;
END_IF
3:
(*Пишем в буфер отправки битовую маску*)
ptr_D:=ADR(mk_mask_in);
Buffer[1]:=ptr_D^;
ptr_D:=ptr_D+1;
Buffer[0]:=ptr_D^;
(*Выполняем отправку*)
send4_modbus(
Enable:= enabl, (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=adr3 , (*адрес*)
FirstAddr:=50 , (*номер регистра*)
Quantity:=1 , (*количество регистров*)
ComHandle:= Settings.Port,(*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
RegCnt=> DataSize); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN
master1:=0;(*переходим к выполнению следующего блока*)
END_IF
END_CASE
IF enabl = FALSE THEN
enabl := TRUE;
END_IF
IF err <> 0 THEN
enabl := FALSE;
END_IF
(*Разбираем битовую маску входов МК110.8ДН.4Р*)
A4_in1:=dwDI.0;
A4_in2:=dwDI.1;
A4_in3:=dwDI.2;
A4_in4:=dwDI.3;
A4_in5:=dwDI.4;
A4_in6:=dwDI.5;
A4_in7:=dwDI.6;
A4_in8:=dwDI.7;
END_IF