Références

Présentation

Ce type de données correspond à une extension de la norme IEC 61131-3.

L'adresse d'un objet (une variable) situé ailleurs dans la mémoire est enregistrée dans une référence, qui fonctionne comme un pointeur.

En revanche, contrairement à un pointeur, la variable se comporte comme un objet lorsque la syntaxe est appliquée. En outre, les variables déclarées comme REFERENCE offrent les avantages suivants par rapport aux objets de type POINTERS :

  • Le contenu de l'objet référencé est accessible sans avoir à annuler explicitement le référencement (via ^).

  • Voici ce qui se produit lorsque des valeurs sont transmises aux paramètres d'entrée de fonctions, blocs fonction ou méthodes : si une entrée est déclarée via la syntaxe REFERENCE TO <data type>, une variable du <data type> correspondant peut être transmise (variable refInput := au lieu de ptrInput :=ADR(variable)).

  • Le compilateur vérifie que seules les références correspondant au même type de données peuvent être affectées.

Pour plus d'informations, consultez la section Opérateur d'affectation REF.

Vous pouvez utiliser une fonction de surveillance de pointeur implicite, comme indiqué dans le paragraphe fonction CheckPointer.

Syntaxe

<identificateur> : REFERENCE TO <type de données>

Exemple de déclaration

A : REFERENCE TO DUT;
B : DUT;
C : DUT;
A REF= B; // corresponds to A := ADR(B);
A := C; // corresponds to A^ := C;
NOTE : il est impossible de déclarer des références de type REFERENCE TO REFERENCE, ARRAY OF REFERENCE et POINTER TO REFERENCE.

Vérification de la validité des références

L'opérateur __ISVALIDREF permet de vérifier que la référence indique une valeur valide différente de 0.

Syntaxe

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

<reference name> : identificateur déclaré avec le type REFERENCE TO <data type>

La valeur booléenne est TRUE, si la référence indique une valeur valide. Sinon, elle prend la valeur FALSE.

Exemple

Déclaration

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

Mise en œuvre

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