Riferimenti

Panoramica

Questo tipo di dati è disponibile come estensione dello standard IEC 61131-3.

Un riferimento memorizza l'indirizzo di un oggetto (una variabile) ubicato altrove nella memoria; il comportamento, a tale riguardo, è identico a un puntatore.

Rispetto a un puntatore, la variabile si comporta come un oggetto relativamente alla sintassi. Inoltre, le variabili dichiarate come REFERENCE forniscono i seguenti vantaggi rispetto a POINTERS:

  • Un riferimento non deve essere dereferenziato esplicitamente (con ^) per accedere al contenuto dell'oggetto referenziato.

  • Quando si passano valori ai parametri di ingresso di funzioni/blocchi funzione/metodi, si applica quanto segue: se un ingresso viene dichiarato come REFERENCE TO <data type>, è possibile passare una variabile del <data type> corrispondente (variabile refInput := invece di ptrInput :=ADR(variabile)).

  • Il compilatore verifica che i riferimenti dello stesso tipo di dati siano assegnati vicendevolmente.

Per maggiori informazioni, vedere la descrizione Operatore assegnazione REF.

È inoltre possibile utilizzare una funzione implicita di monitoraggio del puntatore come descritto nel paragrafo CheckPointer funzione.

Sintassi

<identificatore> : REFERENCE TO <tipo dati>

Esempio di dichiarazione

A : REFERENCE TO DUT;
B : DUT;
C : DUT;
A REF= B; // corresponds to A := ADR(B);
A := C; // corresponds to A^ := C;
NOTA: Non è possibile dichiarare riferimenti come REFERENCE TO REFERENCE o ARRAY OF REFERENCE o POINTER TO REFERENCE.

Verifica della validità dei riferimenti

È possibile utilizzare l'operatore __ISVALIDREF per verificare se un riferimento punta a un valore valido, ossia diverso da 0.

Sintassi

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

<reference name>: identificatore dichiarato con tipo REFERENCE TO <data type>.

La variabile booleana è TRUE, se il riferimento punta a un valore valido. Altrimenti è FALSE.

Esempio

Dichiarazione

ivar : INT;
ref_int : REFERENCE TO INT;
ref_int0: REFERENCE TO INT;
testref: BOOL := FALSE;

Implementazione

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