【问题标题】:How to dynamically create fb instances during runtime on a plc?如何在 plc 运行时动态创建 fb 实例?
【发布时间】:2020-12-23 20:07:24
【问题描述】:

我是 PLC 编程的新手,我们需要为一个项目创建一个库。我们需要在运行时动态创建功能块实例。 codesys 主页上描述了一个概念: https://help.codesys.com/webapp/fb_factory;product=LibDevSummary;version=3.5.15.0

我们尝试实现该示例但没有成功。不幸的是,codesys 主页上没有关于这个概念的更多信息。 有没有人建议如何在 plc 运行时动态创建 fb 实例?

【问题讨论】:

    标签: oop code-generation plc codesys structured-text


    【解决方案1】:

    当你想动态创建一个 FB 的实例时,你首先需要将以下属性放在 FB-Declaration 之上:

    {attribute 'enable_dynamic_creation'}
    

    那么你必须确保你没有循环调用 __NEW(FB_NAME)。

    然后你将 __NEW(FB_NAME) 的结果赋值给一个指针:

    //Put this is the declaration section   
    pfbName : POINTER TO FB_NAME;
    //Your call to create a dynamic instance
    pfbName := __NEW(FB_NAME);
    

    如果__NEW返回后你的指针=0,说明__NEW分配内存失败。

    【讨论】:

    • 方法B是什么意思?
    • 问题作者提供的链接。 __NEW是方法A动态创建FB,有方法B描述。
    • 好的,现在我明白了.. 不知道,从未使用过 FBFactory。但 __NEW 也从未遇到过问题。提供的链接说,如果您有兴趣,可以下载一个测试项目以了解 FBFactory 的工作原理。
    • 使用 __NEW 时需要注意的几点:首先,兼容性方面,并非所有 PLC 都支持这一点,尽管大多数现代的可能会支持,但我只使用了少数,所以你的里程可能会有所不同。其次,您必须在您的应用程序中启用动态分配,并且您必须定义将分配给动态使用的一组内存大小。这意味着您的应用程序的其余部分将无法使用该空间,并且如果您的动态分配超过预定义的大小,分配将失败。这在使用内存较小的设备时并不理想。
    • 最后,您将不得不在不再需要时使用 __DELETE 来释放内存,或者强制 PLC 频繁重启(这会释放所有分配的内存),或者两者都以保持内存“干净” .因此,考虑到所有这些,除非绝对必要,否则我建议避免动态分配。另一种选择是使用指向 FB/INTERFACE 的引用/指针,并在您的库之外完成初始化,用户仅在需要该 FB 时/如果需要该 FB 时才向您提供该引用/指针。顺便说一句,这是我们的首选方法
    【解决方案2】:

    我做了一个简单的经典 OOP Person, Teacher, Student 例子here。 基本上,在PLC_PRG 中更改numberOfTeachers 的值将导致数组people 的重新初始化,其中第一个numberOfTeachers 条目是教师,其余的是学生。您可以查看我为创建/销毁教师/学生而编写消息的设备日志。

    附言。我自己还在探索 CODESYS 中 Factory Design 的可能性,如有错误请见谅!

    【讨论】:

      猜你喜欢
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 2020-06-25
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多