• Object_Pascal_西门子SCL应用_系列3_SCL程序中的块结构


            前些天写了一篇关于西门子SCL应用_系列2的随笔, 被系统通知为涉嫌进行广告推广, 感觉怪怪的..........

            说实话,我目前虽然从事自动化工控,但是自己目前对这个不是很感兴趣, 那篇文章中给出的几个链接的厂家都与我没有任何联系,同时我提到的几个厂家

    也与我没有任何联系; 当时只是为了向大家介绍一下工控的实际面目和说明中国工业控制与国外的差距,绝对没有推广的意思.........

           嘻嘻.......

           几天继续我们的SCL之旅, 今天主要简单的描述一下FB、FC和OB的结构和几点要点, 说的不对的地方,欢迎各位拍砖..........

    4.4.6  功能块FB的结构
       功能块的特点: 功能块是进行计算的函数,含有程序部分,并且具有时间域持续的数据存储区域,当FB块被调用时必须有一块指定给FB访问的数据块,
    这个数据块就是实例数据块,也称作背景数据块,如果不改变背景数据块的内容,则其数据不会自动消失和改变。 当定义FB的接口部分(声明部分)时,

    就决定了FB块实例数据块的结构,西门子规范使用FB的接口部分(声明部分)为模板来定义与之对应的背景数据块。
    4.4.6.1  功能块的声明/定义
       在SCL中可以通过两个关键字来声明/定义FB块:
        1) PROGRAM:
        2)FUNCTION_BLOCK
    在关键字FUNCTION_BLOCK和PROGRAM之后紧跟关键字FB,跟上一个块号或FB的符号名。 块号是0到65533之间的一个数值。
    其具体的定义格式为:
       PROGRAM  FBxx
       ....
       END_PROGRAM

       FUNCTION_BLOCK FBxx
       ...
       END_FUNCTION_BLOCK

    Exp:
       FUNCTION_BLOCK  FB1
       ....
       END_FUNCTION_BLOCK

       FUNCTION_BLOCK  MOTOR_Control
       ...
       END_FUNCTION_BLOCK

      
       PROGRAM  FB10
       ...
       END_PROGRAM

    4.4.6.2 功能块的声明部分/接口部分
       FB的声明部分用来定义FB块的专有数据, 声明部分应该按照声明部分的规范详细描述,以使FB块的
    功能完善。
       FB块的声明部分/接口部分决定FB实例数据块/背景数据块的结构。
    4.4.6.3  FB块的实例
    Exp:

      FUNCTION_BLOCK   GetSqrt
      VAR_INPUT
        INPUT:REAL:=O.O;
      END_VAR
     
      VAR_OUTPUT
        ROOT:REAL:=0.0;
        RetFlag:BOOL;
      END_VAR
     
      BEGIN
          IF INPUT=0.0 THEN
              ROOT:=0.0;
              RetFlag:=TRUE;
          ELSEIF INPUT<0.0 THEN
              RetFlag:=FALSE;
          ELSE
              ROOT:=SQRT(INPUT);
              RetFlag:=TRUE;
          END_IF
      END_FUNCTION_BLOCK

    4.4.6.4  FB块的调用
       FB块的调用需要给接口部分的参数指定相应的实际参数,同时还需要指定对应的背景数据块。
    Exp:
            GetSqrt.DB11
                 (INPUT:=81.0,
                   ROOT:=ReRoot,
                   RetFlag:=bRetFlag);

    Tip: 注意FB调用时背景数据块的格式。

    4.4.7  函数FC的结构(功能的结构)
        函数是一个实现一定逻辑功能的块,在被调用时不需要指定实例数据块,对比FB,函数FC可以具有返回值
    函数FC块可以像变量一样在表达式中使用,定义为VOID类型的函数没有返回值。
    4.4.7.1 定义函数
        通过关键字FUNCTION来定义函数,
        在关键字FUNCTION之后可以通过关键字FC作为函数的标识符,后面跟一个块号或函数的符号名,
    块号与FB的块号一样,取值范围为0~65533
    Exp:
        FUNCTION   GetSqr:REAL
        ......
        END_FUNCTION

        FUNCTION FC10:VOID
        ....
        END_FUNCTION
    Tip:
        1)函数的返回值类型不能是结构体和数组类型,可以为其他任何数据类型。
        2)如果不要求返回值的函数则定义为VOID类型
    4.4.7.2  函数是声明部分/接口部分
        1)函数的声明部分用来声明/定义本地变量。
        2)函数的声明部分有输入参数、输出参数、输入输出参数、常量、标号、零时变量
    4.4.7.3 FC的代码部分
        1) 必须在代码部分把一个值赋值给函数名, 即函数是返回值是通过函数名返回的
        2)VOID类型的函数不需要返回值
    Exp:
         FUNCTION GetSqr:REAL
         VAR_INPUT
             IN:REAL:=0.0;
         END_VAR

          BEGIN
              GetSqr:=IN*IN;
          END_FUNCTION

    4.4.8 组织块的结构
      在西门子PLC的体系结构中,OB块相当于计算机世界的中断(实际上第一代S7 200的PLC采用的就
    是Intel 8086的CPU)。
      在所有的OB块里面,有一个特殊的组织块OB1, 这个就是西门子S7 300/400 PLC用户程序的入口点,
    用户程序从OB1开始执行,同时最终从OB1中结束。
      西门子PLC在执行完一次OB1循环以后,接下来还会进行OB1的执行, 即OB1循环执行,直到用户将PLC
    从Run状态选择到Stop状态。
      其他的OB会在产生硬件和软件中断时自动调用执行,这个和计算机里面的情况有点类似。
      组织块提供了操作系统和用户程序间的接口,为用户程序提供系统功能。
    4.4.8.1 组织块的定义
      组织块通过关键字ORGANIZATION来定义,
      在关键字ORGANIZATION之后,键入关键字OB作为OB的标识符,后面跟一个OB块号,或者用
    OB块的符号名定义。 OB块的编号是1到65533之间的一个数字。
    Exp:
        ORGANIZATION_BLOCK OB1
        ...
        END_ORGANIZATION_BLOCK
       
        ORGANIZATION ALARM
    4.4.8.2 组织块的声明部分
        OB的声明部分用来对本地数据: 临时变量、常量和标号进行定义
        为了保证OB块的正常运行,每个OB块的声明部分均为操作系统要求20个字节的本地数据,
    因此必须声明一个带标识符的数组,如果是通过插入OB块的模板,这些声明将自动生成。
    Exp:
       ORGANIZATION_BLOCK OB1
       VAR_TEMP
         HEADER:ARRAY[1..20] OF BYTE;   //定义系统需要的二十个字节
       END_VAR
       BEGIN
            FB13.DB13(V1:=7);
       END_ORGANIZATION_BLOCK

            以上内容,需要有一定的PLC编程的基础知识才能理解, 其中PLC的工作方式是循环工作的,这个就不在描述,如果

    有兴趣可以参阅相关的书籍。

  • 相关阅读:
    MQTT Retained消息和LWT和Keep Alive(转)
    ant design 1.x中走马灯记录
    通过Array构造指定长度的数组
    Unicode编码与中文的相互转换
    在谷歌控制台调试代码如何换行
    辅助工具
    vue中扩展函数,除了原有的事件中传的参数增加自己传的参数
    使用allparis正交法,生成测试用例
    vue 字写的tab切换两个列表,在IOS上出现列表数据错乱的问题。
    Redis中的原子操作(2)redis中使用Lua脚本保证命令原子性
  • 原文地址:https://www.cnblogs.com/volcanol/p/2091685.html
Copyright © 2020-2023  润新知