引用暗指另一个对象。访问时,引用是隐式取消引用的,因此不需要特殊的内容运算符 ^
(如指针)。
语法
<identifier> : REFERENCE TO <data type> ; <data type>: base type of the reference
示例
PROGRAM PLC_PRG VAR rspeA : REFERENCE TO DUT_SPECIAL; pspeA : POINTER TO DUT_SPECIAL; speB : DUT_SPECIAL; END_VAR rspeA REF= speB; // Reference rspeA is alias for speB. The code corresponds to pspeA := ADR(speB); rspeA := speD; // The code corresponds to pspeA^ := speB;
如果通过标识符及其别名(例如speB
和rspeA
)同时访问同一个存储单元,程序的可读性就会受到影响。




注意

在编译器版本 >= V3.3.0.0 时,引用被初始化(为 0)。




注意

如果引用指的是设备输入,则访问(例如rInput REF= Input;
)被视为写入访问。这导致在生成代码时出现编译器警告:"...invalid assignment target
"。
如果需要这种结构,必须先将输入值 (rInput
) 复制到一个具有写访问权限的变量中。
无效声明
ariTest : ARRAY[0..9] OF REFERENCE TO INT; priTest : POINTER TO REFERENCE TO INT; rriTest : REFERENCE TO REFERENCE TO INT; rbitTest : REFERENCE TO BIT;
引用类型不得用作数组、指针或引用的基本类型。此外,引用不得指向位变量。这类结构会产生编译器错误。
参照和指针的比较
与指针相比,引用具有以下优点:
-
更易于使用:
引用可以直接访问被引用对象的内容,而无需取消引用。
-
传递数值时语法更精细、更简单:
调用不使用地址运算符传递引用而不是指针的功能块
例如
fbDoIt(riInput:=iValue);
而不是
fbDoIt_1(piInput:=ADR(iValue));
-
类型安全:
在分配两个引用时,编译器会检查它们的基本类型是否匹配。如果是指针,则不检查这一点。
测试参考文献的有效性
您可以使用运算符__ISVALIDREF
检查引用是否指向有效值(即不等于 0 的值)。
语法
<Boolean variable name> := __ISVALIDREF( <reference name> );
<reference name>
:用 REFERENCE TO
当引用指向一个有效值时,布尔变量为TRUE
。否则,FALSE
。
示例
PROGRAM PLC_PRG VAR iAlfa : INT; riBravo : REFERENCE TO INT; riCharlie : REFERENCE TO INT; bIsRef_Bravo : BOOL := FALSE; bIsRef_Charlie : BOOL := FALSE; END_VAR iAlfa := iAlfa + 1; riBravo REF= iAlfa; riCharlie REF= 0; bIsRef_Bravo := __ISVALIDREF(riBravo); (* becomes TRUE, because riBravo references to iAlfa, which is non-zero *) bIsRef_Charlie := __ISVALIDREF(riCharlie); (* becomes FALSE, because riCharlie is set to 0 *)
在编译器 3.5.7.40 及更高版本中,隐式监控函数“CheckPointer” 对REFERENCE TO
类型的变量的作用方式与指针变量相同。