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.
A : REFERENCE TO DUT;
B : DUT;
C : DUT;
A REF= B; // corresponds to A := ADR(B);
A := C; // corresponds to A^ := C;
È 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 *)