使用属性访问Twincat功能块字段



我有一个带有以下硬件链接的功能块:

bEL1852OutputBools AT %Q* : ARRAY[1..8] OF BOOL;

我想创建一个属性,使我既可以获取也可以设置对bEL1852OutputBools的访问权限所以我可以这样做:

fbEL1852.Outputs[1] := TRUE;

我想我需要以某种方式重新引用/指向它,但我真的不确定如何引用/指向。

PROPERTY PUBLIC Outputs : ARRAY[1..8] OF BOOL

获取

Outputs := bEL1852OutputBools;

设置

bEL1852OutputBools:= Outputs;

编辑

好的,所以我想好了如何使用输出:

PROPERTY PUBLIC Outputs : REFERENCE TO ARRAY[1..8] OF BOOL;

获取

Outputs REF= bEL1852OutputBools;

设置

bEL1852OutputBools = Outputs;

但如果我尝试对输入执行同样的操作,我会得到编译器错误:"在映射到输入地址"的变量上不可能进行引用赋值;

Inputs REF= bEL1852InputBools; 

对于输入变量的属性,是否没有办法做到这一点?

如果您有一个带有属性的函数块,那么就不必担心任何引用,除非您打算将这些引用传递到无法轻松访问FB的地方。

在访问数组的情况下,函数访问来自对象的属性可能会有点麻烦。在这种情况下,我想说首选的解决方案实际上取决于您的用例,但有些选项是:

(注意:有更干净的方法可以通过静态分配来处理大多数这些问题,但这应该以简洁的方式传达出来(

使用标准辅助变量:

正如错误值所说的那样,使用一个您希望读取/写入值的辅助变量。如果您在函数块或循环中执行对这些变量的访问,这可能是一种有用的方法,在某个地方,同一变量可以用于多个访问器。

_TempBool := fbEL.Inputs[1];

在访问者处拆分数据:

如果你不能通过函数访问数据,那么就不需要了。完全拆分属性意味着没有必要处理这些,然而,如果你打算以任何编程方式访问变量,这可能不是一个有用的解决方案,因为你不能通过特定的位置调用它们

PROPERTY Input1 : BOOL
Input1 := Inputs[1];
PROPERTY Input2 : BOOL
Input2 := Inputs[2];

将数据打包到访问者中:

与其将数据作为数组的元素访问,不如将数据作为BYTE的元素访问。从好的方面来说,你可以在BYTE上进行任何类型的位操作,但是如果你正在进行位访问,速度可能会慢一点,如果你试图访问循环中的东西,这将更令人沮丧

PROPERTY InputByte : BYTE
InputByte.0 := Inputs[1];
InputByte.1 := Inputs[2];

使用指针而不是引用:

指针是在引用不可用但有充分理由的情况下的回退。它们需要额外的计划和小心的处理,以避免崩溃或坏数据。否则,尽管他们应该能够做你想做的事。

PROPERTY pInputArray : ARRAY [1..8] OF POINTER TO BOOL
pInputArray[1] := ADR( Inputs[1] );
pInputArray[2] := ADR( Inputs[2] );

希望这能有所帮助,并询问您是否还有任何问题

最新更新