回复:【分享】SCL编写模拟量监视功能块,用于S7-300

宁超

  • 帖子

    1009
  • 精华

    39
  • 被关注

    374

论坛等级:至圣

注册时间:2012-12-11

普通 普通 如何晋级?

发布于 2016-05-26 19:32:50

1楼


BEGIN;

//S7300/400以及采用CFC编程方式不同,启动程序不一样,S7300启动运行周期递减为

//启动时减负CPU,不调用AlarmSQ功能块

   IF RunUpCyc > 0 THEN

      RunUpCyc:=RunUpCyc - 1;

   END_IF;   

//交换操作双字高低字节

// Change lowbyte to highbyte for HMI command word ==================

    OPdwCmdHMI := OP_dwCmd;

    OPabyCmdPLC[0] := OPabyCmdHMI[3];

    OPabyCmdPLC[1] := OPabyCmdHMI[2];

    OPabyCmdPLC[2] := OPabyCmdHMI[1];

    OPabyCmdPLC[3] := OPabyCmdHMI[0];

    

// Begin: Operation functions ***************************************************

//面板选择使能消息复选框

    IF (OPabCmdPLC[12] ) THEN 

        HHA_EN := NOT  HHA_EN;

    END_IF;

                

    IF (OPabCmdPLC[13] ) THEN 

         HW_EN := NOT  HW_EN;

    END_IF;

                

    IF (OPabCmdPLC[14] ) THEN 

         LW_EN := NOT  LW_EN;

    END_IF;

                                  

    IF (OPabCmdPLC[15] ) THEN 

        LLA_EN := NOT  LLA_EN;

    END_IF;   

//仿真操作

    IF OPabCmdPLC[10]  THEN 

       SimOn:= TRUE;

    ELSIF  OPabCmdPLC[11]  THEN

       SimOn:= FALSE; 

    END_IF;                

// END: Operation functions *****************************************************


//滞后,按百分比计算    

    QHys := Hys * (PVHR - PVLR) / 100.0;

//过程值的选择(仿真值/过程值)

    IF SimOn THEN 

       PV_OUT:=SimPV;

    ELSE

       PV_OUT:=PV;

    END_IF; 

//零点死区,切除小信号          

   IF ABS(PV_OUT) <= Deadband THEN 

       PV_OUT:=0.0 ;

   END_IF;  

//报警以及警告到达上升沿复位计时器

    HHLLA_C:=  ((PV_OUT >= HHA) AND HHA_EN ) OR

               ((PV_OUT <= LLA) AND LLA_EN );

    HLW_C  :=  ((PV_OUT >= HW ) AND HW_EN  ) OR 

               ((PV_OUT <= LW ) AND LW_EN  );  

                

    HHLLA_G:=  ((PV_OUT < (HHA - QHys)) AND HHA_EN ) OR

               ((PV_OUT > (LLA + QHys)) AND LLA_EN );

    HLW_G  :=  ((PV_OUT < (HW  - QHys)) AND HW_EN  ) OR

               ((PV_OUT > (LW  + QHys)) AND LW_EN  ); 

    

    IF HHLLA_C AND NOT FP_1 THEN  ADCT1:=0.0; END_IF;

    IF HLW_C   AND NOT FP_2 THEN  WDCT1:=0.0; END_IF;

    IF HHLLA_G AND NOT FP_3 THEN  ADGT1:=0.0; END_IF;

    IF HLW_G   AND NOT FP_4 THEN  WDGT1:=0.0; END_IF;    

//高高报警的到达以及离开       

    IF HHA_EN THEN      

             IF (PV_OUT >= HHA) AND NOT  QHHA AND PULSE AND NOT FP_Pulse THEN

                ADCT1:=ADCT1+SAMPLE_T;

                IF ADCT1 > ADCT THEN 

                QHHA := TRUE;

                ADCT1:= 0.0;

                END_IF;

            ELSIF (PV_OUT < (HHA - QHys))AND QHHA AND PULSE AND NOT FP_Pulse  THEN

                ADGT1:=ADGT1+SAMPLE_T;

                IF ADGT1 > ADGT THEN 

                QHHA := FALSE;

                ADGT1:= 0.0;

                END_IF;   

            END_IF; 

     ELSE

         QHHA:=FALSE; 

     END_IF; 

//高警告的到达以及离开             

     IF HW_EN THEN 

            IF (PV_OUT >= HW) AND NOT  QHW AND PULSE AND NOT FP_Pulse THEN

                WDCT1:=WDCT1+SAMPLE_T;

                IF WDCT1 > WDCT THEN 

                QHW := TRUE;

                WDCT1:=0.0;

                END_IF;

            ELSIF (PV_OUT < (HW - QHys))AND QHW AND PULSE AND NOT FP_Pulse  THEN

                WDGT1:=WDGT1+SAMPLE_T;

                IF WDGT1 > WDGT THEN 

                QHW := FALSE;

                WDGT1:=0.0;

                END_IF;

            END_IF; 

       ELSE

            QHW:=FALSE;

       END_IF;           

//LW ============================================================ 

  IF LW_EN then

            IF (PV_OUT <= LW) AND NOT  QLW AND PULSE AND NOT FP_Pulse THEN

                WDCT1:=WDCT1+SAMPLE_T;

                IF WDCT1 > WDCT THEN 

                QLW := TRUE;

                WDCT1:=0.0;

                END_IF;

            ELSIF (PV_OUT > (LW + QHys))AND QLW AND PULSE AND NOT FP_Pulse  THEN

                WDGT1:=WDGT1+SAMPLE_T;

                IF WDGT1 > WDGT THEN 

                QLW := FALSE;

                WDGT1:=0.0;

                END_IF;   

            END_IF; 

    ELSE

        QLW:=FALSE;

    END_IF;              

