首页 理论教育 生成与调用函数块的优化方法

生成与调用函数块的优化方法

时间:2023-06-30 理论教育 版权反馈
【摘要】:每次调用函数块时,都需要指定一个背景数据块。单击“确定”按钮,自动生成FB1的背景数据块。图4-12 S7-PLCSIM的SIM表17.处理调用错误作者最初编写的FB1没有生成参数“定时时间”。图4-13 “接口同步”对话框8.函数与函数块的区别FB和FC均为用户编写的子程序,接口区中均有Input、Output、InOut参数和Temp数据。

生成与调用函数块的优化方法

1.函数块

函数块(FB)是用户编写的有自己的存储区(背景数据块)的代码块,FB的典型应用是执行不能在一个扫描周期结束的操作。每次调用函数块时,都需要指定一个背景数据块。后者随函数块的调用而打开,在调用结束时自动关闭。函数块的输入、输出参数和静态局部数据(Static)用指定的背景数据块保存。函数块执行完后,背景数据块中的数值不会丢失。

2.生成函数块

打开项目“函数与函数块”的项目树中的文件夹“\PLC_1\程序块”,双击其中的“添加新块”,单击打开的对话框中的“函数块”按钮,默认的编号为1,默认的语言为LAD(梯形图)。设置函数块的名称为“电动机控制”,单击“确定”按钮,生成FB1。去掉FB1“优化的块访问”属性。可以在项目树的文件夹“\PLC_1\程序块”中看到新生成的FB1(见图4-1)。

3.生成函数块的局部变量

打开FB1,用鼠标往下拉动程序编辑器的分隔条,分隔条上面是函数块的接口区,生成的局部变量见图4-6,FB1的背景数据块见图4-7。

978-7-111-58719-4-Chapter04-12.jpg

图4-6 FB1的接口区

978-7-111-58719-4-Chapter04-13.jpg

图4-7 FB1的背景数据块

IEC定时器、计数器实际上是函数块,方框上面是它的背景数据块。在FB中,IEC定时器、计数器的背景数据块如果是一个固定的数据块,在同时多次调用FB1时,该数据块将会被同时用于两处或多处,这犯了程序设计的大忌,程序运行时将会出错。为了解决这一问题,在块接口中生成了数据类型为IEC_TIMER的静态变量“定时器DB”(见图4-6),用它提供定时器TOF的背景数据,其内部结构见图4-8。每次调用FB1时,在FB1不同的背景数据块中,不同的被控对象都有保存TOF的背景数据的存储区“定时器DB”。

4.FB1的控制要求与程序

FB1的控制要求如下:用输入参数“起动按钮”和“停止按钮”控制InOut参数“电动机”(见图4-9)。按下停止按钮,断开延时定时器(TOF)开始定时,输出参数“制动器”为1状态,经过输入参数“定时时间”设置的时间预设值后,停止制动。

978-7-111-58719-4-Chapter04-14.jpg

图4-8 定时器DB的内部变量

978-7-111-58719-4-Chapter04-15.jpg

图4-9 FB1的程序

在TOF定时期间,每个扫描周期执行完FB1之后,都需要保存“定时器DB”中的数据。函数块执行完后,下一次重新调用它时,其Static(静态)变量的值保持不变。所以“定时器DB”必须是静态变量,不能在函数块的临时数据区(Temp区)生成数据类型为IEC_TIMER的变量。

函数块的背景数据块中的变量就是它对应的FB接口区中的Input、Output、InOut参数和Static变量(见图4-6和图4-7)。函数块上述的数据因为用背景数据块保存,在函数块执行完后也不会丢失,以供下次执行时使用。其他代码块也可以访问背景数据块中的变量。不能直接删除和修改背景数据块中的变量,只能在它对应的函数块的接口区中删除和修改这些变量。

生成函数块的输入、输出参数和静态变量时,它们被自动指定一个默认值(见图4-6),可以修改这些默认值。局部变量的默认值被传送给FB的背景数据块,作为同一个变量的启动值。可以在背景数据块中修改上述变量的启动值。调用FB时没有指定实参的形参使用背景数据块中的启动值。

5.在OB1中调用FB1

