Tipo di dati: REFERENCE TO
Importante
Con la versione del compilatore >= V3.3.0.0, i riferimenti vengono inizializzati (a 0).
Importante
Se un riferimento fa riferimento a un input del dispositivo, l'accesso viene applicato come accesso in scrittura. Quando il codice viene generato, questo porta all'avviso del compilatore: "...invalid assignment target".
Esempio: rInput REF= Input;
Se hai bisogno di un costrutto di questo tipo, devi prima copiare il valore di input (esempio: rInput) a una variabile con accesso in scrittura.
Un riferimento con il REFERENCE il tipo di dati fa implicitamente riferimento a un altro oggetto. L'incarico viene svolto con il REF= operatore. Quando si accede, il riferimento viene dereferenziato in modo implicito e pertanto non necessita di un operatore di contenuto speciale ^ come un puntatore.
Sintassi
<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 di riferimento non deve essere utilizzato come tipo di base di una matrice, un puntatore o un riferimento. Inoltre, un riferimento non deve fare riferimento a una variabile bit. Questi tipi di costrutti generano errori del compilatore.
Nota
La leggibilità di un programma è resa difficoltosa quando si accede contemporaneamente alla stessa cella di memoria tramite un identificatore ed il suo alias.
Esempio: speB e rspeA
Suggerimento
Riferimenti e puntatori a BIT le variabili sono non valido dichiarazioni, nonché elementi di matrice con tipo base BIT.
Quando vengono assegnati i riferimenti con :=, un valore viene sempre copiato, indipendentemente dal fatto che il riferimento sia a sinistra, a destra o su entrambi i lati:
- Ref := valuescrive il valore- valuealla posizione a cui punta il riferimento. Nella notazione del puntatore:- Ref^ := value
- value := Refscrive il valore a cui punta il riferimento dopo- value. Nella notazione del puntatore:- value := Ref^
- Ref1 := Ref2scrive il valore which- Ref2punta a. nel luogo in cui- Ref1punta a. Nella notazione del puntatore:- Ref1^ := Ref2^
Quando REF= viene utilizzato, l'indirizzo viene sempre applicato e deve esserci un riferimento sul lato sinistro:
- Ref REF= value: Il riferimento punta a- value. Nella notazione del puntatore:- Ref :=ADR(value)
- Ref1 REF= Ref2:- Ref1punta allo stesso valore di- Ref2. Nella notazione del puntatore:- Ref1 := Ref2
- Value REF = Refporta ad un errore di compilazione
Suggerimento
Nella dichiarazione, REFERENCE TO INT REF= value si comporta come REFERENCE TO INT := value.
Confronto tra riferimento e puntatore
- Più facile da usare: - Un riferimento può accedere al contenuto dell'oggetto referenziato direttamente e senza dereferenziazione. 
- Sintassi più fine e più semplice durante il passaggio di valori: - Richiamo di un blocco funzione che passa un riferimento senza un operatore di indirizzo invece di un puntatore - Esempio: - fbDoIt(riInput:=iValue);- Invece di: - fbDoIt_1(piInput:=ADR(iValue));
- Tipo di sicurezza: - Quando si assegnano due riferimenti, il compilatore controlla se i loro tipi di base corrispondono. Questo non è verificato nel caso dei puntatori. 
Verifica della validità di un riferimento
Puoi usare l'operatore __ISVALIDREF per verificare se un riferimento punta o meno a un valore valido (ovvero un valore diverso da 0).
Sintassi
<boolean variable name> := __ISVALIDREF( <reference name> );
<reference name>: Identificatore dichiarato con REFERENCE TO
La variabile booleana è TRUE quando il riferimento punta a un valore valido. Altrimenti lo è 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 *)Suggerimento
Nella versione del compilatore 3.5.7.40 e successive, la funzione di monitoraggio implicito CheckPointer agisce su variabili di tipo REFERENCE TO allo stesso modo delle variabili puntatore.