Eine Referenz verweist implizit auf ein anderes Objekt. Beim Zugriff wird die Referenz
implizit dereferenziert, und benötigt deswegen keinen speziellen Inhaltsoperator ^ wie ein Pointer.
Syntax
<identifier> : REFERENCE TO <data type> ; <data type>: base type of the reference
Beispiel
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^ := speB;
Die Lesbarkeit eines Programms wird erschwert, wenn gleichzeitig über einen Bezeichner
und dessen Alias (beispielsweise speB und rspeA) auf die gleiche Speicherzelle zugegriffen wird.




HINWEIS

Mit Compilerversion >= V3.3.0.0 werden Referenzen (mit 0) initialisiert.




HINWEIS

Wenn eine Referenz auf einen Geräteeingang verweist, gilt der Zugriff (beispielsweise
rInput REF= Input;) als schreibender Zugriff. Dies führt bei der Codeerzeugung zu einer Compilerwarnung
"...kein gültiges Zuordnungsziel".
Wenn Sie ein Konstrukt dieser Art benötigen, müssen Sie den Eingangswert (rInput) zuerst auf eine Variable mit Schreibzugriff kopieren.
Ungültige Deklarationen
ariTest : ARRAY[0..9] OF REFERENCE TO INT; priTest : POINTER TO REFERENCE TO INT; rriTest : REFERENCE TO REFERENCE TO INT; rbitTest : REFERENCE TO BIT;
Ein Referenztyp darf nicht als Basistyp eines Arrays, Pointers oder einer Referenz verwendet werden. Außerdem darf eine Referenz nicht auf eine Bit-Variable verweisen. Solche Konstrukte erzeugen Compilerfehler.
Vergleich von Referenz und Pointer
Eine Referenz hat gegenüber einem Pointer folgende Vorteile:
-
Einfachere Nutzung:
Eine Referenz kann direkt, ohne Dereferenzierung auf die Inhalte des referenzierten Objekts zugreifen.
-
Schönere und einfachere Syntax bei Übergabe von Werten:
Aufruf eines Funktionsbausteins, der statt einem Pointer eine Referenz ohne Adressoperator übergibt
Beispiel:
fbDoIt(riInput:=iValue);statt:
fbDoIt_1(piInput:=ADR(iValue)); -
Typsicherheit:
Der Compiler prüft bei der Zuweisung zweier Referenzen, ob deren Basistypen übereinstimmen. Bei Pointern wird dies nicht geprüft.
Referenz auf Gültigkeit prüfen
Sie können den Operator __ISVALIDREF verwenden, um zu prüfen, ob eine Referenz auf einen gültigen Wert verweist, das heißt
auf einen Wert ungleich 0.
Syntax
<boolean variable name> := __ISVALIDREF( <reference name> );
<reference name>: mit REFERENCE TO deklarierter Bezeichner
Die boolesche Variable wird TRUE, wenn die Referenz auf einen gültigen Wert zeigt, andernfalls FALSE.
Beispiel
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 *)
Die implizite Überwachungsfunktion „Checkpointer“ wirkt ab Compiler Version
3.5.7.40 auf Variablen vom Typ REFERENCE TO
in gleicher Weise wie auf Pointervariablen.