Skip to main content

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
ejemplo 214. Declaración válida
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;


ejemplo 215. Declaraciones inválidas
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.

ejemplo 216. Ejemplos

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 valor value 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és value. En notación de puntero: value := Ref^

  • Ref1 := Ref2 escribe el valor que Ref2 puntos a. en el lugar donde Ref1 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 a value. En notación de puntero: Ref :=ADR(value)

  • Ref1 REF= Ref2: Ref1apunta al mismo valor que Ref2. 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

. Una referencia tiene las siguientes ventajas sobre un 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.