SCL编写的阀门块实例

13 篇文章 6 订阅
6 篇文章 2 订阅

 发一个以前做项目用SCL编写的阀门块。

FUNCTION_BLOCK Z_VALVE_300//FB530

NAME:VALVE
FAMILY:WR
AUTHOR:ZYG
//VERSION:'0.1'
//FB 530
//date:2014/5/28
// Typical-Attribute
{
  S7_tasklist:='OB100';
  S7_m_c:='true';
  S7_blockview:='big'
}

// Parameterattribute
// S7_visible       sichtbar/unsichtbar (default='true')
// S7_m_c           WinCC - Tag         (default='false')
// S7_dynamic       Testmodus           (default='false')
VAR_INPUT
    AUTO        {S7_dynamic:='true'} : BOOL := FALSE; // Interlock
    MAN         {S7_dynamic:='true'} : BOOL := FALSE; // External Error
    LOCAL       {S7_dynamic:='true'} : BOOL := FALSE; // 0=DCS 1=LocalLinking
    
    M_OPEN      {S7_dynamic:='true'} : BOOL := FALSE; // 1=CMD OPEN Manual
    A_OPEN      {S7_dynamic:='true'} : BOOL := FALSE; // 1=CMD OPEN Automatic
    L_OPEN      {S7_dynamic:='true'} : BOOL := FALSE; // 
    
    M_CLOSE     {S7_dynamic:='true'} : BOOL := FALSE; // 1=Reset Error Peripherie
    A_CLOSE     {S7_dynamic:='true'} : BOOL := FALSE; // 
    L_CLOSE     {S7_dynamic:='true'} : BOOL := FALSE; // 
    
    RESET       {S7_dynamic:='true'} : BOOL := FALSE; // 
    FB_OPEN     {S7_dynamic:='true'} : BOOL := FALSE; // Feedback VALVE open
    FB_CLOSE    {S7_dynamic:='true'} : BOOL := TRUE;  // Feedback VALVE close
    L_MON       {S7_dynamic:='true'} : BOOL := TRUE;  // 1=Monitoring Feedback OPEN
    MON_T       {S7_dynamic:='true'; S7_m_c := 'true'} : REAL := 10.0; // Monitoring Time
    L_SIM       {S7_dynamic:='true'} : BOOL := FALSE; // 0=Normal 1=Simulation
    
    //LOCK        {S7_dynamic:='true'} : BOOL := FALSE; // Interlock
    IL_LIM      {S7_dynamic:='true'} : BOOL := FALSE; // Interlock
    IL_ABS      {S7_dynamic:='true'} : BOOL := FALSE; // Interlock
    
    
    
    //ERR_EXTERN  {S7_dynamic:='true'} : BOOL := FALSE; // External Error
    //LIOP_SEL    {S7_dynamic:='true'} : BOOL := FALSE; // 0=Operator 1=Linking
   // L_AUT       {S7_dynamic:='true'} : BOOL := FALSE; // 0=Manual 1=Automatic
    //L_REMOTE    {S7_dynamic:='true'} : BOOL := FALSE; // 0=Lokal 1=Remote
    //L_SIM       {S7_dynamic:='true'} : BOOL := FALSE; // 0=Normal 1=Simulation
    //L_RESET     {S7_dynamic:='true'} : BOOL := FALSE; // 1=Reset Error Peripherie
    //AUT_OP      {S7_dynamic:='true'} : BOOL := FALSE; // 1=CMD OPEN Automatic
    //MAN_OP      {S7_dynamic:='true'} : BOOL := FALSE; // 1=CMD OPEN Manual
    //SIM_OP      {S7_dynamic:='true'} : BOOL := FALSE; // 1=CMD OPEN Simulation
    //FB_OPEN     {S7_dynamic:='true'} : BOOL := FALSE; // Feedback VALVE open
    //FB_CLOSE    {S7_dynamic:='true'} : BOOL := TRUE;  // Feedback VALVE close
    //L_MON       {S7_dynamic:='true'} : BOOL := TRUE;  // 1=Monitoring Feedback OPEN
    //MON_T       {S7_dynamic:='true'; S7_m_c := 'true'} : REAL := 10.0; // Monitoring Time

    SAMPLE_T    {S7_sampletime:='true'} : REAL := 0.1; // Sample Time
