我有一个带有以下硬件链接的功能块:
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] );
希望这能有所帮助,并询问您是否还有任何问题