引用隐式地引用另一个对象。访问时,引用被隐式解引用,因此不需要特殊的内容操作符 ^,比如指针。
.示例
PROGRAM PLC_PRG
VAR
rspeA : REFERENCE TO DUT_SPECIAL;
pspeA : POINTER TO DUT_SPECIAL;
speB : DUT_SPECIAL;
END_VAR
rspeA REF= speB; // 参考rspeA是speB的别名。The code corresponds to pspeA := ADR(speB);
rspeA := speD; // 代码对应于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;
引用类型不能用作数组、指针或引用的基类型。此外,引用不能指向位变量。这些类型的构造会产生编译器错误。
.与指针相比,引用有以下优点:;
你可以使用运算符__ISVALIDREF 来检查引用是否指向有效值(即指向不等于0的值)。
<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); (* 变为 TRUE, 因为riBravo 引用 iAlfa,非零*)
bIsRef_Charlie := __ISVALIDREF(riCharlie); (* 变为 FALSE, 因为 riCharlie 被设为 0 *)
在编译器版本3.5.7.40和更高版本中,隐式监视功能检查指针也会影响REFERENCE TO 类型的变量,与作用于指针变量的方式相同。 |