END_VAR

VAR_OUTPUT
    QdwState    {S7_dynamic:='true'; S7_m_c:='true'}: DWORD:=0;     // status wincc
    QabyState AT QdwState : ARRAY [0..3] OF BYTE;                   // look at state byte-wise

    QwState     {S7_dynamic:='true'}: WORD:= 0; //0=close, 1=opening, 2=open, 3=closing
    
    Q_AUTO  {S7_dynamic:='true'} : BOOL := FALSE;     // 1=Automatic    
    Q_MAN   {S7_dynamic:='true'} : BOOL := FALSE;     // 1=Man
    Q_LOCAL {S7_dynamic:='true'} : BOOL := FALSE;     // 1=LOCAL

   
    QCMD_OPEN    {S7_dynamic:='true'} : BOOL := FALSE;     // 0=Close 1=Open
    
    
    QERR_OPEN    {S7_dynamic:='true'} : BOOL := FALSE;     // 1=ERR
    QERR_CLOSE    {S7_dynamic:='true'} : BOOL := FALSE;     // 1=ERR    
    QMON        {S7_dynamic:='true'} : BOOL := FALSE;     // 1=Monitoring Feedback
    QMON_ERR    {S7_dynamic:='true'} : BOOL := FALSE;     // 1=Monitoring Error
    QMON_T1      {S7_dynamic:='true'; S7_m_c := 'true'} : REAL := 0.0; // Current Monitoring Time Feedback
    QMON_T2      {S7_dynamic:='true'; S7_m_c := 'true'} : REAL := 0.0; // Current Monitoring Time Feedback       

   // QSIM       {S7_dynamic:='true'} : BOOL := FALSE;     // 1=Simulaition is active
    QCLOSE     {S7_dynamic:='true'} : BOOL := FALSE;     // 1=Closed
    QOPENING   {S7_dynamic:='true'} : BOOL := FALSE;     // 1=Opening
    QOPEN      {S7_dynamic:='true'} : BOOL := FALSE;     // 1=Open
    QCLOSING   {S7_dynamic:='true'} : BOOL := FALSE;     // 1=Closing   
    QLOCK      {S7_dynamic:='true'} : BOOL := FALSE;     // 1=Lock is active
   // QERR       {S7_dynamic:='true'} : BOOL := FALSE;     // 1=ERROR
   // QERR_EXT   {S7_dynamic:='true'} : BOOL := FALSE;     // 1=External ERROR

   // QwAlarm    {S7_dynamic:='true'; S7_m_c := 'true'} : WORD := 16#0; // Bit Alarm Procedure
   // QabyAlarm AT QwAlarm : ARRAY [0..1] OF BYTE;         // look at QwAlarm byte-wise
END_VAR


VAR_IN_OUT
    OP_dwCmd    {S7_dynamic := 'true'; S7_m_c := 'true'} : DWORD :=0;   // control word wincc
END_VAR



