在上一篇文章中,我们讨论了什么是 UDT、如何创建用户定义数据类型 (UDT) 以及在项目中使用 UDT 的优势。在本文中,我们将展示在 PLC 编程中使用 UDT 的一种方法。
内容:
- 旧储罐模拟器功能块。
- 带 UDT 的新储罐模拟 FB。
- 调用新的储罐模拟 FB。
- 向 UDT 添加新标签。
- 结论。
PLC 编程中的 UDT
在我们的前几篇文章中,我们使用相同的储罐模拟器系统来解释许多概念,例如闭环控制和 PID 控制器。在本文中,我们将使用相同的储罐模拟器来展示如何在编程中使用 UDT 的概念。
旧储罐模拟器功能块
在旧的储罐模拟器系统中,我们定义了一些内部参数,以便根据需要多次重用功能块。见图1。
图1. 储罐模拟器 FB。
从图中可以看出,在功能块接口中我们定义了一些输入和一些 InOut,这些参数应该在调用 FB 时提供。
例如,如果我们调用FB来模拟储罐1,并再次调用它来代表储罐2,则需要将每个储罐的参数提供给相关的被调用功能块。见图2。
图 2. 储罐1 和储罐 2 的模拟。
您可以看到,对于每个 FB 调用,我们都必须分配相关标签。对于储罐 1 模拟,我们应该将储罐 1 的标签分配给调用的 FB。储罐 2 模拟也是如此。
带 UDT 的新储罐模拟 FB:
现在,我们想要使用我们在上一篇文章中定义的 UDT“Tank”来模拟我们的储罐。我们将创建一个新的模拟功能块。见图3。
图 3. 添加新的储罐模拟 FB。
新的模拟功能块与旧的 FB 具有相同的逻辑,但是在这个模拟功能中,我们将使用定义的 UDT“Tank”作为 InOut 内部标签,如图所示。
因此,您不再需要在 FB 接口的不同区域中声明功能块参数,而是只需一个标签即可携带罐体的所有所需信息。
调用新储罐模拟 FB:
为了调用新的模拟功能,我们选择在循环中断 OB 内调用它,以确保功能块的执行不受主逻辑 OB1 循环时间的影响,正如我们用 PID 解释的那样。
所以我们需要首先创建一个新的循环中断 OB。见图4。
图 4. 为调用储罐 3 和 4 添加循环中断。
您可以选择您认为合适的循环时间,在我们的例子中,我们将其设置为 3000 微秒或 3 毫秒。
现在,您可以将 “Tank Simulator with UDT” FB 拖放到循环中断中以调用 FB。将出现一个调用选项窗口,为 FB 数据实例提供您喜欢的任何名称。见图5。
图 5. 致电您的 FB。
调用 FB 后,您知道需要分配与要模拟的储罐相关的参数。见图6。
图 6. 将储罐参数分配给 FB 调用。
请注意,您只有一个参数需要填充该功能块。这是您创建的 UDT 标签。其中已经包含功能块所需的所有储罐参数。
我们想要模拟储罐_03,因此我们将标记分配给 FB 调用。见图7。
图 7. 拖放您的标签。
罐 3 的功能块调用看起来比使用不带 UDT 的旧模拟器 FB 调用罐 1 更简单。见图8。
图 8. 储罐 1 和储罐 3 调用差异。
你能看出两个储罐调用的区别吗? 如果没有 UDT,则必须提供功能块的所有参数。想象一下,如果您必须使用此模拟器模拟 50 辆储罐。分配所有这些参数将是非常无聊和耗时的,更不用说首先为每个储罐声明它们了。
但对于带有 UDT 的模拟器来说,您可以调用任意多个,并且不会花费太多时间或精力。见图9。
图 9. 呼叫许多其他储罐。
现在,假设您必须向模拟中添加一个新变量。例如,您想要添加流出警告信号。对于没有 UDT 的旧模拟器功能块,这意味着您必须为每个储罐声明这个新标签,并且每次调用储罐时都必须将其一一添加。
但使用 UDT,您只需要更新您创建的 UDT 并添加您想要的新标签。见图10。
图 10. 向 UDT 添加新标签。
当您对 UDT 进行任何更改时,您甚至不需要更新函数调用。由于调用参数相同,因此更改是在参数本身内部进行的。见图11。
图 11. 无需调用 FB。
但是,您仍然需要重新编译 PLC 项目或至少重新编译数据块,以便更新对 UDT 的更改。见图12。
图 12. 重新编译以更新 UDT 的更改。
编译后,对 UDT 的所有更改将自动更新到该 UDT 的所有声明标签。见图13。
图 13. 所有标签现已更新。
结论
- 您可以在项目中使用 UDT 来使您的编程更快、更容易理解。
- 使用 UDT 还可以更轻松地更改功能和功能块。