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.
<identificador> : REFERENCE TO <tipo de datos>
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 *)