VAR
    OPdwCmdHMI : DWORD := 16#0;                       // Operator Commands in HMI format
    OPabyCmdHMI AT OPdwCmdHMI : ARRAY [0..3] OF BYTE; // look at HMI command byte-wise
    OPdwCmdPLC : DWORD := 16#0;                       // Operator Commands in PLC format
    OPabyCmdPLC AT OPdwCmdPLC : ARRAY [0..3] OF BYTE; // look at plc command byte-wise
    OPabCmdPLC AT OPdwCmdPLC : ARRAY [0..31] OF BOOL; // look at plc command bit-wise
    
    QdwStatePLC : DWORD := 16#0;                        // State word in PLC format
    QabyStatePLC AT QdwStatePLC : ARRAY [0..3] OF BYTE; // look at state byte-wise
    QabStatePLC AT QdwStatePLC : ARRAY [0..31] OF BOOL; // look at state bit-wise
    
    QwAlarmPLC : WORD := 16#0;                          // Alarm Tag PLC Format
    QabyAlarmPLC AT QwAlarmPLC : ARRAY [0..1] OF BYTE;  // look at Alarm byte-wise
    QabAlarmPLC AT QwAlarmPLC : ARRAY [0..15] OF BOOL;  // look at Alarm bit-wise
        
    // TAGS for Operation?
    OP_RESET : BOOL := FALSE;
    
    // TAGS for Edge detect
    AUTO_OLD : BOOL := FALSE;    
    MAN_OLD : BOOL := FALSE;    
    SR1_Q : BOOL  :=FALSE;
    //阀门开关定义变量
    M_OPEN_OLD : BOOL := FALSE;    
    M_CLOSE_OLD : BOOL := FALSE;     
    RS2_Q : BOOL  :=FALSE;    
    RS2_S : BOOL  :=FALSE;    
    RS2_R : BOOL  :=FALSE; 
    

    
    FB_OPEN_TMP:BOOL:=FALSE;
    FB_CLOSE_TMP:BOOL:=FALSE;
    TON1_EN : BOOL :=FALSE;
    TON2_EN : BOOL :=FALSE;
    FB_OPEN_RS_Q:BOOL:=FALSE;    
    FB_CLOSE_RS_Q:BOOL:=FALSE;
    
                
    L_RESET_OLD : BOOL := FALSE;
    AUT_OP_OLD : BOOL := FALSE;
    MAN_OP_OLD : BOOL := FALSE;
    QOPENING_OLD : BOOL := FALSE;
    QCLOSING_OLD : BOOL := FALSE;
    
    // TAGS for Simulation
    FB_SIM_OPEN  : BOOL := FALSE;
    FB_SIM_CLOSE : BOOL := TRUE;
    SIM_T    : REAL := 5.0;
    QCMD_SIM : BOOL := FALSE;
    QREMOTE     : BOOL := FALSE;     // 0=Local 1=Remote    
  
END_VAR


VAR_TEMP
TOP_SI: STRUCT
      EV_CLASS  : BYTE;
      EV_NUM    : BYTE;
      PRIORITY  : BYTE;
      NUM       : BYTE;
      TYP2_3    : BYTE;
      TYP1      : BYTE;
      ZI1       : WORD;
      ZI2_3     : DWORD;
END_STRUCT;

START_UP_SI: STRUCT
      EV_CLASS  : BYTE;
      EV_NUM    : BYTE;
      PRIORITY  : BYTE;
      NUM       : BYTE;
      TYP2_3    : BYTE;
      TYP1      : BYTE;
      ZI1       : WORD;
      ZI2_3     : DWORD;
END_STRUCT;
iRet          : INT;

END_VAR


BEGIN

// START UP =====================================================================
    iRet := SFC6 (TOP_SI:= TOP_SI, START_UP_SI:= START_UP_SI);
    IF (TOP_SI.NUM = 100) THEN
        
        QCMD_OPEN   := FALSE;
        QCLOSE    := TRUE;
        QOPENING  := FALSE;
        QOPEN     := FALSE;
        QCLOSING  := FALSE;
        QwState := 0;
        
        iRet := 0;
    END_IF;
// END STARTUP ==================================================================

// HMI发来的命令字节高低为转换==============
    OPdwCmdHMI := OP_dwCmd;
    OPabyCmdPLC[0] := OPabyCmdHMI[3];
    OPabyCmdPLC[1] := OPabyCmdHMI[2];
    OPabyCmdPLC[2] := OPabyCmdHMI[1];
    OPabyCmdPLC[3] := OPabyCmdHMI[0]; 
    

//手动、自动、Local处理
IF (MAN AND NOT MAN_OLD) OR OPabCmdPLC[16] THEN
    SR1_Q:=FALSE;
END_IF;

