.

引用

.
.

引用隐式地引用另一个对象。访问时,引用被隐式解引用,因此不需要特殊的内容操作符 ^,比如指针。

.语法

<标识符>: REFERENCE TO <数据类型> ;
<数据类型>:引用的基类型
 
.

.示例


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;
 

 

当使用标识符和它的别名同时访问相同的存储单元时,程序将很难具备可读性(例如speBrspeA)。

提示!

在编译器版本>= 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的值)。

.语法

<布尔变量名> := __ISVALIDREF( <引用名称> );
 

<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 类型的变量,与作用于指针变量的方式相同。