VAR
flag : BOOL;
bRead : UDINT;
bWrite : UDINT;
state : UINT;
ors : ComConn;
Err : SysCom.RTS_IEC_RESULT;
TimeOut : COM_Timeout :=100;
BufBR : ARRAY [1..1024] OF BYTE;
otvet : REQUEST_RHR := (adr_slave:=16,cod_fun:=3);
tik : TON;
uno : REAL;
duo : ARRAY[0..3] OF BYTE;
ptr : POINTER TO REAL;
tak : TON;
texts : STRING;
END_VAR
ors(enable:=flag);
IF tik.Q THEN
state:=0; (*в каждом запросе устанавливаем переменную на кейс отправки запроса*)
otvet.ref:=ROR(4,8); (*начальный адрес*)
otvet.offset:=ROR(2,8); (*количчество запрашиваемых регистров*)
otvet.crc:=_CRC(IN:=ADR(otvet), N:=6); (* формирование контрольной суммы для протокола модбас*)
END_IF;
tik(IN:=ors.Done AND NOT tik.Q, PT:=T#2S); (* запуск периодического запроса если соединение установлено*)
CASE state OF
0:
bWrite:=SysComWrite(ors.Handle,ADR(otvet),SIZEOF(o tvet),TimeOut,ADR(Err));
IF bWrite = SIZEOF(otvet) THEN (*здесь можно обойтись и без условия, обычно отправляется за один цикл плк*)
state:=1;
END_IF;
1:
bRead := SysComRead(hCom:=ors.Handle,pbyBuffer:=ADR(BufBR[1]),ulSize:=8,ulTimeout:=TimeOut,pResult:=ADR(Err));
IF bRead>0 THEN (* если пришли байты, собираем для получения флоата*)
duo[0]:=BufBR[7];
duo[1]:=BufBR[6];
duo[2]:=BufBR[5];
duo[3]:=BufBR[4];
ptr:=ADR(duo);
uno:=ptr^;
END_IF;
ELSE ;
END_CASE;
tak(IN:=NOT tak.Q, PT:=T#30S);
IF tak.Q THEN (*пишем в файл на флешку*)
texts:=CONCAT('echo "',REAL_TO_STRING(uno));
texts:=CONCAT(texts,';`date`" >>/mnt/ufs/media/sda1/archiv.log');
SysExecute(sys_command:=texts);
END_IF;