【问题标题】:TwinCAT 3, Using Methods for internal FB functionality or just for interfaces?TwinCAT 3,将方法用于内部 FB 功能还是仅用于接口?
【发布时间】:2017-08-21 12:50:46
【问题描述】:

我是 Beckhoff 技术的老用户,尤其是 TwinCAT。目前,由于 TwinCAT 3(面向对象)带来的新功能,我们的 PLC 架构正在经历一场变革

目前,我们正在开发新的 PLC 架构,并且我们对如何前进有几个担忧。目前引起我们注意的一个很好的例子是新方法以及与操作的总体差异。

从我自己的角度来看,创建方法不仅是为了定义和实现接口,也是为了简化 FunctionBlock 及其内部状态机。例如,如果我有一个内部有自己的状态机的 FB_Conveyor,我可以选择为传送带创建内部方法 (M_INIT),它将检查传送带以检查传送带处于 INIT 状态时是否有任何产品,检查方法输出值。 MEthod 将包含其获得的状态机,并且在其输出返回 TRUE 值之前不会准备好。

第一个问题来了,因为我们的一些实时程序员认为方法并没有为此完成,在这种情况下,我们应该实现从 FB_CONVEYOR 调用的 FB_INIT,它包含自己的变量,所以两者都有参考 FB_MOTOR。

主要论点是 METHODS 是一种用于创建接口和控制 FB 的工具,例如,我自己的 FB_CONVEYOR 可以从具有方法 M_TakeIn 的 I_Conveyor 扩展而来,但不用于实现内部功能作为初始化它.

还有一个论点是方法使用自己的堆栈变量,因此方法的所有数据都是临时的,并且仅在执行期间有效。这意味着,如果实现它的方法太大,我们将无法确保实时的正确延迟。然后根据我自己的经验,TC 总是会占用尽可能多的处理器资源来确保正确的循环时间,所以使用内部堆栈变量实际上并不是一个架构错误,但它是可以和可取的,因为实际上 TC 确保实时操作但不需要被实现为一个总实时(基于 C 的实时)过程。

讨论一直在进行,对于是否应该将方法用作内部操作或者我们是否应该实际遵循 TC2 Motion FB 的架构(其中不同的功能块控制不同的功能,每个功能共享一个对某些轴的引用(FB_MOVE、FB_HOME 等)

在任何文档中都没有找到任何真正的答案,在定义接口的情况下几乎总是提到方法,但在编程内部 FB 功能的情况下却从未提及。

那么,是否可以将方法用于内部功能,这将有助于将来在接口中转换孔 FB 时需要根据情况重新实现方法 init。?

对于同样具有方法和接口的新版本 CodeSyS,这个问题几乎相同。

【问题讨论】:

    标签: plc codesys twincat


    【解决方案1】:

    Method 与 Action 的不同主要是因为它有自己的声明。 默认情况下,方法中的所有变量都是VAR_TEMP 类型,这意味着它们只会在运行期间存在。所以每个周期它们都会被重置。 VAR_TEMP 使用有限的堆栈空间和大数据类型不能这样声明。

    但是你可以在方法中声明任何类型的变量。就像VAR_INST 一样,每个实例都是私有的,因为它是在 FB(功能块)级别(FB 中的默认变量)创建的。或者您可以声明所有实例通用的VAR_STAT。方法可以让代码更清晰。

    Method 和 Action 都可以使用它的 FB 中的所有变量。

    方法和动作都可以使用与 FB 不同的编程语言来开发。例子:FB是用ST写的,但是它的Method或Action可以写成Ladder Diagram。

    我个人认为方法存在和接口之间没有任何联系。我不会急于使用 OOP 提供的所有功能。如果使用不当,继承、接口和属性会使您的程序成为一场噩梦。虽然 TwinCAT 中的封装充其量是虚拟的。

    编辑: 当在 Program 中创建 Method 时(TwinCAT 中的静态对象)VAR_INST 无法在此方法中创建,因为 Program 中不存在实例。 Program 的方法中只能使用VAR_STATVAR_TEMP。它与其他不能实例化静态类的编程语言非常相似,它们的变量也只能是静态的。

    【讨论】:

      【解决方案2】:

      您已经明白了要点,但长话短说,PLC 中的功能块定义了一个通用的“类”功能。此类将具有某些输入和输出,以及操作它们的方法/动作。必须创建功能块的实例,才能使用这些方法。该实例在程序执行期间持续存在,然后被删除(PLC 停止)。

      在新的 TwinCAT 和 CodeSys 中,通过方法扩展了动作。这些方法有自己的输入和输出变量以及操作它们的代码。可以使用此功能来分离(更好地模块化)他/她的代码,并在需要时执行它。

      在此处了解更多信息: http://infosys.beckhoff.com/content/1033/tc3_plc_intro/html/pou_method.htm

      【讨论】:

        【解决方案3】:

        我使用方法作为接口,也将功能块代码分成更小的部分。

        例如,我有一个记录器块,它将给定的字符串写入日志文件。它也可以将该日志读取到 PLC 阵列。

        块看起来像这样:

        FB_Logger

        • 添加日志行
          • 添加日志行的公共方法
        • SaveLogToFile
          • 公开行动(也可以是一种方法)保存日志文件
        • LoadLogFromFile
          • 读取日志文件的公共行为(也可以是一种方法)
        • 日志数组
          • 日志数组的公共getter。类型为 REFERENCE TO ARRAY 的属性..
        • GetLogFileHeader
          • 创建文件头的私有方法
        • GetLogFileLine
          • 创建日志行的私有方法
        • 保存文件
          • 开始保存的私人方法
        • ShiftLogItems
          • 转移日志数组的私有方法

        功能块本身也有一些代码,每个周期都会调用。

        我以非常丰富的方式使用这些 OOP 功能。有时我会在 PROGRAM 中添加方法以使它们更清晰。之前我只有一个功能块和五个辅助函数,现在我有一个带有私有方法的功能块。

        只是测试一下!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-10
          • 1970-01-01
          • 2017-01-10
          • 2020-08-10
          • 2012-05-01
          相关资源
          最近更新 更多