内容:
什么是功能块 FB? 数据实例的不同选项。 单实例。 参数实例。 多实例。 什么是功能块?
功能块或 FB 只是包含代码逻辑的块。您可以使用该 FB 通过编写在其中的代码片段来实现特定的功能。
当在代码中调用功能块时,系统会要求您分配一个数据块(也称为数据实例)与该 FB 关联,以保存 FB 参数的值。并非 FB 内的所有参数都保存在数据实例中,但我们稍后会讨论这一点。
调用功能块时,您有 3 个不同的选项用于将数据块实例与此函数调用相关联。这些不同的选项将取决于您调用 FB 的位置。
所以,简而言之。功能块FB基本上是具有专用数据块 DB 的功能 FC,该数据块用于存储功能块参数的值。
数据实例的不同选项
对于功能块的数据实例,我们有 3 个不同的选项,这些选项是:
单实例。 参数实例。 多实例。 三个不同的调用数据实例来自 3 种不同的调用方法:
您可以在主 OB1 内调用功能块 FB,这将为您提供以下选项: 单实例。 您可以在功能 FC 内调用功能块 FB,这将为您提供两种选择 单实例 参数实例
您可以在另一个功能块内调用该功能块,这将为您提供创建数据实例的三个可用选项 单实例 参数实例 多个实例 单个数据实例
首先,让我们从创建一个功能块 FB 开始,正如我们之前提到的,我们通过单击 “添加新块” 并选择我们想要的块类型来创建一个功能块。见图1。
图 1 – 创建功能块 FB
现在,我们将在主 OB1 中创建的 ReusableFB 称为 ReusableFB。见图2。
图 2 – 调用主 OB1 内的 FB
正如您从上图中看到的,在主 OB1 内调用 FB 时,系统会要求您分配一个与该 FB 调用关联的数据实例。在这种情况下,只有一个选项,那就是单一实例。
选择单实例选项后,将创建一个数据块并与 FB 调用关联。见图3。
图 3 – 创建的单个实例
创建的单个实例将用于存储一些 FB 参数的值。如输入、输出、In Out 和静态参数。
FB 的其他参数将不会被存储,例如温度和常量。见图4和图5。
图 4 – 数据保存在数据实例内部
图 5 – 从 FB 保存到数据实例的数据。
现在,让我们在 FB 中创建一个简单的逻辑,以帮助我们更好地理解数据实例。该逻辑会将常量值 15 添加到静态变量,然后将结果移至输出。见图6。
图 6 – 创建一个简单的逻辑
现在,返回主 OB1 并注意 FB 调用现在的情况。见图7。
图 7 – 每次更改后更新 FB 调用
您对 FB 内部逻辑所做的任何更改都将导致需要更新功能块调用,以便可以应用您所做的更改。
您可以通过右键单击 FB 调用并按更新块调用选项或重新编译 PLC 代码来更新块调用。见图8。
图 8 – 更新 FB 调用
更新块调用后,您在 FB 代码中所做的更改将在块调用中应用和使用。如图 9 所示。
FB 现在期望提供 bool 类型的输入信号,并且 FB 将给出 int 类型的输出。
图 9 – 输入和输出现在与 FB 调用关联
让我们模拟我们的代码,看看 PLC 将如何运行。请参阅下一个动画,该动画显示了迄今为止 PLC 逻辑的简单模拟。
从动画中可以看出,每当启动信号为 TRUE 时,该函数就会被执行,并且输出不断变化。一旦启动信号不再可用,输出将保持在最后记录的值。
这里数据实例的用途是静态变量和输出变量的值保存在单个实例内,因此当启动信号再次返回时,函数将从最后记录的值继续。
非常重要的注意事项
切勿对 FB 的两次不同调用使用相同的单个实例。请看下一个动画。
正如您从动画中看到的,我们有两个不同的 FB 调用,但两个调用都与同一个实例关联,这就是为什么即使 start2 信号为 FALSE,Output2 值也会随 Output1 变化。
正如您所期望的,第一次调用的数据实例的更改也会在第二次调用中受到影响,因为它们具有相同的内存块。见图10。
图 10 – 切勿在不同的 FB 调用中使用相同的数据实例
如果您对不同的 FB 调用使用相同的数据实例,则您的功能块将不再可重用。即使每个不同的 FB 调用的输入/输出参数都不同。正如您从上一个视频(动画)中看到的那样,即使第二个调用甚至没有启用输入信号,两个调用也具有相同的结果。
另一个非常重要的注意事项
我们之前说过,如果您从更高级别的 FC 调用您的 FB,则关联的数据实例将有两个选项;这些选项是单个实例和参数实例。见图11。
图 11 – 使用带有从 FC 调用的 FB 的单个实例
如果发生这种情况,并且您将在 FC 内调用 FB,则您永远不应该为 FB 使用单个实例。要知道这是为什么。见图12
图 12 – 多次呼叫上级 FC
从图 12 中可以看出,当您在逻辑中多次调用更高级别的 FC 时,不会要求您分配数据块,因为 FC 不需要数据块。
但是你知道 FC 内部有一个叫做 FB 的,这个FB有一个与之关联的单个实例。因此,现在 3 个 FC 调用对于 FB 调用具有相同的数据实例。因此,您的函数 FC 不再可重用。
该怎么办?当您需要在 FC 内调用 FB 时,最佳选择是使用参数实例。
参数实例
正如我们之前所说,如果您在 FC 内调用 FB,则不应选择单个实例,而参数实例更适合您的可重用性目的。
参数实例将保存调用到 FC 块接口的 In Out 区域的 FB 的数据实例。允许您为每个 FC 调用输入新的数据实例。见图 13 和 14。
图 13 – 在 FC 内调用 FB 时分配参数实例
图 14 – 每个 FC 调用都需要一个新的数据实例
从上图中可以看出,每当您在程序中调用 FC 时,它都会为 FC 内的可重用 FB 请求数据实例。
但是,使用这种方式您将必须自己创建数据实例。见图15。
图 15 – 创建一个新的数据实例
要创建新的数据实例,您可以执行与创建 FC 或 FB 相同的操作,但这次您选择 DB 选项。并确保选择的 DB 类型与调用的 FB 相同。
现在,您的 FC 可以根据您的需要多次重复使用,您只需为每次调用创建一个实例即可。见图16。
图 16 – 将 DB 分配给 FC 调用
多实例数据库
多实例 DB 简单来说就是被调用 FB 的 DB 将存储在更高级别调用 FB 的 DB 中。仅当您从另一个 FB 调用一个 FB 时,此选项才可用。
让我们创建另一个 FB 将其用作更高级别的 FB。
创建此 HigherLevelFB 后,从主 OB1 调用它,当然唯一的调用选项将是单个实例,如前所示。见图17。
图 17 – 从主 OB1 调用 UpperLevelFB
现在,从 HigherLevelFB 调用 ReusableFB。并选择多实例选项。见图18。
图 18 – 分配多实例 DB
当您选择多实例选项时,创建的 DB 将存储在调用 FB 的静态参数内。见图19。
图 19 – 实例保存在静态参数内
您可以多次调用 ReusableFB,每次调用它时,多实例都会存储在静态参数中。见图20。
图 20 – 多次调用 ReusableFB
正如您所看到的,下级 FB 的数据实例将保存在上级 FB 的数据实例内。最好有更好的程序结构和易于阅读的逻辑。
结论
在代码中创建功能块需要将数据块与您在逻辑中进行的每个 FB 调用相关联。该数据块或也称为数据实例具有不同的选项,具体取决于调用 FB 的块的类型。
选择数据实例类型时要小心,因为某些选项可能不适合您的情况,如我们之前所示。有时这可能会导致您的逻辑出现问题,并且您的函数无法再重用。
使用多实例可以帮助更好地组织程序结构,因为所有被调用的 FB 都会将其 DB 存储在主调用 FB 中。
- Read more...
-
- 0 comments
- 677 views