Referencias

Descripción general

Este tipo de datos está disponible en la extensión a la norma IEC 61131-3.

Una referencia almacena la dirección de un objeto (una variable) que se encuentra en otro punto de la memoria; en este sentido, el comportamiento es idéntico al de un puntero.

A diferencia de un puntero, una variable se comporta como un objeto cuando se hace referencia a la sintaxis. Además, las variables declaradas como REFERENCE ofrecen las siguientes ventajas en comparación con POINTERS:

oLas referencias no tienen que quitarse de manera explícita (con ^) para poder acceder al contenido del objeto referenciado.

oAl transmitir valores a los parámetros de entrada de funciones, bloques de funciones o métodos, se aplica lo siguiente: si se declara una entrada como REFERENCE TO <tipo de datos>, podrá transmitirse una variable del <tipo de datos> correspondiente (variable refInput := en lugar de ptrInput :=ADR(variable)).

oEl compilador verifica que las referencias de un mismo tipo de datos se asignen mutuamente.

Para obtener más información, consulte la descripción de operador de asignación REF.

Sintaxis

<identificador> : REFERENCE TO <tipo de datos>

Declaración de ejemplo

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

NOTA: No es posible declarar referencias como REFERENCE TO REFERENCE, ARRAY OF REFERENCE o POINTER TO REFERENCE.

Búsqueda de referencias válidas

Puede utilizar el operador __ISVALIDREF para comprobar si una referencia apunta a un valor válido distinto a 0.

Sintaxis

<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.

Ejemplo

Declaración

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

Implementación

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