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:

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

  • Al 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 <data type>, podrá transmitirse una variable del <data type> correspondiente (variable refInput := en lugar de ptrInput :=ADR [variable]).

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

También puede usar una función de supervisión de puntero implícita, como se describe en la sección función CheckPointer.

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

Sintaxis

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

<reference name>: identificador declarado con tipo REFERENCE TO <data type>.

La variable booleana es TRUE si la referencia apunta a un valor válido. De lo contrario, es FALSE.

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