引言
函数(功能)块是一种程序块,其 Input、Output、InOut 和 Static 参数会永久存储在实例数据块中,即使在块执行后仍可访问。因此,函数块也被称为“内存块”。
实例是函数块的调用结果,每个函数块实例都需要一个实例数据块,其中包含该函数块形式参数的实例特定值。函数块的实例数据可以存储在自身的实例数据块中,也可以存储在调用块的实例数据块内。
本文将介绍在西门子 TIA Portal 中进行 PLC 编程时可使用的不同类型的函数块实例,包括:单个实例、多重实例和参数实例。
注:文中将“Function”统称为“函数”,“Function Block”统称为“函数块”。
函数与函数块的区别
函数(FC)和函数块(FB)在 PLC 编程中有诸多不同,以下是主要区别:
数据存储:
-
函数没有实例内存,它不存储数据; -
函数块有一个实例数据块用于存储数据。Input、Output、InOut 和 Static 参数保存再这个实例数据块中。即使在块执行后,它们仍然可以被访问。
参数类型:
-
函数(FC)不支持 Static 参数类型,调用时不能省略掉函数中的任何参数,包括 Input、Output 和 InOut 参数,在函数中,任何形参都没有设置初始值,因为它们不会将数据存储在内存中; -
函数块(FB)支持所有参数类型,调用时需关联实例数据块。在函数块中,可以省略任何参数,包括没有地址的 Input、Output 和 InOut。
编程语言:
-
函数(FC)只能用 STL、SCL、LAD 和 FBD 语言编写; -
函数块(FB)可以用 TIA Portal 中所有语言编写,包括 STL、SCL、LAD、FBD、GRAPH 和 CEM。
调用方式:
-
函数(FC)直接调用,无需背景数据块; -
函数块(FB)必须绑定背景数据块,数据存储背景数据块中。
内存占用:
-
函数(FC)内存占用更少(无持久化数据存储); -
函数块(FB)占用更多内存(每个实例需独立的 DB)。
应用场景:
-
函数(FC)适用于无状态、纯功能操作或简单计算的轻量级操作; -
函数块(FB)适用于需要存储状态、多实例控制或复杂逻辑的复杂对象。
实例的基本概念
函数块(FB)被调用时,需要存储其工作数据,单个数据单元称为一个实例。
实例具有以下关键特性:
-
自动创建:调用函数块时,实例会自动生成; -
结构定义:实例的结构由关联函数块(FB)的接口定义,仅能通过修改 FB 接口进行调整; -
永久绑定:实例与函数块永久关联,无法独立存在。
实例存储方式
在 PLC 编程中,函数块(FB)实例的存储有以下三种模式:
1. 单个实例(Single instance)
-
每个函数块使用独立的实例数据块(DB)存储数据; -
实例数据与调用块分离,通过专属 DB 访问; -
典型应用:需长期保持数据的独立功能模块。
2. 多重实例(Multiple instance)
-
实例数据嵌入在调用块的 DB 中(如 FB 嵌套调用时); -
无需单独分配 DB,节省存储空间; -
典型应用:子功能模块的层级化封装。
3. 参数实例(Parameter instance)
-
实例数据通过 InOut 参数动态传递; -
灵活性高,但需手动管理数据一致性; -
典型应用:需灵活配置的复用逻辑。
单个实例
在单个实例中,被调用的块会将其自身数据保存在其实例块中。下面来看一个例子。
创建一个带如下参数的函数块“FB_Sum”。
用 SCL 语言编写以下代码,执行如下图所示的一个简单计算。
接下来,在主程序 OB1 中调用该函数块。调用时,系统会提示是否要为被调用的函数块创建数据块。此时,我们选择单个实例模式。
在项目树中,系统会为我们刚刚调用的函数块生成一个数据块。该数据块“IDB_Sum”即为“FB_Sum”函数块的实例,用于存储相关数据。
将参数标签通过函数块(FB)进行传递,完成编译并下载程序。
该函数块实例对应的数据块将存储如下所示的数据。
该函数块实例的数据块中存储了 Input、Output、InOut 和 Static 参数,而 Temp 和 Constant 参数不会被存储。

当调用该函数块的另一个实例时,系统会生成另一个独立的数据块,如下图所示。
参数实例
参数实例提供了一种独特的实例化方式。在此模式下,需要使用的块实例将作为 InOut 参数在执行期间传递给调用块。此外,在函数块中调用函数块时,系统将提供选择多重实例的选项。
下面我们将创建一个函数,并调用之前已建立的’FB_Sum’函数块。
实例数据存储在调用函数或函数块的 InOut 参数区中的’iq_instSum’内。
在主程序 OB1 中调用此函数时,此时需要创建相应的 InOut 参数。
现在,该函数需要一个配套的数据块才能正常工作。请按以下步骤操作:
-
新建一个数据块; -
点击下拉箭头; -
选择函数块’FB_Sum’。
这意味着即将创建的数据块将自动包含该函数块的所有参数。
在主程序 OB1 中将创建好的数据块与函数进行标签关联。
每次调用该函数时,都需要为其创建独立的数据块实例,具体如下图所示。
参数实例的优势
-
可以在运行时指定当前正在使用的实例; -
在程序循环中,可以迭代处理各种实例。
多重实例功能
当函数块(FB)调用其它函数块时,可将被调用块的实例数据存储在调用块 FB 的实例数据块中,这种调用方式即称为多重实例块调用。
操作步骤:
-
新建函数块并命名为’FB_Sums’; -
在’FB_Sums’函数块中调用函数块’FB_Sum’; -
选择’多重实例’作为调用选项。
在此配置中,“FB_Sum”实例数据存储在调用函数块“FB_Sums”的 Static 参数中。
当在主程序 OB1 中调用该函数块时,系统将提示创建数据块,此时需选择’确定’。
如图所示,可以看到相关数据存储在调用函数块的数据块中。
再次调用’FB_Sum’函数块时,将显示如下内容。
因此,每次调用函数块’FB_Sum’时,相关数据都会被存储在调用函数块’FB_Sums’的静态数据区中。
多重实例调用的数组实现方法
另一种实现多重实例块调用的方式是采用数组结构。请按以下步骤操作:
-
新建函数块并命名为“FB_Sums1”; -
在 Static 参数中创建数组:如下图所示。
在此设置中,所选数据类型为’FB_Sum’,这将使创建的数组自动继承该函数块的全部参数格式。
请按以下方式(索引)对函数块进行寻址配置。
最终寻址配置如下所示。
在主程序 OB1 中调用“FB_Sums1”。
自动生成背景数据块“IDB_Sums1”。
在背景数据块“IDB_Sums1”中的 Statics 参数中可以看到多重实例数组。
这是创建函数块多重实例的另一种高效实现方案。
多重实例技术的优势
-
更少的实例数据块; -
为复杂块提供良好的结构化方法。
参数实例的进阶应用
参数实例也可以是来自另一个函数块的多重实例数组。以下示例使用多重实例数组作为函数(FC)的实例参数。
因此,每次调用更高级别的函数块时,都可以将以下类型的实例作为参数实例传递:
-
单个实例:传递被调用函数块的现有实例数据块; -
多重实例:传递被调用函数块的现有的多重实例; -
多重实例数组中的单个元素:传递现有多重实例数组中的某个元素。
总结
对于使用 TIA Portal 的西门子 PLC 程序员来说,掌握函数块实例的相关知识至关重要。这能够使块的参数化更加便捷高效。本文面向希望进一步提升编程技能的高级 PLC 程序员。建议通过实践来练习本文中讲解的不同实例方法,从而熟练掌握它们。