Привожу работающий пример записи (чтение не делал) 63 -> 63
Код:
PROGRAM SendOutdoor
VAR
SendModbus1: MB_WR_REGS;
SendModbus2: MB_WR_SNG_REG;
ES: BOOL:= TRUE;
TimeOut: TIME:= T#50ms;
Buffer: ARRAY[0..255] OF BYTE;
OutdoorPtr: POINTER TO BYTE;
ErrorSend1: ARRAY[2..5] OF BYTE;
ErrorSend2: ARRAY[2..5] OF BYTE;
Temp: BOOL:= TRUE;
Addr: BYTE:= 2;
EndSendStored: BOOL;
HavePause:TON;
END_VAR
IF ComPortState = 2 THEN
IF Temp THEN
IF ES THEN
OutdoorPtr:= ADR(Outdoor);
Buffer[1]:= OutdoorPtr^;
OutdoorPtr:= OutdoorPtr+1;
Buffer[0]:= OutdoorPtr^;
OutdoorPtr:= OutdoorPtr+1;
Buffer[3]:= OutdoorPtr^;
OutdoorPtr:= OutdoorPtr+1;
Buffer[2]:= OutdoorPtr^;
END_IF
SendModbus1(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= Addr,
FirstAddr:= 148,
Quantity:= 2,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
ES:= FALSE;
IF SendModbus1.Complete THEN
EndSendStored:=TRUE;
ErrorSend1[Addr]:= SendModbus1.Exception;
END_IF
HavePause(IN:= EndSendStored,PT:=T#250ms);
IF HavePause.Q THEN
ES:= TRUE;
EndSendStored:= FALSE;
Addr:= Addr+1;
END_IF
IF Addr = 6 THEN
Addr:= 2;
Temp:= FALSE;
END_IF
ELSE
SendModbus2(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= Addr,
RegAddr:= 346,
Value:= BOOL_TO_WORD(Summer)+1,
ComHandle:= Settings.Port,
TimeOut:= Timeout);
ES:= FALSE;
IF SendModbus2.Complete THEN
EndSendStored:=TRUE;
ErrorSend2[Addr]:= SendModbus2.Exception;
END_IF
HavePause(IN:= EndSendStored,PT:=T#250ms);
IF HavePause.Q THEN
ES:= TRUE;
EndSendStored:= FALSE;
Addr:= Addr+1;
END_IF
IF Addr = 6 THEN
Addr:= 2;
Temp:= TRUE;
END_IF
END_IF
END_IF
После вызова ф-ии надо сбросить Enable, чтобы тать ей работать.
Проверку выходных переменных стОит делать так, иначе у меня были проблемы.