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
原创粉丝点击