通常,在编写程序时会多次重复使用某些程序块,这些程序块可以用子程序的方式创建。SIMOTION设备的一个或多个程序(如MCC,LAD/FBD,ST程序)可以根据需要重复调用子程序,调用子程序的示意图如图10-50所示。
图10-50 子程序的执行
当调用子程序时,程序分支从当前任务跳转到子程序,开始执行其中的指令,执行完毕后跳转回原来激活的任务。
FC(Function)是一个无静态数据的子程序,即当FC执行后所有本地变量的值就丢失了,当FC下次执行时再进行初始化。可使用输入参数或输入/输出参数把数据传入FC,也可输出FC的返回值,通过传递参数或全局变量在子程序和调用程序间传递信息。
FB(Function Block)是一个有静态数据的子程序,即当FB执行后,所有的本地变量会保持它们原有的值,只有那些明确声明为临时变量的值会丢失。在使用FB之前,必须定义一个背景数据块,然后输入FB的名称作为数据类型。FB的静态数据存储在此背景数据块中。可以定义多个FB背景数据块,每个背景数据块相对独立。FB背景数据块的静态数据一直保持,直到该背景数据块再次调用。
下面分别介绍在MCC、LAD/FBD、ST编程语言下如何创建和使用FC、FB块。
1.使用MCC语言创建和使用FC
下面举例说明如何使用MCC语言创建和使用FC,首先创建一个计算圆周长的子程序,程序类型为FC,名称为Circumference。此圆周长计算可作为子程序在任何程序任务中调用。
圆周长计算公式为:Circumference=PI×2×radius
可在FC变量声明表中定义Radius(半径)和PI(π,圆周率)的值。
首先打开SCOUT,创建一个新项目。在“PROGRAMS”目录树下双击“Insert MCC unit”,插入一个MCC单元如图10-51所示,“Name”栏名称为“MCCunit_1”,单击“OK”
图10-51 插入MCC单元
用鼠标左键双击“Insert MCC chart”,插入一个程序,程序名为“Circumference”,创建类型(Creation type)选择“Function”,返回类型(Return type)选择“REAL”,若选择“<-->”则无返回值。
检查Exportable选项,如果此FC程序将要在其他程序源文件中使用则勾选此选项;如果没有勾选此选项,则此程序只能在本MCC单元中使用。
此外,还可以输入作者,版本和注释等。最后单击“OK”按钮确认,如图10-52所示。
在创建的FC程序变量声明表中定义半径(radius)的变量类型为输入“VAR_INPUT”,数据类型为“REAL”;圆周率PI的变量类型为常数“VAR CONSTANT”,数据类型为“RE-AL”,初始值为“3.14159”,如图10-53所示。
编写变量赋值程序(见图10-54)并赋给返回值,然后编译保存。至此,FC程序就编写完毕了。
下面介绍如何在用户程序中调用上述FC程序。在同一“MCC unit”下插入一个新的程序名为“Program_circumference”,创建类型(Creation type)选择“Program”,如图10-55所示。
在“MCC unit”或“MCC chart”中声明下列变量(本例在MCC chart中声明,见图10-56):
●mycircum变量:FC“Circumference”的返回值赋给此变量。
●myradius变量:此变量包含半径的数据,赋给FC“Circumference”的输入参数Radius。
调用FC“Circumference”,打开调用子程序设定界面,“subroutine type”子程序类型选择“Function”,“Subroutine”子程序选择之前创建的“circumference”,“Return value”返回值选择“mycircum”,把“myradius”的值赋给FC中的变量“radius”,如图10-57所示。
图10-52 插入MCC程序图
图10-53 FC变量声明表
图10-54 编写圆周长计算程序
图10-55 插入程序
图10-56 在MCC chart中声明的变量
图10-57 调用子程序的设定
编译保存MCC程序单元,这样就完成了FC的调用。
需要注意FC和Program在MCC unit中的顺序,FC必须处在Program之上的位置。如果不是,可以单击鼠标右键选择Down或Up来调整位置。
2.使用MCC语言创建和使用FB
下面举例说明如何使用MCC语言创建和使用FB计算跟随误差。可创建一个计算跟随误差的子程序,程序类型为FB,名称为FollError。此跟随误差FB计算可作为子程序在任何程序任务中调用。
跟随误差计算公式:Difference=Specified position-Actual position
可在“MCC chart”或“MCC unit”中定义所需的输入和输出参数,如设定位置值,实际位置值和偏差。如果需要的话,还可定义其他变量。
首先打开SCOUT,创建一个新项目,在“PROGRAMS”目录树下双击“Insert MCC unit”,插入一个MCC单元。“Name”栏名称为“MCCunit_1”,单击“OK”按钮确认。
用鼠标左键双击“Insert MCC chart”,插入一个程序,程序名为“FollError”,创建类型(Creation type)选择“Function block”。
此外,还可以输入作者,版本和注释等,如图10-58所示,最后单击“OK”按钮确认。
图10-58 插入FB程序
在创建的FB程序变量声明表中定义变量,输入和输出参数如图10-59所示。
在MCC chart程序编辑区编写程序,使用变量赋值命令,编写计算公式为:
Difference=Setpoint_position-Actual_position,然后编译保存,FB功能块FollError编写完成,如图10-60所示。
图10-59 FB程序的变量声明列表
图10-60 编写FB程序
下面介绍如何调用FB功能块。首先在“MCC unit”或“MCC chart”的变量声明表中定义FB的背景数据块(本例在MCC chart中声明背景数据块)。之后在同一“MCC unit”下生成一个新的程序,程序名称为“Prog_FollError”创建类型(Creation type)选择“Program”,单击“OK”按钮确认(见图10-61),然后声明FB背景数据块和其他变量(见图10-62)。
图10-61 插入程序
图10-62 声明FB背景数据块和其他变量
在“MCC chart”中插入“Subroutine call”调用子程序指令。打开调用子程序设定界面,“subroutine type”子程序类型选择“Function block”,“Subroutine”子程序选择之前创建的“FollError”,Instance背景数据块选择“myFollErr”。把轴的设定位置值和实际位置值分别赋给FB中的变量“setpoint_position”和“actual_position”,“Result”参数就是经过FB块计算后输出的值(见图10-63),单击“OK”按钮确认。
图10-63 声明FB背景数据块和其他变量
编译保存MCC程序单元,这样就完成了FB的调用。
需要注意FB和Program在MCC unit中的顺序,FB必须处在Program之上的位置。如果不是,可以单击鼠标右键选择Down或Up来调整位置。
在FB功能块执行后,背景数据块中的静态数据(包括输出参数)仍然保留。可以在调用程序中访问输出参数。如果把FB背景数据块定义成VAR_GLOBAL,还可以在其他MCC charts程序中访问输出参数。
在“MCC chart”中插入“Variable assignment”指令,编写指令“Result_2:=my-FollErr.Difference”,这样就把输出参数“myFollErr.Difference”的值赋给了“Result_2”,如图10-64所示。
图10-64 程序的变量分配
3.LAD语言下创建和使用FC
下面举例说明如何使用LAD语言创建和使用FC创建一个计算圆周长的子程序。程序类型为FC,名称为Circumference,此圆周长计算可作为子程序在任何程序任务中调用。
圆周长计算公式:Circumference=PI×2×radius
可在FC变量声明表中定义Radius(半径)和PI(π,圆周率)的值。
首先打开SCOUT,创建一个新项目,在“PROGRAMS”目录树下双击“Insert LAD/FBD unit”插入一个LAD/FBD程序单元,“Name”栏名称为“LFunit_1”。
用鼠标左键双击“Insert LAD/FBD program”插入一个程序,程序名为“Circumfer-ence”,创建类型(Creation type)选择“Function”,返回类型(Return type)选择“RE-AL”,若选择“<-->”则无返回值。
检查“Exportable”选项,如果此FC程序将要在其他程序源文件中使用(LAD/FBD,MCC或ST源文件),则勾选此选项;如果没有勾选,则此程序只能在本LAD/FBD程序单元中使用。此外,还可以输入作者,版本和注释等,如图10-65所示。
在创建的FC程序的变量声明表中定义半径(radius)的变量类型为输入“VAR_IN-PUT”,数据类型为“REAL”;圆周率PI的变量类型为常数“VAR CONSTANT”,数据类型为“REAL”,初始值为“3.14159”;直径diameter的变量类型为“VAR”,数据类型为“REAL”(见图10-66)。
在程序编辑区域右键单击“Insert network”或者左键单击按钮“”插入一个网络,如图10-67所示。
图10-65 插入LAD/FBD程序
图10-66 FC变量声明表
图10-67 插入网络
在命令库中拖出两个乘法器命令到程序编辑区,编写周长计算程序,把这两个乘法器的输出赋值给返回值,然后编译保存,如图10-68所示。
下面介绍在用户程序中如何调用FC程序,在同一LAD/FBD unit下生成一个新的程序。插入一个程序名为“Program_circumference”的程序,创建类型(Creation type)选择“Pro-gram”(见图10-69)。
图10-68 FC程序
图10-69 插入程序
插入一个网络,然后把FC“Circumference”拖入该网络(见图10-70)。
在输入输出管脚中声明下列内容(见图10-71和图10-72):
1)mycircumference变量:FC“Circumference”的返回值赋给此变量。
2)myradius变量:此变量包含半径,赋给FC“Circumference”的输入参数Radius。
需要注意FC和Program在LAD/FBD unit中的顺序,FC必须处在Program之上的位置。如果不是,可以单击鼠标右键选择Down或Up来调整位置。
图10-70 调用程序
图10-71 声明变量
图10-72 声明变量及数据类型
4.LAD语言下创建和使用FB
下面举例说明如何创建和使用FB来计算跟随误差,可创建一个计算跟随误差的子程序,程序类型为FB,名称为FollError。此跟随误差计算可作为子程序在任何程序任务中调用。
跟随误差计算公式:Difference=Specified position-Actual position
可在LAD/FBD程序(FB)或LAD/FBD unit中定义所需的输入和输出参数,如设定位置值,实际位置值和偏差。如果需要的话,还可定义其他变量。
首先打开SCOUT,创建一个新项目。在“PROGRAMS”目录树下双击“Insert LAD/FBD unit”,插入一个LAD/FBD单元,“Name”栏名称为“LFunit_1”。
用鼠标左键双击“Insert LAD/FBD program”,插入一个程序名称为“FollError”,创建类型(Creation type)选择“Function block”。此外,还可以输入作者,版本和注释等,如图10-73所示。(www.xing528.com)
图10-73 插入FB程序
在创建的FB程序的变量声明表中定义变量,如输入和输出参数(见图10-74)。
在程序编辑区域右键单击“Insert network”,或者左键单击按钮“”插入一个网络(见图10-75)。
在命令库中拖出一个减法器命令到程序编辑区,如图10-76所示。
下面介绍如何在用户程序中调用FB程序块,可在LAD/FBD unit或LAD/FBD program的变量声明表中定义FB的背景数据块。本例在LAD/FBD unit的接口部分声明背景数据块,如图10-77所示。
图10-74 FB程序的变量声明列表
图10-75 插入网络
图10-76 编写FB程序
图10-77 FB程序的变量声明
在LFunit_1中创建一个程序,用鼠标左键双击“Insert LAD/FBD program”插入一个名为“Program FollError”的程序,创建类型(Creation type)选择“Program”,如图10-78所示。
图10-78 插入调用FB的主程序
插入一个网络,然后把LFunit_1中的FB“FollError”拖入该网络,并选择“myfoller-ror”作为背景数据块,在该功能块的右键快捷菜单中选择“Display”→“All Box Parame-ters”可以显示功能块的所有引脚,如图10-79所示。
双击功能块,在弹出的“Enter Call Parameter”画面中可以为功能块的参数赋值,也可以直接在LAD编辑器中直接对功能块参数赋值,比如将轴的设定位置和实际位置赋给功能块的输入参数,输出参数赋给全局变量result。在功能块执行后,背景数据块中的静态数据仍然保留,可以在主程序中访问其输出参数。比如可以在程序的network2中插入MOVE指令,并编辑其输入输出参数,如图10-80所示。这样就把输出参数“myFollError.Differ-ence”的值赋给了Result_2。
图10-79 调用功能块
图10-80 编写调用FB的程序
5.ST语言下创建和使用FC、FB
(1)定义功能FC(Function)
在调用FC前,用户可以在执行区域(IMPLEMENTATION section)的声明部分(decla-ration part)定义一个FC。使用的语法如图10-81所示。
在关键词FUNCTION后需输入一个标识符,作为FC的名称和返回值的数据类型。如果FC无返回值,则输入VOID作为数据类型。
然后输入其他的声明区域、程序段和关键词END_FUNCTION。
(2)定义函数块FB(Function Block)
图10-81 定义FC语法
在调用FB前,用户可以在执行区域(IMPLEMENTATION section)的声明部分(Decla-ration part)定义一个FB。使用的语法如图10-82所示。
图10-82 定义FB语法
在关键词FUNCTION_BLOCK后需输入一个标识符作为FB的名称。
然后输入其他的声明区域、程序段和关键词END_FUNCTION_BLOCK。
(3)FB和FC的声明区域(Declaration section)
声明区域可被细分为多个不同的声明块,每个声明块都有独立成对的关键词来标识。每个块中包含一个声明列表,比如常数、本地变量和参数。每种类型的块只能出现一次,但顺序可任意调换。
表10-9所示选项可用做FC和FB的声明区域。
表10-9 FB和FC的声明块
(续)
调用FB或FC就会执行FB或FC中包含的语句,编写FB或FC的语法规则与编写其他程序并无区别。当调用FB或FC时,需要把传递的参数列入参数清单中,多个参数写在圆括号内,通过逗号分隔开,如图10-83所示。
图10-83 调用程序的参数传递规则
通常指定输入和输入/输出参数进行赋值。用户可把实参的值赋给输出形参,通过使用“:=”操作符,可对输入参数赋值,通过使用“=>”操作符对输出参数赋值。形参在被调用块的声明部分中定义。
如果在输入/输出赋值中使用STRING字符串数据类型,那么实参的声明长度要大于或等于输入/输出形参,如图10-84所示。
赋给输入/输出参数的变量必须能够直接读或写。因此,系统变量(SIMOTION设备,工艺对象TO,过程映像区的I/O变量)不能赋给输入/输出参数。
(4)参数传递给输出参数(只针对FB)
用户使用输出赋值把FB的输出形参赋给变量(实参),如图10-85所示。当FB调用后,变量接受输出形参的值。在FB语句中可以使用和修改输出形参。对于参数传递而言,输出赋值是可选的。用户可以在任何时刻对FB输出参数进行读和写的操作。
不同的访问类型导致访问参数的时间不同:
图10-84 在输入/输出赋值中使用STRING字符串数据类型
图10-85 语法:输出赋值
1)在输入赋值情况下,实参的值复制给了形参。如果大的数据结构(比如数组(AR-RAY))被复制,而且经常调用FC或FB,那么性能就会受到限制。
2)在输入/输出赋值情况下,不会复制参数的值,而是建立一个形参的存储地址和实参之间的链接。因此,传递变量比输入赋值的情况快(特别是包含大量数据的情况)。但是,从FB访问变量要慢一些。
3)如果使用单元变量,则不会有任何变量复制到FC或FB。因为这些变量在整个ST程序单元中都是有效的。
(5)调用FC
可按照如下规则调用:
1)带返回值的FC(数据类型不是VOID)。
功能被放置在赋值的右边,通常也作为一个在表达式内部的操作数出现。调用FC后,计算表达式的结果为它的返回值。具体举例如下:
y:=sin(x);
y:=sin(in:=x);
y:=sqrt(1-cos(x)*cos(x));
2)不带返回值的FC(VOID数据类型)。
变量赋值只由调用FC组成。具体举例如下:
funct1(in1:=var11,in2:=var12,inout1:=var13);
(6)调用FB(背景数据块调用)
在调用FB功能块之前,必须声明一个背景数据块,语法如图10-86所示。可声明一个变量,然后输入FB的名称作为数据类型。可以如下声明背景数据块:
1)本地的。
在程序或FB的声明部分,VAR/END_VAR范围内。
2)全局的。
在执行部分的接口处,VAR_GLOBAL/END_VAR范围内。
3)作为输入/输出参数。
在FB或FC的声明部分,VAR_IN_OUT/END_VAR范围内。
图10-86 语法:声明背景数据块
背景数据块声明也可以是数组ARRAY。比如:FB_inst:ARRAY[1..2]OF FB_name。
在程序组织单元POU(Program Organization Units)的语句部分调用FB的背景数据块如图10-87所示。FB参数输入赋值和输入/输出赋值通过逗号分隔开。
图10-87 FB调用语法
假定“supply”和“motor”FB功能块已经定义完毕,如图10-88所示,有
1)FB supply:输入参数in1,in2;输入/输出参数inout;输出参数out;
2)FB motor:输入/输出参数inout1,inout2;输出参数out1,out2。
在FB调用中,可使用结构变量从FB外部访问FB的输出参数,格式为FB instancename.output parameter,比如Supply1.out;也可使用结构变量从FB外部读或写FB的输入参数,格式为FB instance name.input parameter,比如Supply1.in1。
图10-88 背景数据块声明,FB调用,访问输出参数
FB背景数据块名称本身不能用于变量赋值。
(7)FB调用注意事项
当调用FB背景数据块时,需注意:
1)只能把直接存储在存储器中的变量赋给输入/输出参数。
允许使用下列变量:
①全局变量(单元变量和全局设备用户变量);
②本地变量;
③TO的数据类型的变量(TO背景数据块)。
不允许使用下列变量:
①系统变量(TO变量);
②工程系统中的工艺对象名称;
③I/O变量;
④绝对和符号过程映像访问。
2)不能把FC作为输入/输出参数。调用FC时,不能在输入/输出赋值中把其当做实参。必须首先在本地变量中存储FC的结果,然后在输入/输出赋值中把此变量作为实参使用。
3)不能把常数作为输入/输出参数。
4)输入/输出参数不能初始化。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。