Пожалуйста
Вот пример (не полный) работы с ЧРП
Код:
PROGRAM InitComPort
VAR
COM_SERVICE1: COM_SERVICE;
END_VAR
IF ComPortState = 0 THEN
Settings.Port:= 0; (*номер COM-порта*)
Settings.dwBaudRate:=9600; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF
IF ComPortState <> 2 THEN
(*Открываем COM-порт*)
COM_SERVICE1(Enable:=(ComPortState=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready THEN
ComPortState:= 2;
END_IF
END_IF
Код:
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#150ms;
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
1: SendModbus1(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
FirstAddr:= 40,
Quantity:= 8,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus1.Complete THEN
EndSendStored:=TRUE;
ErrorSend1[1]:= SendModbus1.Exception;
IF ErrorSend1[1] = 0 THEN
AHU_CONT:= BYTE_TO_BOOL(Buffer[0] AND 8);
ELSE
AHU_CONT:= FALSE;
EndSendError:= TRUE;
Stage:= 4;
END_IF;
END_IF;
2: CASE FanSpeed OF
0: SpeedTmp:= (AHU_Speed1 - 25)*16#4000;
1: SpeedTmp:= (AHU_Speed2 - 25)*16#4000;
2: SpeedTmp:= (AHU_Speed3 - 25)*16#4000;
END_CASE;
Speed:= DWORD_TO_WORD(SpeedTmp / 75);
SendModbus2(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
RegAddr:= 50009,
Value:= Speed,
ComHandle:= Settings.Port,
TimeOut:= Timeout);
IF SendModbus2.Complete THEN
EndSendStored:=TRUE;
ErrorSend2[1]:= SendModbus2.Exception;
END_IF;
3: SendModbus3(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
CoilAddr:= 6,
Value:= AHU_START,
ComHandle:= Settings.Port,
TimeOut:= Timeout);
IF SendModbus3.Complete THEN
EndSendStored:=TRUE;
ErrorSend3[1]:= SendModbus3.Exception;
END_IF;
4: SendModbus1(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 2,
END_CASE;
ES:= FALSE;
ELSE
IF EndSendError THEN
EndSendError:= FALSE;
ES:= TRUE;
EndSendStored:= FALSE;
ELSE
HavePause(IN:= EndSendStored,PT:=T#100ms);
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#100ms);
END_IF;