Type de données : REFERENCE TO
Important
Avec la version du compilateur >= V3.3.0.0, les références (avec 0) sont initialisées.
Important
Si une référence pointe vers une entrée d'appareil, l'accès est considéré comme un accès en écriture. Cela conduit à l'avertissement du compilateur lors de la génération de code ...kein gültiges Zuordnungsziel.
Exemple: rInput REF= Input;
Si vous avez besoin d'une construction de ce type, vous avez besoin de la valeur d'entrée, par exemple rInput, première copie dans une variable avec accès en écriture.
Une référence avec le REFERENCE le type de données fait implicitement référence à un autre objet. La mission se fait avec le REF= opérateur. Lors de l'accès, la référence est implicitement déréférencée et ne nécessite donc pas d'opérateur de contenu spécial ^ comme un pointeur.
syntaxe
<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 type référence ne peut pas être utilisé comme type de base d'un tableau, d'un pointeur ou d'une référence. De plus, une référence ne doit pas faire référence à une variable de bit. De telles constructions génèrent des erreurs de compilation.
Note
La lisibilité d'un programme est rendue difficile lorsqu'on accède simultanément à une même cellule mémoire au moyen d'un identifiant et de son alias.
Exemple: speB et rspeA
Astuce
Références et pointeurs vers BIT les variables sont non valide déclarations, ainsi que des éléments de tableau avec type de base BIT.
Lorsque des références sont attribuées avec :=, une valeur est toujours copiée, que la référence soit à gauche, à droite ou des deux côtés :
Ref := valueécrit la valeurvalueà l'endroit où pointe la référence. En notation pointeur :Ref^ := valuevalue := Refécrit la valeur à laquelle pointe la référence aprèsvalue. En notation pointeur :value := Ref^Ref1 := Ref2écrit la valeur quiRef2pointe vers. à l'endroit oùRef1pointe vers. En notation pointeur :Ref1^ := Ref2^
Quand REF= est utilisé, l'adresse est toujours appliquée et il doit y avoir une référence sur le côté gauche :
Ref REF= value: La référence pointe versvalue. En notation pointeur :Ref :=ADR(value)Ref1 REF= Ref2:Ref1pointe vers la même valeur queRef2. En notation pointeur :Ref1 := Ref2Value REF = Refconduit à une erreur de compilation
Astuce
Dans la déclaration, REFERENCE TO INT REF= value se comporte comme REFERENCE TO INT := value.
Comparaison de la référence et du pointeur
Plus facile à utiliser :
Une référence peut accéder directement au contenu de l'objet référencé sans déréférencement.
Syntaxe plus agréable et plus simple lors du passage des valeurs :
Appel d'un bloc fonction qui passe une référence sans opérateur d'adresse au lieu d'un pointeur
Exemple:
fbDoIt(riInput:=iValue);À la place de:
fbDoIt_1(piInput:=ADR(iValue));Type de sécurité :
Lors de l'affectation de deux références, le compilateur vérifie si leurs types de base correspondent. Ceci n'est pas vérifié dans le cas des pointeurs.
Tester la validité d'une référence
Vous pouvez utiliser l'opérateur __ISVALIDREF pour vérifier si une référence pointe vers une valeur valide (c'est-à-dire une valeur non égale à 0).
Syntaxe
<boolean variable name> := __ISVALIDREF( <reference name> );
<reference name>: Identifiant déclaré avec REFERENCE TO
La variable booléenne est TRUE lorsque la référence pointe vers une valeur valide. Sinon c'est 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 *)Astuce
Dans la version 3.5.7.40 et supérieure du compilateur, la fonction de surveillance implicite CheckPointer agit sur des variables de type REFERENCE TO de la même manière que pour les variables pointeur.