IF (AUTO AND NOT AUTO_OLD)  OR OPabCmdPLC[17] THEN
    SR1_Q:=TRUE;
END_IF;
Q_LOCAL:=LOCAL;                         //1=LOCAL,0=DCS;
Q_AUTO:=SR1_Q AND (NOT LOCAL);          //1=自动
Q_MAN:=(NOT SR1_Q) AND (NOT LOCAL);    //1=手动



//阀门打开或关闭处理======================================================
    RS2_S:=(Q_MAN AND M_OPEN AND NOT M_OPEN_OLD) //手动状态且手动输入为上升沿
            OR (Q_AUTO AND A_OPEN)              //自动状态下自动输入
            OR (LOCAL AND L_OPEN)              //Local状态且L_open输入
            OR (Q_MAN AND OPabCmdPLC[1]);       //HMI打开
            
    RS2_R:=(Q_MAN AND M_CLOSE AND NOT M_CLOSE_OLD) 
            OR (Q_AUTO AND A_CLOSE) 
            OR (Q_AUTO AND IL_LIM)
            OR (LOCAL AND L_CLOSE)
            OR  IL_ABS
            //OR RESET
            OR (Q_MAN AND OPabCmdPLC[0]);       //HMI关闭     
  
    IF RS2_S AND NOT RS2_R THEN
        RS2_Q:=TRUE;
    END_IF;
    IF RS2_R THEN
        RS2_Q:=FALSE;
    END_IF;    
    QCMD_OPEN:=RS2_Q ;       //阀门开输出命令

//-----------------------------------------------------------------
    FB_OPEN_TMP:=(FB_OPEN AND NOT L_SIM) OR (QCMD_OPEN AND L_SIM);
    FB_CLOSE_TMP:=(FB_CLOSE AND NOT L_SIM) OR (QCMD_OPEN AND L_SIM);    
    
    TON1_EN:=(NOT FB_OPEN_TMP OR FB_CLOSE_TMP) AND QCMD_OPEN ;
    TON2_EN:=(FB_OPEN_TMP OR NOT FB_CLOSE_TMP) AND NOT QCMD_OPEN ;
    
        
    IF TON1_EN  THEN    // *** Process Mode ****
        IF QMON_T1 < MON_T THEN
         QMON_T1 := QMON_T1 + SAMPLE_T;
         END_IF;
    ELSE
        QMON_T1 :=0.0;
    END_IF;
    IF (QMON_T1 >= MON_T)AND NOT (RESET OR OPabCmdPLC[7])THEN
         FB_OPEN_RS_Q := TRUE;
    ELSE
        FB_OPEN_RS_Q := FALSE;
    END_IF;
        
    IF TON2_EN THEN    // *** Process Mode ****
        IF QMON_T2 < MON_T THEN
         QMON_T2 := QMON_T2 + SAMPLE_T;
         END_IF;
    ELSE
        QMON_T2 :=0.0;
    END_IF;
    
    IF (QMON_T2 >= MON_T)AND NOT (RESET OR OPabCmdPLC[7])THEN
         FB_CLOSE_RS_Q := TRUE;
    ELSE
        FB_CLOSE_RS_Q := FALSE;
    END_IF;
    QERR_OPEN:=FB_OPEN_RS_Q;    
    QERR_CLOSE:=FB_CLOSE_RS_Q;
    QMON_ERR:=QERR_OPEN OR QERR_CLOSE;
    
//=================================
//            QwState
//0 = Close
//1 = Opening
//2 = Open
//3 = Closing
//=================================

//--------------------------
//QwState = 0; CLOSE
//--------------------------
        IF  (NOT QCMD_OPEN AND QwState=3 AND NOT QMON_ERR AND FB_CLOSE) 
           // OR (NOT QCMD_OPEN AND QwState=3 AND NOT QMON)
        THEN
            QCLOSE    := TRUE;
            QOPENING  := FALSE;
            QOPEN     := FALSE;
            QCLOSING  := FALSE;
            QwState := 0;
        END_IF;
        
