Tipo de datos: REFERENCE TO
Importante
Con la versión del compilador >= V3.3.0.0, las referencias se inicializan (en 0).
Importante
Si una referencia hace referencia a una entrada de dispositivo, el acceso se aplica como acceso de escritura. Cuando se genera el código, esto lleva a la advertencia del compilador: "...invalid assignment target
".
Ejemplo: rInput REF= Input;
Si necesita una construcción de este tipo, primero debe copiar el valor de entrada (ejemplo: rInput
) a una variable con acceso de escritura.
Una referencia con el REFERENCE
El tipo de datos se refiere implícitamente a otro objeto. La tarea se realiza con el REF=
operador. Cuando se accede, la referencia se desreferencia implícitamente y, por lo tanto, no necesita un operador de contenido especial. ^
como un puntero.
Sintaxis
<identifier> : REFERENCE TO <data type> ; <data type>: base type of the reference
PROGRAM PLC_PRG VAR rspeA : REFERENCE TO DUT_SPECIAL; pspeA : POINTER TO DUT_SPECIAL; speB : DUT_SPECIAL; END_VAR rspeA REF= speB; // Reference rspeA is alias for speB. The code corresponds to pspeA := ADR(speB); rspeA := speD; // The code corresponds to pspeA^ := speD;
ariTest : ARRAY[0..9] OF REFERENCE TO INT; priTest : POINTER TO REFERENCE TO INT; rriTest : REFERENCE TO REFERENCE TO INT; rbitTest : REFERENCE TO BIT;
Un tipo de referencia no se debe utilizar como tipo base de una matriz, un puntero o una referencia. Además, una referencia no debe referirse a una variable de bit. Este tipo de construcciones generan errores de compilación.
Nota
La legibilidad de un programa se dificulta cuando se accede simultáneamente a la misma celda de memoria por medio de un identificador y su alias.
Ejemplo: speB
y rspeA
Sugerencia
Referencias y punteros a BIT
las variables son inválido declaraciones, así como elementos de matriz con tipo base BIT
.
Cuando se asignan referencias con :=
, siempre se copia un valor, sin importar si la referencia está a la izquierda, a la derecha o a ambos lados:
Ref := value
escribe el valorvalue
al lugar al que apunta la referencia. En notación de puntero:Ref^ := value
value := Ref
escribe el valor al que apunta la referencia despuésvalue
. En notación de puntero:value := Ref^
Ref1 := Ref2
escribe el valor queRef2
puntos a. en el lugar dondeRef1
puntos a. En notación de puntero:Ref1^ := Ref2^
Cuando REF=
Se utiliza, siempre se aplica la dirección y tiene que haber una referencia en el lado izquierdo:
Ref REF= value
: La referencia apunta avalue
. En notación de puntero:Ref :=ADR(value)
Ref1 REF= Ref2
:Ref1
apunta al mismo valor queRef2
. En notación de puntero:Ref1 := Ref2
Value REF = Ref
conduce a un error de compilación
Sugerencia
En la declaración, REFERENCE TO INT REF= value
se comporta como REFERENCE TO INT := value
.
Comparación de referencia y puntero
Más fácil de usar:
Una referencia puede acceder al contenido del objeto referenciado directamente y sin desreferenciar.
Sintaxis más fina y simple al pasar valores:
Llamada de un bloque de funciones que pasa una referencia sin un operador de dirección en lugar de un puntero
Ejemplo:
fbDoIt(riInput:=iValue);
En vez de:
fbDoIt_1(piInput:=ADR(iValue));
Tipo de seguridad:
Al asignar dos referencias, el compilador verifica si sus tipos base coinciden. Esto no se comprueba en el caso de los punteros.
Probar la validez de una referencia
Puedes usar el operador __ISVALIDREF
para comprobar si una referencia apunta o no a un valor válido (es decir, un valor distinto de 0).
Sintaxis
<boolean variable name> := __ISVALIDREF( <reference name> );
<reference name>
: Identificador declarado con REFERENCE TO
La variable booleana es TRUE
cuando la referencia apunta a un valor válido. De lo contrario, es FALSE
.
PROGRAM PLC_PRG VAR iAlfa : INT; riBravo : REFERENCE TO INT; riCharlie : REFERENCE TO INT; bIsRef_Bravo : BOOL := FALSE; bIsRef_Charlie : BOOL := FALSE; END_VAR iAlfa := iAlfa + 1; riBravo REF= iAlfa; riCharlie REF= 0; bIsRef_Bravo := __ISVALIDREF(riBravo); (* becomes TRUE, because riBravo references to iAlfa, which is non-zero *) bIsRef_Charlie := __ISVALIDREF(riCharlie); (* becomes FALSE, because riCharlie is set to 0 *)
Sugerencia
En la versión del compilador 3.5.7.40 y superior, la función de supervisión implícita Puntero de control actúa sobre variables de tipo REFERENCE TO
de la misma manera que para las variables de puntero.