//LLA ============================================================

    IF LLA_EN THEN 

            IF (PV_OUT <= LLA ) AND NOT  QLLA AND PULSE AND NOT FP_Pulse THEN

                ADCT1:=ADCT1+SAMPLE_T;

                IF ADCT1 > ADCT THEN 

                QLLA := TRUE;

                ADCT1:=0.0;

                END_IF;

            ELSIF (PV_OUT > (LLA + QHys))AND QLLA AND PULSE AND NOT FP_Pulse  THEN

                ADGT1:=ADGT1+SAMPLE_T;

                IF ADGT1 > ADGT THEN 

                QLLA := FALSE;

                ADGT1:=0.0;

                END_IF;

            END_IF; 

    ELSE 

        QLLA:=FALSE;

    END_IF;  

//操作按钮的权限控制            

    QabPermPLC[10] := NOT SimOn ;    

    QabPermPLC[11] :=     SimOn ; 

    

    QabyPerm[0] :=QabyPermPLC[3];

    QabyPerm[1] :=QabyPermPLC[2];

    QabyPerm[2] :=QabyPermPLC[1];

    QabyPerm[3] :=QabyPermPLC[0];

//状态字

    QabStatePLC[0]  := QHHA;     // H Alarm is active  

    QabStatePLC[1]  := QHW;      // H Warning is active 

    QabStatePLC[2]  := QLW;      // L Warning is active   

    QabStatePLC[3]  := QLLA;     // L Alarm is active 

    QabStatePLC[4]  := 0;         

    QabStatePLC[5]  := 0;     

    QabStatePLC[6]  := 0;    

    QabStatePLC[7]  := 0;

    QabStatePLC[8]  := 0;      

    QabStatePLC[9]  := 0;    

    QabStatePLC[10] := 0;     // Simulation ON

    QabStatePLC[11] := 0;

    QabStatePLC[12] := HHA_EN;    // 1=H Alarm Message enable

    QabStatePLC[13] := HW_EN;     // 1=H Warning Message enable

    QabStatePLC[14] := LW_EN;     // 1=L Warning Message enable

    QabStatePLC[15] := LLA_EN;    // 1=L Alarm Message enable  

    QabStatePLC[16] := 0;

    QabStatePLC[17] := 0;

    QabStatePLC[18] := SimOn;           

    QabStatePLC[19] := 0;

    QabStatePLC[20] := 0;

    QabStatePLC[21] := 0;

    QabStatePLC[22] := 0;

    QabStatePLC[23] := 0;

    QabStatePLC[24] := 0;  

    QabStatePLC[25] := 0;      

    QabStatePLC[26] := 0;        

    QabStatePLC[27] := 0;         

    QabStatePLC[28] := 0;

    QabStatePLC[29] := 0;

    QabStatePLC[30] := 0;

    QabStatePLC[31] := 0;

    QabyState[0] :=QabyStatePLC[3];

    QabyState[1] :=QabyStatePLC[2];

    QabyState[2] :=QabyStatePLC[1];

    QabyState[3] :=QabyStatePLC[0];

//报警消息处理 

         MsgEff1[0]:=QHHA;

         MsgEff1[1]:=QHW;

         MsgEff1[2]:=QLW;

         MsgEff1[3]:=QLLA;

         MsgEff1[4]:=FALSE;

         MsgEff1[5]:=FALSE;

         MsgEff1[6]:=FALSE;

         MsgEff1[7]:=FALSE;      

   IF (RunUpCyc = 0)  AND (MsgEffOld<>MsgEff)THEN   

            IF (MsgEff AND 16#01) <> ( MsgEffOld AND 16#01)THEN 

            iRet1:=  ALARM_SQ(SIG := MsgEff1[0]  // IN: BOOL

                     ,ID :=W#16#EEEE  // IN: WORD

                     ,EV_ID :=MsgEvID1  // IN: DWORD

                     ,SD :=SD1  // IN: ANY

                     ); // INT

            END_IF;

            IF  (MsgEff AND 16#02) <> ( MsgEffOld AND 16#02) THEN   

            iRet2:=   ALARM_SQ(SIG :=MsgEff1[1]   // IN: BOOL

                      ,ID :=W#16#EEEE  // IN: WORD

                      ,EV_ID :=MsgEvID2  // IN: DWORD

                      ,SD :=SD2  // IN: ANY

                      ); // INT

             END_IF; 

             IF  (MsgEff AND 16#04) <> ( MsgEffOld AND 16#04)THEN  

             iRet3:=  ALARM_SQ(SIG :=MsgEff1[2]   // IN: BOOL

                     ,ID :=W#16#EEEE  // IN: WORD

                     ,EV_ID :=MsgEvID3  // IN: DWORD

                     ,SD :=SD3  // IN: ANY

                     ); // INT  

             END_IF;    

             IF  (MsgEff AND 16#08) <> ( MsgEffOld AND 16#08)THEN  

             iRet4:=  ALARM_SQ(SIG :=MsgEff1[3]   // IN: BOOL

                     ,ID :=W#16#EEEE  // IN: WORD

                     ,EV_ID :=MsgEvID4  // IN: DWORD

                     ,SD :=SD4  // IN: ANY

                     ); // INT  

             END_IF;                                             

    END_IF;  

    MsgEffOld:=MsgEff ;  

    //上升沿检测     

    FP_1 := HHLLA_C;

    FP_2 := HLW_C;

    FP_3 := HHLLA_G;

    FP_4 := HLW_G;

    FP_Pulse := Pulse;

   //复位操作命令

    OP_dwCmd := 16#0;    

END_FUNCTION_BLOCK

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54789条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。