Пожалуйста. Для МДВВ, но там разница только в номерах регистров.
Код:
PROGRAM ExModbus
VAR
SendModbus1: MB_RD_COILS;
SendModbus2: MB_WR_SNG_REG;
SendModbus3: MB_WR_SNG_COIL;
SendModbus4: MB_RD_HOLD_REGS;
SendModbus5: MB_WR_REGS;
ES: BOOL:= TRUE;
TimeOut: TIME:= T#100ms;
Buffer: ARRAY[0..255] OF BYTE;
ErrorSend1: ARRAY[1..4] OF BYTE;
ErrorSend2: ARRAY[1..4] OF BYTE;
ErrorSend3: ARRAY[1..4] OF BYTE;
ErrorSend4: BYTE;
ErrorSend5: BYTE;
Stage: BYTE:= 1;
EndSendStored: BOOL;
EndSendError: BOOL:= FALSE;
HavePause:TON;
SpeedTmp: DWORD;
Speed: WORD;
END_VAR
IF ComPortState = 2 THEN
IF NOT EndSendStored THEN
CASE Stage OF
.......................
13: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 32,
FirstAddr:= 51,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4:= SendModbus4.Exception;
IF ErrorSend4 = 0 THEN
A:= BYTE_TO_BOOL(Buffer[1] AND 1);
B:= BYTE_TO_BOOL(Buffer[1] AND 2);
..................
ELSE
A:= FALSE;
B:= FALSE;
........................
END_IF;
END_IF;
14: IF ES THEN
Buffer[1]:= PACK(B0:= B23, B1:= S21, B2:= S22, B3:= S23, B4:= S24, B5:= S25, B6:= B24, B7:= B25);
Buffer[0]:= 0;
END_IF;
SendModbus5(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 32,
FirstAddr:= 50,
Quantity:= 1,
Buffer:= Buffer,
ComHandle:= Settings.Port,
TimeOut:= TimeOut);
IF SendModbus5.Complete THEN
EndSendStored:=TRUE;
ErrorSend5:= SendModbus5.Exception;
END_IF;
END_CASE;
ES:= FALSE;
ELSE
IF EndSendError THEN
EndSendError:= FALSE;
ES:= TRUE;
EndSendStored:= FALSE;
ELSE
HavePause(IN:= EndSendStored,PT:=T#40ms);
IF HavePause.Q THEN
ES:= TRUE;
EndSendStored:= FALSE;
IF Stage >= 14 THEN
Stage:= 1;
ELSE
Stage:= Stage+1;
END_IF;
END_IF;
END_IF;
END_IF;
HavePause(IN:= EndSendStored,PT:=T#40ms);
END_IF;