0

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

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

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

第一个问题出现在这里,因为我们的一些实时程序员认为方法并没有为此完成,在这种情况下,我们应该实现从 FB_CONVEYOR 调用的 FB_INIT 并且它包含自己的变量,因此两者都有 REF 到 FB_MOTOR .

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

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

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

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

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

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

4

3 回答 3

1

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

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

在这里阅读更多信息:http: //infosys.beckhoff.com/content/1033/tc3_plc_intro/html/pou_method.htm

于 2014-05-06T13:04:33.867 回答
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 中不存在实例。只有VAR_STATandVAR_TEMP可以用在 Program 的方法中。它与其他不能实例化静态类的编程语言非常相似,它们的变量也只能是静态的。

于 2017-02-21T12:25:34.470 回答
0

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

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

该块如下所示:

FB_Logger

  • 添加日志线
    • 添加日志行的公共方法
  • 保存日志到文件
    • 保存日志文件的公共操作(也可以是一种方法)
  • 从文件加载日志
    • 读取日志文件的公共操作(也可以是一种方法)
  • 对数数组
    • 日志数组的公共 getter。数组引用类型的属性..
  • 获取日志文件头
    • 创建文件头的私有方法
  • 获取日志文件行
    • 创建日志行的私有方法
  • 保存存档
    • 开始保存的私人方法
  • ShiftLogItems
    • 转移日志数组的私有方法

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

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

只是测试一下!

于 2017-08-21T04:50:46.953 回答