Код:
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..12] OF BYTE;
ErrorSend5: ARRAY[1..5] OF BYTE;
Stage: BYTE:= 1;
EndSendStored: BOOL;
EndSendError: BOOL:= FALSE;
HavePause:TON;
SpeedPtr: POINTER TO BYTE;
StartTRV1, StartTRV2: BOOL;
SetupTRV1, SetupTRV2: 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:= 16#FD01,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[1]:= SendModbus4.Exception;
IF ErrorSend4[1] = 0 THEN
AHU_Cont1:= BYTE_TO_BOOL(Buffer[0] AND 4);
AHU_Auto1:= NOT BYTE_TO_BOOL(Buffer[0] AND 128);
ELSE
AHU_Cont1:= FALSE;
AHU_Auto1:= FALSE;
EndSendError:= TRUE;
Stage:= 3;
END_IF;
END_IF;
2: IF ES THEN
Buffer[0]:= 0;
Buffer[1]:= 0;
Buffer[0].2:= AHU1;
SpeedPtr:= ADR(AHU_Speed1);
Buffer[3]:= SpeedPtr^;
SpeedPtr:= SpeedPtr+1;
Buffer[2]:= SpeedPtr^;
END_IF;
SendModbus5(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
FirstAddr:= 16#1870,
Quantity:= 2,
Buffer:= Buffer,
ComHandle:= Settings.Port,
TimeOut:= TimeOut);
IF SendModbus5.Complete THEN
EndSendStored:=TRUE;
ErrorSend5[1]:= SendModbus5.Exception;
END_IF;
3: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 2,
FirstAddr:= 16#FD01,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[2]:= SendModbus4.Exception;
IF ErrorSend4[2] = 0 THEN
AHU_Cont2:= BYTE_TO_BOOL(Buffer[0] AND 4);
AHU_Auto2:= NOT BYTE_TO_BOOL(Buffer[0] AND 128);
ELSE
AHU_Cont2:= FALSE;
AHU_Auto2:= FALSE;
EndSendError:= TRUE;
Stage:= 5;
END_IF;
END_IF;
4: IF ES THEN
Buffer[0]:= 0;
Buffer[1]:= 0;
Buffer[0].2:= AHU2;
SpeedPtr:= ADR(AHU_Speed2);
Buffer[3]:= SpeedPtr^;
SpeedPtr:= SpeedPtr+1;
Buffer[2]:= SpeedPtr^;
END_IF;
SendModbus5(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 2,
FirstAddr:= 16#1870,
Quantity:= 2,
Buffer:= Buffer,
ComHandle:= Settings.Port,
TimeOut:= TimeOut);
IF SendModbus5.Complete THEN
EndSendStored:=TRUE;
ErrorSend5[2]:= SendModbus5.Exception;
END_IF;
5: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 3,
FirstAddr:= 16#FD01,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[3]:= SendModbus4.Exception;
IF ErrorSend4[3] = 0 THEN
EF_Cont1:= BYTE_TO_BOOL(Buffer[0] AND 4);
EF_Auto1:= NOT BYTE_TO_BOOL(Buffer[0] AND 128);
ELSE
EF_Cont1:= FALSE;
EF_Auto1:= FALSE;
EndSendError:= TRUE;
Stage:= 7;
END_IF;
END_IF;
6: IF ES THEN
Buffer[0]:= 0;
Buffer[1]:= 0;
Buffer[0].2:= EF1;
SpeedPtr:= ADR(EF_Speed1);
Buffer[3]:= SpeedPtr^;
SpeedPtr:= SpeedPtr+1;
Buffer[2]:= SpeedPtr^;
END_IF;
SendModbus5(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 3,
FirstAddr:= 16#1870,
Quantity:= 2,
Buffer:= Buffer,
ComHandle:= Settings.Port,
TimeOut:= TimeOut);
IF SendModbus5.Complete THEN
EndSendStored:=TRUE;
ErrorSend5[3]:= SendModbus5.Exception;
END_IF;
7: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 4,
FirstAddr:= 16#FD01,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[4]:= SendModbus4.Exception;
IF ErrorSend4[4] = 0 THEN
EF_Cont2:= BYTE_TO_BOOL(Buffer[0] AND 4);
EF_Auto2:= NOT BYTE_TO_BOOL(Buffer[0] AND 128);
ELSE
EF_Cont2:= FALSE;
EF_Auto2:= FALSE;
EndSendError:= TRUE;
Stage:= 9;
END_IF;
END_IF;
8: IF ES THEN
Buffer[0]:= 0;
Buffer[1]:= 0;
Buffer[0].2:= EF2;
SpeedPtr:= ADR(EF_Speed2);
Buffer[3]:= SpeedPtr^;
SpeedPtr:= SpeedPtr+1;
Buffer[2]:= SpeedPtr^;
END_IF;
SendModbus5(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 4,
FirstAddr:= 16#1870,
Quantity:= 2,
Buffer:= Buffer,
ComHandle:= Settings.Port,
TimeOut:= TimeOut);
IF SendModbus5.Complete THEN
EndSendStored:=TRUE;
ErrorSend5[1]:= SendModbus5.Exception;
END_IF;
9: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 5,
FirstAddr:= 116,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[5]:= SendModbus4.Exception;
IF ErrorSend4[5] = 0 THEN
StartTRV1:= BYTE_TO_BOOL(Buffer[1] AND 1);
TRV1Alarm:= FALSE;
ELSE
TRV1Alarm:= TRUE;
EndSendError:= TRUE;
Stage:= 15;
END_IF;
END_IF;
10: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 5,
FirstAddr:= 99,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[6]:= SendModbus4.Exception;
IF ErrorSend4[6] = 0 THEN
SetupTRV1:= Buffer[0]*256 + Buffer[1];
TRV1Alarm:= FALSE;
ELSE
TRV1Alarm:= TRUE;
EndSendError:= TRUE;
Stage:= 15;
END_IF;
END_IF;
11: IF StartTRV1 <> Evap1 THEN
SendModbus2(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 5,
RegAddr:= 116,
Value:= BOOL_TO_WORD(Evap1),
ComHandle:= Settings.Port,
TimeOut:= TimeOut);
IF SendModbus2.Complete THEN
EndSendStored:=TRUE;
ErrorSend2[1]:= SendModbus2.Exception;
END_IF;
ELSE
EndSendStored:= TRUE;
END_IF;
12: IF SetupTRV1 <> DewTemp THEN
SendModbus2(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 5,
RegAddr:= 99,
Value:= DewTemp,
ComHandle:= Settings.Port,
TimeOut:= TimeOut);
IF SendModbus2.Complete THEN
EndSendStored:=TRUE;
ErrorSend2[2]:= SendModbus2.Exception;
END_IF;
ELSE
EndSendStored:= TRUE;
END_IF;
13: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 5,
FirstAddr:= 2535,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[7]:= SendModbus4.Exception;
IF ErrorSend4[7] = 0 THEN
SuperHeat:= Buffer[1];
TRV1Alarm:= FALSE;
ELSE
SuperHeat1:= 16#FFFF;
EndSendError:= TRUE;
Stage:= 15;
END_IF;
END_IF;
14: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 5,
FirstAddr:= 2527,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[8]:= SendModbus4.Exception;
IF ErrorSend4[8] = 0 THEN
SuperHeat1:= SuperHeat*100 + Buffer[1];
TRV1Alarm:= FALSE;
ELSE
SuperHeat1:= 16#FFFF;
EndSendError:= TRUE;
Stage:= 15;
END_IF;
END_IF;
15: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 6,
FirstAddr:= 116,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[9]:= SendModbus4.Exception;
IF ErrorSend4[9] = 0 THEN
StartTRV2:= BYTE_TO_BOOL(Buffer[1] AND 1);
TRV2Alarm:= FALSE;
ELSE
TRV2Alarm:= TRUE;
EndSendError:= TRUE;
Stage:= 1;
END_IF;
END_IF;
16: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 6,
FirstAddr:= 99,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[10]:= SendModbus4.Exception;
IF ErrorSend4[10] = 0 THEN
SetupTRV2:= Buffer[0]*256 + Buffer[1];
TRV2Alarm:= FALSE;
ELSE
TRV2Alarm:= TRUE;
EndSendError:= TRUE;
Stage:= 1;
END_IF;
END_IF;
17: IF StartTRV2 <> Evap2 THEN
SendModbus2(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 6,
RegAddr:= 116,
Value:= BOOL_TO_WORD(Evap2),
ComHandle:= Settings.Port,
TimeOut:= TimeOut);
IF SendModbus2.Complete THEN
EndSendStored:=TRUE;
ErrorSend2[3]:= SendModbus2.Exception;
END_IF;
ELSE
EndSendStored:= TRUE;
END_IF;
18: IF SetupTRV2 <> DewTemp THEN
SendModbus2(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 6,
RegAddr:= 99,
Value:= DewTemp,
ComHandle:= Settings.Port,
TimeOut:= TimeOut);
IF SendModbus2.Complete THEN
EndSendStored:=TRUE;
ErrorSend2[4]:= SendModbus2.Exception;
END_IF;
ELSE
EndSendStored:= TRUE;
END_IF;
19: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 6,
FirstAddr:= 2535,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[11]:= SendModbus4.Exception;
IF ErrorSend4[11] = 0 THEN
SuperHeat:= Buffer[1];
TRV2Alarm:= FALSE;
ELSE
SuperHeat2:= 16#FFFF;
EndSendError:= TRUE;
Stage:= 1;
END_IF;
END_IF;
20: SendModbus4(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 6,
FirstAddr:= 2527,
Quantity:= 1,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus4.Complete THEN
EndSendStored:=TRUE;
ErrorSend4[12]:= SendModbus4.Exception;
IF ErrorSend4[12] = 0 THEN
SuperHeat2:= SuperHeat*100 + Buffer[1];
TRV2Alarm:= FALSE;
ELSE
SuperHeat2:= 16#FFFF;
EndSendError:= TRUE;
Stage:= 1;
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 >= 20 THEN
Stage:= 1;
ELSE
Stage:= Stage+1;
END_IF;
END_IF;
END_IF;
END_IF;
HavePause(IN:= EndSendStored,PT:=T#40ms);
END_IF;
Частотники SE + контроллеры ТРВ Danfoss.