引用

概述

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

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

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

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

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

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

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

也可以按照 CheckPointer 函数中所述那样,使用隐式监控功能。

语法

<标识符> : 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 REFERENCEARRAY OF REFERENCEPOINTER TO REFERENCE 之类的引用。

检查有效引用

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

语法

<Boolean variable name> := __ISVALIDREF( <reference name> );

<reference name>:使用类型 REFERENCE TO <data type> 声明的标识符。

如果引用指向有效值,则布尔变量 TRUE。否则为 FALSE。

示例

声明

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 *)