PLC项目代码说明
来源:互联网 发布:网络电视如何看央视 编辑:程序博客网 时间:2024/05/22 00:06
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_IFIF(S2=0)THEN MBMClose_xx.enable:=1; MBMClose_xx.ident:=MBMOpen_xx.ident; MBMClose_xx();END_IFEND_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_IFEND_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_IFEND_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_IFEND_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_IFEND_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_IFEND_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_CASEEND_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_IFEND_CASEEND_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_IFEND_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_IFEND_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_IFEND_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_IFEND_PROGRAM
0 0
- PLC项目代码说明
- PLC项目篇
- nxt-代码解析-安装后项目说明
- plc
- Plc
- PLC
- PLC
- PLC
- PLC
- CANfestival被开源PLC项目Beremiz采用
- PLC项目增频减频部分流程图(修改版)
- 西门子300 PLC 功能块及背景数据块的说明
- 严重性代码说明项目文件行错误C4996'strcpy'
- 【C++】严重性代码说明项目文件行错误
- 项目说明
- 项目说明
- 代码说明
- 【Qt项目】串口通信:PLC对LPC的音量控制
- HDFS Append File
- android平台的视频播放库LanSoSdk发布地址.
- struts2拦截器
- Android——自定义左右菜单的实现
- C语言版字符串查找函数,字符串中查找子串
- PLC项目代码说明
- 第17章 输入输出和文件
- 正向最大匹配中文分词算法
- odex转dex
- docker使用总结
- crontab的正确使用
- c++ primer第五版(中文)习题答案 第三章第一节-命名空间using声明
- Java中native关键字的使用
- XMPP框架 微信项目开发之Socket聊天室发送数据——获取键盘高度,修改控件的约束值,代码滚动UITabView到指定位置