在PLC变量表中生成两次调用FB1使用的符号地址(见图4-10)。将项目树中的FB1拖放到程序区的水平“导线”上(见图4-11)。在出现的“调用选项”对话框中,输入背景数据块的名称。单击“确定”按钮,自动生成FB1的背景数据块。为各形参指定实参时,可以使用变量表或全局数据块中定义的符号地址,也可以使用绝对地址,然后在变量表中修改自动生成的符号的名称。

6.调用函数块的仿真实验

选中项目树中的PLC_1,单击工具栏上的“开始仿真”按钮978-7-111-58719-4-Chapter04-16.jpg,打开S7-PLCSIM。将程序下载到仿真PLC,使后者进入RUN模式。在S7-PLCSIM的项目视图打开项目树中的“SIM表1”,在表中生成IB0和QB0的SIM表条目(见图4-12)。(www.xing528.com)

978-7-111-58719-4-Chapter04-17.jpg

图4-10 PLC变量表

978-7-111-58719-4-Chapter04-18.jpg

图4-11 OB1调用FB1的程序

两次单击I0.0(起动按钮1)对应的小方框,Q0.0(1号设备)变为1状态。两次单击I0.1(停止按钮1)对应的小方框,Q0.0变为0状态,Q0.1(制动1)变为1状态。经过参数“定时时间”设置的时间后Q0.1变为0状态。可以令两台设备几乎同时起动、同时停车和制动延时,图4-12是两台设备均处于制动状态的SIM表。

978-7-111-58719-4-Chapter04-19.jpg

图4-12 S7-PLCSIM的SIM表1

7.处理调用错误

作者最初编写的FB1没有生成参数“定时时间”。在OB1中调用符号名为“电动机控制”的FB1之后,在FB1的接口区增加了输入参数“定时时间”,OB1中被调用的FB1的字符变为红色(见图4-13中的左图)。右键单击出错的FB1,执行快捷菜单中的“更新块调用”命令,出现图4-13所示的“接口同步”对话框,显示出原有的块接口和增加了输入参数后的块接口。单击“确定”按钮,“接口同步”对话框消失。OB1中调用的FB1被修改为新的接口(见图4-13中的右图),程序中FB1的红色字符变为黑色。需要用同样的方法处理图4-11右边的FB1的调用错误。

978-7-111-58719-4-Chapter04-20.jpg

图4-13 “接口同步”对话框

8.函数与函数块的区别

FB和FC均为用户编写的子程序,接口区中均有Input、Output、InOut参数和Temp数据。FC的返回值实际上属于输出参数。下面是FC和FB的区别:

1)函数块有背景数据块,函数没有背景数据块。

2)只能在函数内部访问它的局部变量。其他代码块或HMI(人机界面)可以访问函数块的背景数据块中的变量。

3)函数没有静态(Static)变量,函数块有保存在背景数据块中的静态变量。

函数如果有执行完后需要保存的数据,只能用全局数据区(例如全局数据块和M区)来保存,但是这样会影响函数的可移植性。如果块的内部使用了全局变量,在移植时需要重新统一分配所有的块内部使用的全局变量的地址,以保证不会出现地址冲突。当程序很复杂,代码块很多时,这种重新分配全局变量地址的工作量非常大,也很容易出错。

如果函数或函数块的内部不使用全局变量,只使用局部变量,不需要做任何修改,就可以将块移植到其他项目。

如果代码块有执行完后需要保存的数据,显然应使用函数块,而不是函数。

4)函数块的局部变量(不包括Temp)有默认值(初始值),函数的局部变量没有默认值。在调用函数块时可以不设置某些有默认值的输入、输出参数的实参,这种情况下将使用这些参数在背景数据块中的启动值,或使用上一次执行后的参数值。这样可以简化调用函数块的操作。调用函数时应给所有的形参指定实参。

5)函数块的输出参数值不仅与来自外部的输入参数有关,还与用静态数据保存的内部状态数据有关。函数因为没有静态数据,相同的输入参数产生相同的执行结果。

9.组织块与FB和FC的区别

出现事件或故障时,由操作系统调用对应的组织块,FB和FC是用户程序在代码块中调用的。组织块的输入参数是操作系统提供的启动信息,用户可以在组织块的接口区生成临时变量和常量。组织块没有输出参数、InOut参数和静态数据。组织块中的程序是用户编写的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