Код:
PROGRAM ExModbus
VAR
SendModbus2: MB_WR_SNG_REG;
SendModbus4: MB_RD_HOLD_REGS;
SendModbus5: MB_WR_REGS;
ES: BOOL:= TRUE;
TimeOut: TIME:= T#100ms;
Buffer: ARRAY[0..255] OF BYTE;
ErrorSend2: ARRAY[1..5] OF BYTE;
ErrorSend4: ARRAY[1..5] OF BYTE;
ErrorSend5: ARRAY[1..5] OF BYTE;
Stage: BYTE:= 1;
EndSendStored: BOOL;
EndSendError: BOOL:= FALSE;
HavePause:TON;
SpeedPtr: POINTER TO BYTE;
StartTRV1: BOOL;
SetupTRV1: WORD;
SuperHeat: WORD;
END_VAR
IF ComPortState = 2 THEN
IF NOT EndSendStored THEN
CASE Stage OF
1: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
FirstAddr:= 2530,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[1]:= SendModbus4.Exception;
IF ErrorSend4[1] = 0 THEN
EvpTemp1:= Buffer[0]*256 + Buffer[1];
TRV1Alarm:= FALSE;
ELSE
EvpTemp1:= 16#FFFF;
TRV1Alarm:= TRUE;
EndSendError:= TRUE;
Stage:= 1;
END_IF;
END_IF;
2: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
FirstAddr:= 116,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[2]:= SendModbus4.Exception;
IF ErrorSend4[2] = 0 THEN
StartTRV1:= BYTE_TO_BOOL(Buffer[1] AND 1);
TRV1Alarm:= FALSE;
ELSE
TRV1Alarm:= TRUE;
EndSendError:= TRUE;
Stage:= 1;
END_IF;
END_IF;
3: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
FirstAddr:= 99,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[3]:= SendModbus4.Exception;
IF ErrorSend4[3] = 0 THEN
SetupTRV1:= Buffer[0]*256 + Buffer[1];
TRV1Alarm:= FALSE;
ELSE
TRV1Alarm:= TRUE;
EndSendError:= TRUE;
Stage:= 1;
END_IF;
END_IF;
4: IF StartTRV1 <> StartTRV THEN
SendModbus2(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
RegAddr:= 116,
Value:= BOOL_TO_WORD(StartTRV),
ComHandle:= Settings.Port,
TimeOut:= TimeOut);
IF SendModbus2.Complete THEN
EndSendStored:=TRUE;
ErrorSend2[1]:= SendModbus2.Exception;
END_IF;
ELSE
EndSendStored:= TRUE;
END_IF;
5: IF SetupTRV1 <> SetupTRV THEN
SendModbus2(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
RegAddr:= 99,
Value:= SetupTRV,
ComHandle:= Settings.Port,
TimeOut:= TimeOut);
IF SendModbus2.Complete THEN
EndSendStored:=TRUE;
ErrorSend2[2]:= SendModbus2.Exception;
END_IF;
ELSE
EndSendStored:= TRUE;
END_IF;
6: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
FirstAddr:= 2535,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[4]:= SendModbus4.Exception;
IF ErrorSend4[4] = 0 THEN
SuperHeat:= Buffer[1];
TRV1Alarm:= FALSE;
ELSE
SuperHeat1:= 16#FFFF;
EndSendError:= TRUE;
Stage:= 1;
END_IF;
END_IF;
7: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
FirstAddr:= 2527,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[5]:= SendModbus4.Exception;
IF ErrorSend4[5] = 0 THEN
SuperHeat1:= SuperHeat*100 + Buffer[1];
TRV1Alarm:= FALSE;
ELSE
SuperHeat1:= 16#FFFF;
EndSendError:= TRUE;
Stage:= 8;
END_IF;
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 >= 7 THEN
Stage:= 1;
ELSE
Stage:= Stage+1;
END_IF;
END_IF;
END_IF;
END_IF;
HavePause(IN:= EndSendStored,PT:=T#40ms);
END_IF;