PLC项目代码说明
PLC项目代码说明
程序主流程分为6个部分,1.通讯部分;2.故障判断部分;3.故障类型判断部分;4.状态判断部分;5.故障处理部分;6.操作部分。
1.通讯部分
PLC作为主站,变频器作为1#付站,采RS485的MODBUS通讯协议。以下是通讯程序代码
(*datamod*)
"EventPV1 ", 01, $01, "LocalPV1 ", 0000, 0005
"EventPV2 ", 02, $01, "LocalPV2 ", 0000, 0003
"EventPV3 ", 03, $01, "LocalPV3 ", 0000, 0005
"EventPV4 ", 04, $01, "LocalPV4 ", 0000, 0005
初始化部分
PROGRAM _INIT
(* Insert code here *)
S1:=0;
S2:=1;
EventPV1:=1;
EventPV2:=1;
EventPV3 := 1;
EventPV4 := 1;
LocalPV1[0] := 0;
LocalPV1[1]:=0;
LocalPV1[2] := 0;
LocalPV1[3] := 0;
LocalPV1[4] := 0;
LocalPV1[5] := 0;
LocalPV2[0] := 0;
LocalPV2[1] := 0;
LocalPV2[2] := 0;
LocalPV2[3] := 0;
LocalPV2[4] := 0;
LocalPV3[0] := 0;
LocalPV3[1] := 0;
LocalPV3[2] := 0;
LocalPV3[3] := 0;
LocalPV3[4] := 0;
LocalPV3[5] := 0;
LocalPV4[0] := 0;
LocalPV4[1] := 0;
LocalPV4[2] := 0;
LocalPV4[3] := 0;
LocalPV4[4] := 0;
MBMOpen_xx.enable:=1;
MBMOpen_xx.pDevice:=ADR('IF6.ST4.IF1');
MBMOpen_xx.pMode:=ADR('/PHY=RS485 /PA=E /DB=8 /SB=1 /BD=19200');
MBMOpen_xx.pConfig:=ADR('datamod');
MBMOpen_xx.timeout:=2000;
MBMOpen_xx.ascii:=0;
MBMOpen_xx();
END_PROGRAM
循环部分
PROGRAM _CYCLIC
(* Insert code here *)
(*EventPV1:=1;
EventPV2:=1;*)
EventPV1 := 1;
EventPV3 := 1;
IF(S1=0)THEN
MBMaster_xx.enable:=1;
MBMaster_xx.ident:=MBMOpen_xx.ident;
MBMaster_xx();
ELSE
MBMCmd_xx.enable:=1;
MBMCmd_xx.ident:=MBMOpen_xx.ident;
MBMCmd_xx.mfc:=1;
MBMCmd_xx.node:=1;
MBMCmd_xx.data:=ADR(LocalPV1);
(*name*)
MBMCmd_xx.offset:=0;
MBMCmd_xx.len:=4;
MBMCmd_xx();
END_IF
IF(S2=0)THEN
MBMClose_xx.enable:=1;
MBMClose_xx.ident:=MBMOpen_xx.ident;
MBMClose_xx();
END_IF
END_PROGRAM
2.故障判断部分
故障判断部分分为四个部分,分别为转速判断,温度判断,压力判断和风机故障判断。写成一个Action,在主程序中调用。
ACTION ErrorConfirm:
(***************转速判断*************)
IF iSpeedActual < iMinPowerSpeed THEN
nPowerUnitWarnWord1.10 := TRUE;
ELSE
nPowerUnitWarnWord1.10 := FALSE;
END_IF
IF iSpeedActual > iMaxPowerSpeed THEN
nPowerUnitWarnWord1.11 := TRUE;
ELSE
nPowerUnitWarnWord1.11 := FALSE;
END_IF
IF iSpeedActual < iMinStartBackupGenSpeed THEN
(*低于轴发启动速度报警,待补充*)
ELSE
END_IF
IF iSpeedActual > iMaxStartBackupGenSpeed THEN
(*高于启动轴发转速报警,待补充*)
ELSE
END_IF
(**************IGBT冷却水系统越限报警**********)
IF iCoolingWaterInTemp > iCoolingWaterInHighTemp THEN
nSystemWarnWord3.15 := 1;
ELSE
nSystemWarnWord3.15 := 0;
END_IF
IF iCoolingWaterOutTemp >iCoolingWaterOutHighTemp THEN
nSystemWarnWord4.0 := TRUE;
ELSE
nSystemWarnWord4.0 := FALSE;
END_IF
IF iCoolingWaterOutTemp > iCoolingWaterOutHHighTemp THEN
nSystemWarnWord4.1 := TRUE;
ELSE
nSystemWarnWord4.1 := FALSE;
END_IF
IF iCoolingWaterInPressureActual < iCoolingWaterInLowPressure THEN
nSystemWarnWord4.2 := TRUE;
ELSE
nSystemWarnWord4.2 := FALSE;
END_IF
IF iCoolingWaterInPressureActual < iCoolingWaterInLLowPressure THEN
nSystemWarnWord4.3 := TRUE;
ELSE
nSystemWarnWord4.3 := FALSE;
END_IF
IF iCoolingWaterInPressureActual > iCoolingWaterInHignPressure THEN
nSystemWarnWord4.4 := TRUE;
ELSE
nSystemWarnWord4.4 := FALSE;
END_IF
IF
(iCoolingWaterInPressureActual - iCoolingWaterOutPressureActual)<iCoolingWaterLowPressureDiff THEN
nSystemWarnWord4.5 := TRUE;
ELSE
nSystemWarnWord4.5 := TRUE;
END_IF
IF
(iCoolingWaterInPressureActual - iCoolingWaterOutPressureActual)<iCoolingWaterLLowPressureDiff THEN
nSystemWarnWord4.6 := TRUE;
ELSE
nSystemWarnWord4.6 := TRUE;
END_IF
IF
(iCoolingWaterInPressureActual - iCoolingWaterOutPressureActual)>iCoolingWaterHighPressureDiff THEN
nSystemWarnWord4.7 := TRUE;
ELSE
nSystemWarnWord4.7 := TRUE;
END_IF
(******************发电电流能力计算,待补充*****************)
(******************控制柜风机故障**************************)
IF bControlCabinetFanRun = FALSE AND bStatusRun = TRUE THEN
timer7.IN := 1;
timer7.PT := T#3s;
timer7();
IF timer7.Q THEN
nSystemWarnWord3.13 := TRUE;
END_IF
END_IF
(*****************1#轴发风机故障**************************)
IF bGeneratorFan1Run = FALSE AND bStatusRun = TRUE THEN
timer8.IN := TRUE;
timer8.PT := T#2s;
timer8();
IF timer8.Q = 1 THEN
(*xa241F := true;*)(*缺,待补充*)
ELSE
END_IF
END_IF
(*****************2#轴发风机故障**************************)
IF bGeneratorFan2Run = FALSE AND bStatusRun = TRUE THEN
timer8.IN := TRUE;
timer8.PT := T#2s;
timer8();
IF timer8.Q = 1 THEN
(*xa242F := true;*)(*缺, 待补充*)
ELSE
END_IF
END_IF
END_ACTION
3.故障类型判断
整个系统共计63个报警点,分为A,B,C,D,E五类。其中A类25个,B类5个,C类3个,D类1个,E类29个。
63个报警点归为7个word变量,分别为nPowerUnitWarnWord1,nPowerUnitWarnWord2,nPowerUnitWarnWord3,nSystemWarnWord1,nSystemWarnWord2,nSystemWarnWord3,nSystemWarnWord4.定义参见文档。5类报警写成5个函数和1个功能块如下,功能块内调用函数,在主函数中调用该功能块即可。
3.1.A类故障确认F_AtypeErrorConfirm
FUNCTION F_AtypeErrorConfirm
(*IN1的输入为nPowerUnitWarnWord1*)
IN1_bit7 := F_GetBitX(IN1,7);
IN1_bit10 := F_GetBitX(IN1,7);
IN1_bit11 := F_GetBitX(IN1,7);
IN1_bit13 := F_GetBitX(IN1,7);
(*IN2的输入为nPowerUnitWarnWord2*)
IN2_bit1 := F_GetBitX(IN2,1);
IN2_bit3 := F_GetBitX(IN2,3);
IN2_bit5 := F_GetBitX(IN2,5);
IN2_bit6 := F_GetBitX(IN2,6);
IN2_bit7 := F_GetBitX(IN2,7);
IN2_bit8 := F_GetBitX(IN2,8);
IN2_bit9 := F_GetBitX(IN2,9);
IN2_bit10 := F_GetBitX(IN2,10);
IN2_bit11 := F_GetBitX(IN2,11);
(*IN3的输入为nPowerUnitWarnWord3*)
IN3_bit1 := F_GetBitX(IN3,1);
IN3_bit3 := F_GetBitX(IN3,1);
IN3_bit5 := F_GetBitX(IN3,1);
IN3_bit6 := F_GetBitX(IN3,1);
IN3_bit7 := F_GetBitX(IN3,1);
IN3_bit8 := F_GetBitX(IN3,1);
IN3_bit9 := F_GetBitX(IN3,1);
(*IN4的输入为nSystemWarnWord1*)
IN4_bit1 := F_GetBitX(IN4,1);
IN4_bit3 := F_GetBitX(IN4,3);
IN4_bit5 := F_GetBitX(IN4,5);
IN4_bit7 := F_GetBitX(IN4,7);
(*IN5的输入为nSystemWarnWord2*)
IN5_bit4 := F_GetBitX(IN5,4);
IN5_bit6 := F_GetBitX(IN5,6);
IN5_bit8 := F_GetBitX(IN5,8);
IF IN1_bit7 OR IN1_bit10 OR IN1_bit11 OR IN1_bit13
OR IN2_bit1 OR IN2_bit3 OR IN2_bit5
OR IN2_bit6 OR IN2_bit7 OR IN2_bit8
OR IN2_bit9 OR IN2_bit10 OR IN2_bit11
OR IN3_bit1 OR IN3_bit3 OR IN3_bit5
OR IN3_bit6 OR IN3_bit7 OR IN3_bit8
OR IN3_bit9
OR IN4_bit1 OR IN4_bit3 OR IN4_bit5
OR IN4_bit7
OR IN5_bit4 OR IN5_bit6 OR IN5_bit8
THEN
F_AtypeErrorConfirm := 1;
ELSE
F_AtypeErrorConfirm := 0;
END_IF
END_FUNCTION
3.2.B类故障确认F_BtypeErrorConfirm
FUNCTION F_BtypeErrorConfirm
IN1_bit13 := F_GetBitX(IN1,13);
IN2_bit1 := F_GetBitX(IN2,1);
IN2_bit6 := F_GetBitX(IN2,6);
IF IN1_bit13 OR IN2_bit1 OR IN2_bit6 (*缺xA241F,xA242F*)
THEN
F_BtypeErrorConfirm := 1;
ELSE
F_BtypeErrorConfirm := 0;
END_IF
END_FUNCTION
3.3.C类故障确认F_CtypeErrorConfirm
FUNCTION F_CtypeErrorConfirm
IN1_bit1 := F_GetBitX(IN1,1);
IN1_bit2 := F_GetBitX(IN1,2);
IN2_bit3 := F_GetBitX(IN2,3);
IF IN1_bit1 OR IN1_bit2 OR IN2_bit3
THEN
F_CtypeErrorConfirm := 1;
ELSE
F_CtypeErrorConfirm := 0;
END_IF
END_FUNCTION
3.4.D类故障确认F_DtypeErrorConfirm
FUNCTION F_DtypeErrorConfirm
IN1_bit0 := F_GetBitX(IN1,0); (*D类报警仅有一个xC201B,未定义,待定*)
IF IN1_bit0
THEN
F_DtypeErrorConfirm := 1;
ELSE
F_DtypeErrorConfirm := 0;
END_IF
END_FUNCTION
3.5.E类故障确认F_EtypeErrorConfirm
FUNCTION F_EtypeErrorConfirm
(*IN1的输入为nSystemWarnWord1*)
IN1_bit0 := F_GetBitX(IN1,0);
IN1_bit2 := F_GetBitX(IN1,2);
IN1_bit4 := F_GetBitX(IN1,4);
IN1_bit6 := F_GetBitX(IN1,6);
IN1_bit8 := F_GetBitX(IN1,8);
IN1_bit9 := F_GetBitX(IN1,9);
IN1_bit10 := F_GetBitX(IN1,10);
IN1_bit12 := F_GetBitX(IN1,12);
IN1_bit13 := F_GetBitX(IN1,13);
(*IN2的输入为nSystemWarnWord2*)
IN2_bit0 := F_GetBitX(IN2,0);
IN2_bit3 := F_GetBitX(IN2,3);
IN2_bit5 := F_GetBitX(IN2,5);
IN2_bit7 := F_GetBitX(IN2,7);
(*IN3的输入为nSystemWarnWord3*)
IN3_bit3 := F_GetBitX(IN3,3);
IN3_bit5 := F_GetBitX(IN3,5);
IN3_bit7 := F_GetBitX(IN3,7);
IN3_bit14 := F_GetBitX(IN3,14);
IN3_bit15 := F_GetBitX(IN3,15);
(*IN4的输入为nSystemWarnWord4*)
IN4_bit0 := F_GetBitX(IN4,0);
IN4_bit2 := F_GetBitX(IN4,2);
IN4_bit4 := F_GetBitX(IN4,4);
IN4_bit5 := F_GetBitX(IN4,5);
IN4_bit7 := F_GetBitX(IN4,7);
IN4_bit8 := F_GetBitX(IN4,8);
(*IN5的输入为nPowerUintWarnWord1*)
IN5_bit12 := F_GetBitX(IN5,12);
IN5_bit14 := F_GetBitX(IN5,14);
IF IN1_bit0 OR IN1_bit2 OR IN1_bit4 OR
IN1_bit6 OR IN1_bit8 OR IN1_bit9 OR
IN1_bit10 OR IN1_bit12 OR IN1_bit13 OR
IN2_bit0 OR IN2_bit3 OR IN2_bit5 OR
IN2_bit7 OR
IN3_bit3 OR IN3_bit5 OR IN3_bit7 OR
IN3_bit14 OR IN3_bit15 OR
IN4_bit0 OR IN4_bit2 OR IN4_bit4 OR
IN4_bit5 OR IN4_bit7 OR IN4_bit8 OR
IN5_bit12 OR IN5_bit14
THEN
F_EtypeErrorConfirm := 1;
ELSE
F_EtypeErrorConfirm := 0;
END_IF
END_FUNCTION
3.6.故障类型判断FB_Error
FUNCTION_BLOCK FB_Error
IF
F_AtypeErrorConfirm(IN1,IN2,IN3,IN4,IN5) = 1 (*A类故障判断*)
THEN
OUT1 := A;
OUT2 := TRUE;
ELSIF
F_BtypeErrorConfirm(IN6,IN7) = 1 (*B类故障判断*)
THEN
OUT1 := B;
OUT2 := TRUE;
ELSIF
F_CtypeErrorConfirm(IN4,IN5) = 1 (*C类故障判断*)
THEN
OUT1 := C;
ELSIF
F_DtypeErrorConfirm(IN5) = 1 (*D类故障判断*)
THEN
OUT1 := D;
ELSIF
F_EtypeErrorConfirm(IN5,IN5,IN6,IN7,IN1) = 1 (*E类故障判断*)
THEN
OUT1 := E;
END_IF
END_FUNCTION_BLOCK
4.状态判断
状态判断部分写成一个功能块如下,在主程序中调用即可。
FB_StateJudge
FUNCTION_BLOCK FB_StateJudge
IF IN_nPowerUnitStatusWord = Stopped_Status
THEN
OUT_bStatusRun := FALSE;
ELSIF OUT_bStatusRun = 1 (*xS072为BOOL类型,不能取值为2*)
THEN
OUT_bStatusRun := TRUE;
END_IF
IF IN_bStatusRun = FALSE AND IN_bStatusFault = FALSE AND IN_bMainSwitchStatus = FALSE AND IN_iSpeedActual >= IN_iGenStartSpeed
THEN
OUT_bStatusReady := TRUE;
ELSE
OUT_bStatusReady := FALSE;
END_IF
IF IN_bMainSwitchStatus = TRUE
THEN
IF IN_bEngine1SwitchStatus OR IN_bEngine2SwitchStatus OR IN_bEngine3SwitchStatus
THEN
IN_eParallelStatus := ShaftGenOnOnly;
ELSE
IN_eParallelStatus := ShaftGenAndDieselGenOn;
END_IF
ELSE
IN_eParallelStatus := ShaftGenOff;
END_IF
END_FUNCTION_BLOCK
5.故障处理
故障处理部分主要包括停轴发和启动备用发电机两个流程,分别写成两个Action,在主程序中调用。
5.1.停轴发StopAxis
ACTION StopAxis:
CASE Step OF
0:
IF eErrorType=A THEN (*command = eErrorType*)
Step := 5;
END_IF
5:
IF bMainSwitchStatus = TRUE THEN (*xs601 bMainSwitchStatus*)
Step := 10;
ELSE
Step := 30;
END_IF
(* CASE SubStep OF 0: *)
10:
timer1.IN := 1;
timer1.PT := T#3000ms;
timer1();
IF timer1.Q =1 THEN
Step := 20;
END_IF
20:
timer2.IN := 1;
timer2.PT := T#500ms;
timer2();
IF timer2.Q =1 THEN
Step := 30;
ELSE
Step := 255;
END_IF
(*AxisStop.Input.Funs.ton1.IN := AxisStop.Input.Par.signal1;
AxisStop.Input.Funs.ton1.PT := AxisStop.Input.Par.time1;
AxisStop.Input.Funs.ton1();
IF AxisStop.Input.Funs.ton1.Q = 1 THEN
Step := 20;
END_IF
CASE 20:
AxisStop.Input.Funs.ton2.IN := AxisStop.Input.Par.signal2;
AxisStop.Input.Funs.ton2.PT := AxisStop.Input.Par.time2;
AxisStop.Input.Funs.ton2();
IF AxisStop.Input.Funs.ton2.Q = TRUE
Step := 30;
ELSE
Step := 255;
END_IF*)
30:
bCmdStartPowerUnit := FALSE;
IF nPowerUnitStausWord = FALSE THEN
Step := 0;
bMainSwitchStatus := 0;
ELSE
nSystemWarnWord1.10 := TRUE;
nSystemWarnWord1.11 := TRUE;
END_IF
255:
xA113F := TRUE;
Step := 30;
END_CASE
END_ACTION
5.2.起动备用发电机流程StartBackupGen
ACTION StartBackupGen:
CASE step1 OF
0:
IF eParallelStatus = ShaftGenOnOnly THEN
step1 := 10;
END_IF
10:
bCmdStartBackupGen := TRUE;
timer3.IN := TRUE;
timer3.PT := T#3000ms;
timer3();
IF timer3.Q = TRUE
THEN
bCmdStartBackupGen := FALSE;
timer3.IN:= FALSE;
step1:= 20;
END_IF
20:
timer4.IN := TRUE;
timer4.PT := T#45000ms;
timer4();
IF timer4.Q = FALSE THEN
IF bEngine1SwitchStatus= TRUE
OR bEngine2SwitchStatus=TRUE
OR bEngine3SwitchStatus =TRUE
THEN
step1 := 0;
ELSE
nSystemWarnWord1.12 := TRUE;
END_IF
END_IF
END_CASE
END_ACTION
6.操作
操作部分主要包括停轴发,启动,增频,降频,复位和紧急停车几个操作,分别写成6个Action,在主程序中调用,停轴发部分上面已经讲过,下面是其他5个操作。
6.1启动
ACTION Start:
bCmdStartPowerUnit := 1;
timer5.IN := TRUE;
timer5.PT := INT_TO_TIME (iMainSwicthDelayTime);
IF timer5.Q =TRUE THEN
IF nPowerUnitStatusWord = 2
THEN
;
ELSE
bStartFailed := TRUE;
bFaultLatch := TRUE;
bCmdStartPowerUnit := FALSE;
END_IF
END_IF
END_ACTION
6.2增频
ACTION addFreq:
IF iNoLoadFreqSetpoint < iNoloadMaxFreq
THEN
timer6.IN := TRUE;
timer6.PT := T#1000ms;
timer6();
IF timer6.Q = TRUE
THEN
iNoLoadFreqSetpoint := iNoLoadFreqSetpoint + iFreqChangeRate;
timer6.IN := FALSE;
END_IF
ELSE
;
END_IF
END_ACTION
6.3减频
ACTION decFreq:
IF iNoLoadFreqSetpoint > iNoloadMinFreq
THEN
timer6.IN := TRUE;
timer6.PT := T#1000ms;
timer6();
IF timer6.Q = TRUE
THEN
iNoLoadFreqSetpoint := iNoLoadFreqSetpoint - iFreqChangeRate;
timer6.IN := FALSE;
ELSE
;
END_IF
END_IF
END_ACTION
6.4复位
ACTION Reset:
bFaultLatch := FALSE;(*bFaultLatch xS073*)
bStartFailed := FALSE;
bStopFailed := FALSE;
nSystemWarnWord1.12 := FALSE;
bCmdResetPowerCabinet := TRUE;
END_ACTION
6.5紧急停车
ACTION EmergencyStop:
bCmdStartPowerUnit := FALSE;
bFaultLatch := TRUE;
nSystemWarnWord1.11 := TRUE;
bCmdMainSwitch := TRUE;
END_ACTION
7.主程序代码
PROGRAM _CYCLIC
(* Insert code here *)
(* F_AtypeErrorConfirm();
F_BtypeErrorConfirm();
F_CtypeErrorConfirm();
F_DtypeErrorConfirm();
F_EtypeErrorConfirm(); *)
(*故障判断*)
ErrorConfirm;
(*****************************故障类型判断*************************)
fbError.IN1 := nPowerUnitWarnWord1;
fbError.IN2 := nPowerUnitWarnWord1;
fbError.IN3 := nPowerUnitWarnWord1;
fbError.IN4 := nSystemWarnWord1;
fbError.IN5 := nSystemWarnWord2;
fbError.IN6 := nSystemWarnWord3;
fbError.IN7 := nSystemWarnWord4;
fbError();
eErrorType := fbError.OUT1;
bFaultLatch := fbError.OUT2;
IF eErrorType <> 0
THEN
bStatusFault := TRUE;
ELSE
;
END_IF
(***************************状态判断*******************************)
fbStatusJudge.IN_bEngine1SwitchStatus := bEngine1SwitchStatus;
fbStatusJudge.IN_bEngine2SwitchStatus := bEngine2SwitchStatus;
fbStatusJudge.IN_bEngine3SwitchStatus := bEngine3SwitchStatus;
fbStatusJudge.IN_bMainSwitchStatus := bMainSwitchStatus;
fbStatusJudge.IN_bStatusFault := bStatusFault;
fbStatusJudge.IN_bStatusRun := bStatusRun;
fbStatusJudge.IN_eParallelStatus := eParallelStatus;
fbStatusJudge.IN_iGenStartSpeed := iGenStartSpeed;
fbStatusJudge.IN_iSpeedActual := iSpeedActual;
fbStatusJudge.IN_nPowerUnitStatusWord := nPowerUnitStatusWord;
fbStatusJudge();
bStatusReady := fbStatusJudge.OUT_bStatusReady;
bStatusRun := fbStatusJudge.OUT_bStatusRun;
(*************************故障处理********************************)
CASE test OF
1:
StopAxis;
2:
IF eParallelStatus = ShaftGenOnOnly
THEN
StartBackupGen;
ELSE
StopAxis;
END_IF
3:
IF eParallelStatus = ShaftGenOnOnly
THEN
StartBackupGen;
ELSE;
END_IF
4:
StartBackupGen ;
ELSE
;
END_CASE;
(***********************起动************************************)
IF
bStart=TRUE AND bStatusReady =TRUE AND bStop = FALSE
THEN
Start;
END_IF
(***********************停止************************************)
IF bStop = TRUE AND bStatusRun = TRUE
THEN
StopAxis;
END_IF
(**********************增频或降频*******************************)
IF bFreq_Add
THEN
addFreq;
END_IF
IF bFreq_Dec
THEN
decFreq;
END_IF
(**********************复位*************************************)
IF bReset
THEN
Reset;
END_IF
(**********************紧急停车*********************************)
IF bEmergencyStop
THEN
EmergencyStop;
END_IF
END_PROGRAM