参考

概述

此数据类型在 IEC 61131-3 标准的扩展中可用。

引用存储位于内存中其他位置的对象(变量)的地址;在这方面,行为与指针相同。

与指针不同的是,在涉及语法时,变量的行为与对象相似。此外,声明为 REFERENCE 的变量相比 POINTERS 具有以下优点:

o引用不必被显式取消引用(使用 ^),亦可访问所引用的对象的内容。

o在将值传送到函数/功能块/方法的输入参数时,适用以下规则:如果输入被声明为 REFERENCE TO <数据类型>,则可以传送相应<数据类型>的变量(refInput := 变量,而不是 ptrInput :=ADR(variable))。

o编译器验证数据类型相同的引用是否被分配给彼此。

有关更多信息,请参阅分配操作符 REF 说明

语法

<标识符> : REFERENCE TO <数据类型>

声明示例

A : REFERENCE TO DUT;
B : DUT;
C : DUT;
A REF= B; // corresponds to A := ADR(B);
A := C; // corresponds to A^ := C;

注意: 无法声明如 REFERENCE TO REFERENCE、ARRAY OF REFERENCE 或 POINTER TO REFERENCE 之类的引用。

检查有效引用

您可以使用操作符 __ISVALIDREF 来检查某个引用是否指向有效值(即,不等于 0 的值)。

语法

<boolean variable> := __ISVALIDREF(identifier, declared with type <REFERENCE TO <datatype>);
<boolean variable> will be TRUE, if the reference points to a valid value, FALSE if not.

示例

声明

ivar : INT;
ref_int : REFERENCE TO INT;
ref_int0: REFERENCE TO INT;
testref: BOOL := FALSE;

实现

ivar := ivar +1;
ref_int REF= ivar;
ref_int0 REF= 0;
testref := __ISVALIDREF(ref_int);   (* will be TRUE, because ref_int points to ivar, which is unequal 0 *)
testref := __ISVALIDREF(ref_int0); (* will be FALSE, because ref_int is set to 0 *)