//--------------------------
//QwState = 1; OPENING
//--------------------------
        IF (QCMD_OPEN AND (QwState = 0 OR QwState = 3)) THEN 
            QCLOSE    := FALSE;
            QOPENING  := TRUE;
            QOPEN     := FALSE;
            QCLOSING  := FALSE;
            QwState := 1;
        END_IF;
   
    
//--------------------------
//QwState = 2; OPEN
//--------------------------
        IF 
            (QCMD_OPEN AND QwState=1 AND NOT QMON_ERR AND FB_OPEN) 
            //OR (QCMD_OPEN AND QwState=1 AND NOT QMON)
        THEN
            QCLOSE    := FALSE;
            QOPENING  := FALSE;
            QOPEN     := TRUE;
            QCLOSING  := FALSE;
            QwState := 2;
        END_IF;
        
//--------------------------
//QwState = 3; CLOSING
//--------------------------
        IF (NOT QCMD_OPEN AND (QwState = 1 OR QwState = 2)) THEN
            QCLOSE    := FALSE;
            QOPENING  := FALSE;
            QOPEN     := FALSE;
            QCLOSING  := TRUE;
            QwState := 3;
        END_IF;

        QLOCK:=IL_LIM OR IL_ABS;

// Set State for HMI ===================================================
    QabStatePLC[0]  := QCLOSE;      // 1=Close
    QabStatePLC[1]  := QOPENING;    // 1=Opening
    QabStatePLC[2]  := QOPEN;       // 1=Open
    QabStatePLC[3]  := QCLOSING;    // 1=Closing
    QabStatePLC[4]  := 0;
    QabStatePLC[5]  := 0;
    QabStatePLC[6]  := 0;
    QabStatePLC[7]  := 0;   
    QabStatePLC[8]  := 1;//QMON;        // 1=Feedback Monitoring ON
    QabStatePLC[9]  := QMON_ERR;    // 1=Error Feedback Monitoring
    QabStatePLC[10] := 0;
    QabStatePLC[11] := 0;  
    QabStatePLC[12] := 0;
    QabStatePLC[13] := 0;
    QabStatePLC[14] := 0;
    QabStatePLC[15] := 0;
    QabStatePLC[16] := Q_AUTO;    // 0=Manual 1=Automatic
    QabStatePLC[17] := NOT LOCAL;//QREMOTE;     // 0=Local 1=Remote
    QabStatePLC[18] := L_SIM;        // 0=Process 1=Simulation
    QabStatePLC[19] := 0;
    QabStatePLC[20] := 0;
    QabStatePLC[21] := 0;
    QabStatePLC[22] := 0;
    QabStatePLC[23] := 0;
    QabStatePLC[24] := QMON_ERR;        // 1=Error
    QabStatePLC[25] := 0;//QERR_EXT;    // 1=External Error
    QabStatePLC[26] := QLOCK;       // 1=Block Locked
    QabStatePLC[27] := QLOCK;        // 1=INTERLOCK
    QabStatePLC[28] := FB_OPEN; //阀门开到位  
    QabStatePLC[29] := FB_close; //阀门关到位 
    QabStatePLC[30] := 0;
    QabStatePLC[31] := 0;
    
    QabyState[0] :=QabyStatePLC[3];
    QabyState[1] :=QabyStatePLC[2];
    QabyState[2] :=QabyStatePLC[1];
    QabyState[3] :=QabyStatePLC[0];
    
// TAGS for Edge detect==========================================
    AUTO_OLD := AUTO;   
    MAN_OLD := MAN;  
    M_OPEN_OLD:=M_OPEN;
    M_CLOSE_OLD:=M_CLOSE;  
//reset commands ================================================
    OP_dwCmd := 16#0;  
