前些天写了一篇关于西门子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的工作方式是循环工作的,这个就不在描述,如果
有兴趣可以参阅相关的书籍。