在一个项目中,现场许多设备通常具有类似的启停和控制方式。不同的仅仅是启、停的条件、控制参数等。因此,同类的设备,控制模型大致是一样的。我们通常会在一个FB中,编写一段代码来实现对同一类设备的控制。如图1所示,为一段简单的电机启、停控制程序。
图1 电机的启停控制模型
简单分析一下这段程序:
· #motor_on是电机的运行使能,通过SR触发器来决定其状态。#switch_on、#switch_off分别为启动和停止命令;#Failure为故障检测信号,当电机故障时,#Failure端反馈为'1'。
· 启停控制均很简单,当#switch_on端输入上升沿信号时,#motor_on=1,电机运行;当#switch_off端输入上升沿信号或电机故障时,#motor_on=0,电机停止;
· 程序段2为速度监控,比较实际速度与给定速度的偏差。
FB1块需要在OB1中调用,才能参与马达的控制。如果现场中有多个马达都适用FB1的控制模型时,需要为每个马达都调用一次FB1,同时每调用一次FB1都要为其分配一个背景数据块,每个数据块对应一个实际的马达的参数。如图2为控制两台马达的程序,每台马达都要分别一个背景数据块,如图3,DB1和DB2
图2 控制两台马达
图3 背景数据块
试想一下,一个工业现场,不可能只有几台马达,而是几十台甚至上百台也不止。如果通过调用FB1来控制每台马达,则需要为每台马达都分配一个独立的背景数据块。显然,当现场要控制的马达较多时,背景数据块的增加是非常大的。通过使用多重背景,可以很好的解决这一问题。
所谓的多重背景即创建一个更高级别的功能块(这里为FB10),并在其中调用未做任何修改的FB1作为'局部背景'。对每一个调用,子程序FB1会将其数据存储于与FB10关联的背景数据块(这里为DB10)中。这样一来,所有的相关数据都存储在DB10中,不用为FB1的多次调用分配额外的数据块。
FB10的具体编程方法如图4所示。在FB10的接口中,定义并关联若干个FB1类型的静态变量,本例中关联了4个,分别为M1、M2、M3和M4等4个马达控制实例,如图4蓝框所示。然后,分别为每个马达编写启停条件及运行参数。
FB10编写完成后,在OB1中调用并关联背景数据块DB10,如图5所示。这样,每个马达实例(M1~M4)的相关参数都集中存储在DB10中,如图6所示。对比图3和图6可以发现,DB2、DB3中的数据和DB10中的数据在结构上没差别,但DB10一个DB块就可囊括DB2和DB3中的数据。这必然节省了DB块的定义、分配和管理,简化了项目结构。
图4 多重背景FB10
图5 调用FB10,并关联DB10
图6 DB10