END_FUNCTION_BLOCK

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 西门子SCL(Structured Control Language)是西门子的一种编程语言,用于编写可编程逻辑控制器(PLC)的程序。SCL是一种高级结构化编程语言,可用于实现复杂的流程控制和算法。 在SCL编写流程控制主要分为以下几个步骤: 1. 编写变量定义:首先需要定义需要使用的变量,包括输入输出变量、间变量等。变量的定义包括变量名、数据类型和初始值等信息。 2. 编写函数:可以将程序分为不同的函数,每个函数可以实现不同的功能。在函数,可以编写各种控制语句和算法,包括循环语句、条件语句、计算表达式等。 3. 编写主程序:主程序是PLC运行的入口点,需要调用函数来实现流程控制。主程序可以定义各种触发条件,根据条件来调用相应的函数,并控制程序的执行流程。 4. 编写数据通信:在一些需要与外部设备进行通信的情况下,可以使用SCL编写数据通信部分的代码。数据通信可以通过读取和写入数据来实现与其他设备的数据交换。 通过以上步骤,我们可以使用SCL编写具有复杂流程控制的程序。SCL具有结构化和模化的特点,可以帮助程序员更好地组织和管理代码。同时,SCL还支持调试功能,可以在PLC上进行程序的在线测试和验证,提高了开发效率和程序的可靠性。 总结起来,西门子SCL编写流程控制的步骤包括变量定义、函数编写、主程序编写和数据通信等。通过合理使用SCL的语法和特性,可以编写出高效、可靠的PLC程序。 ### 回答2: 西门子SCL(Structured Control Language)是一种用于编写流程控制的编程语言。它是一种基于结构化编程的语言,用于控制西门子可编程逻辑控制器(PLC)的程序执行顺序。 在编写西门子SCL时,首先需要定义各种变量和数据类型。可以定义整型、浮点型、布尔型、数组等不同类型的变量,并为它们赋予初值。 接下来,根据要实现的控制逻辑,使用SCL的语法规则编写相应的程序。SCL提供了一系列结构化语句,如循环、条件判断、函数调用等,以便于程序员编写控制逻辑。使用这些语句,可以实现对输入信号的检测、对输出信号的控制以及对间变量的计算等功能。 在SCL编程,可以使用变量和常量进行运算、逻辑判断和算术计算。此外,SCL还支持循环结构,例如使用循环语句可以对一组变量进行重复操作。 编写SCL程序后,可以将程序上传到PLC进行执行。PLC会按照程序定义的顺序执行各条指令,从而实现相应的控制逻辑。如果程序出现错误或异常,PLC会根据预设的错误处理机制进行相应的处理。 总的来说,西门子SCL是一种用于编写流程控制的编程语言。通过定义变量、编写控制逻辑,并将程序上传到PLC执行,可以实现对工业自动化系统的控制。 ### 回答3: 西门子SCL(结构化控制语言)是一种用于编写PLC(可编程逻辑控制器)的流程控制程序的语言。以下是西门子SCL编写流程控制的一般步骤: 1. 首先,确定程序的需求和目标。根据应用场景和控制要求,明确需要实现的功能和流程。 2. 设计程序的程序框图。根据需求,将程序框架分解为不同的部分或功能模,确定每个模的输入输出和相互之间的关系。 3. 开始编写SCL代码。根据程序框图,按照从上到下的顺序编写代码。使用SCL编程语言的结构化特性,包括条件语句、循环语句和函数等,来实现流程控制。 4. 使用变量和数据SCL允许定义和使用变量来存储和处理数据。根据需要,声明和初始化变量,并使用它们执行计算和判断。 5. 实现输入/输出控制。PLC的主要任务是与外部设备进行交互,例如传感器和执行器。使用SCL编程,可以通过使用特定的指令和函数来读取和控制输入输出。 6. 进行调试和测试。编写SCL代码后,进行调试和测试以验证程序的正确性和功能性。可以使用PLC模拟器或连接实际设备进行测试。 7. 进行安装和部署。在调试和测试通过后,将SCL代码烧录到PLC,并根据实际情况进行安装和部署。 通过以上步骤,可以使用西门子SCL编写流程控制程序。这种编程语言具有灵活性和可扩展性,适用于各种自动化控制应用,并且能够提高PLC编程的效率和可维护性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值