引言

函数(功能)块是一种程序块,其 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 参数不会被存储。

TIA Portal 中的函数块实例(单个、多重和参数)

当调用该函数块的另一个实例时,系统会生成另一个独立的数据块,如下图所示。

参数实例

参数实例提供了一种独特的实例化方式。在此模式下,需要使用的块实例将作为 InOut 参数在执行期间传递给调用块。此外,在函数块中调用函数块时,系统将提供选择多重实例的选项。

下面我们将创建一个函数,并调用之前已建立的’FB_Sum’函数块。

实例数据存储在调用函数或函数块的 InOut 参数区中的’iq_instSum’内。

在主程序 OB1 中调用此函数时,此时需要创建相应的 InOut 参数。

现在,该函数需要一个配套的数据块才能正常工作。请按以下步骤操作:

  1. 新建一个数据块;
  2. 点击下拉箭头;
  3. 选择函数块’FB_Sum’。

这意味着即将创建的数据块将自动包含该函数块的所有参数。

在主程序 OB1 中将创建好的数据块与函数进行标签关联。

每次调用该函数时,都需要为其创建独立的数据块实例,具体如下图所示。

参数实例的优势

  • 可以在运行时指定当前正在使用的实例;
  • 在程序循环中,可以迭代处理各种实例。

多重实例功能

当函数块(FB)调用其它函数块时,可将被调用块的实例数据存储在调用块 FB 的实例数据块中,这种调用方式即称为多重实例块调用。

操作步骤:

  1. 新建函数块并命名为’FB_Sums’;
  2. 在’FB_Sums’函数块中调用函数块’FB_Sum’;
  3. 选择’多重实例’作为调用选项。

在此配置中,“FB_Sum”实例数据存储在调用函数块“FB_Sums”的 Static 参数中。

当在主程序 OB1 中调用该函数块时,系统将提示创建数据块,此时需选择’确定’。

如图所示,可以看到相关数据存储在调用函数块的数据块中。

再次调用’FB_Sum’函数块时,将显示如下内容。

因此,每次调用函数块’FB_Sum’时,相关数据都会被存储在调用函数块’FB_Sums’的静态数据区中。

多重实例调用的数组实现方法

另一种实现多重实例块调用的方式是采用数组结构。请按以下步骤操作:

  1. 新建函数块并命名为“FB_Sums1”;
  2. 在 Static 参数中创建数组:如下图所示。

在此设置中,所选数据类型为’FB_Sum’,这将使创建的数组自动继承该函数块的全部参数格式。

请按以下方式(索引)对函数块进行寻址配置。

最终寻址配置如下所示。

在主程序 OB1 中调用“FB_Sums1”。

自动生成背景数据块“IDB_Sums1”。

在背景数据块“IDB_Sums1”中的 Statics 参数中可以看到多重实例数组。

这是创建函数块多重实例的另一种高效实现方案。

多重实例技术的优势

  • 更少的实例数据块;
  • 为复杂块提供良好的结构化方法。

参数实例的进阶应用

参数实例也可以是来自另一个函数块的多重实例数组。以下示例使用多重实例数组作为函数(FC)的实例参数。

因此,每次调用更高级别的函数块时,都可以将以下类型的实例作为参数实例传递:

  • 单个实例:传递被调用函数块的现有实例数据块;
  • 多重实例:传递被调用函数块的现有的多重实例;
  • 多重实例数组中的单个元素:传递现有多重实例数组中的某个元素。

总结

对于使用 TIA Portal 的西门子 PLC 程序员来说,掌握函数块实例的相关知识至关重要。这能够使块的参数化更加便捷高效。本文面向希望进一步提升编程技能的高级 PLC 程序员。建议通过实践来练习本文中讲解的不同实例方法,从而熟练掌握它们。