Deklaration von Referenz-Variablen (inkl. Zuweisungen darauf)
VAR | VAR_INPUT | VAR_OUTPUT | VAR_TEMP
name_1, name_2, ..., name_n : REF_TO type := REF(name_A);
name_3, name_4, ..., name_n : REF_TO ARRAY [x..y] OF type := REF(name_B); (* Bis zu 4 Dimensionen sind möglich. *)
...
END_VAR
Bedeutung |
Deklaration einer oder mehrerer →Referenz-Variablen, wobei name_1, name_2 usw. →IEC-Bezeichner sein müssen. Möglicherweise sind Ihnen Referenzen unter dem Begriff "→Pointer" bekannt. Informieren Sie sich unter "Unterstützte Datentypen", welche Datentypen (type) Sie für die Deklaration angeben können. Mit dem optionalen →Initialisierungswert := REF(...) weisen Sie der Referenz die Adresse einer bereits deklarierten Variable zu. Diese Variable muss vom gleichen Datentyp wie die Referenz sein. Falls Sie keinen Initialisierungswert eingeben, wird die Referenz mit dem Wert NULL initialisiert (d.h., die Referenz verweist auf nichts). Einschränkungen
|
Die Deklaration von Referenz-Variablen ist innerhalb dieser Abschnitte möglich:
Abschnitt |
Die Deklaration der Referenz erfolgt als: |
VAR ... END_VAR |
interne Variable (siehe "Deklaration von internen Variablen") |
VAR_INPUT ... END_VAR |
Eingangsvariable (siehe "Deklaration von Eingangsvariablen in ST") |
VAR_OUTPUT ... END_VAR |
Ausgangsvariable (siehe "Deklaration von Ausgangsvariablen in ST") |
VAR_TEMP ... END_VAR |
temporäre Variable (siehe "Deklaration von temporären Variablen in ST") |
logi.CAD 3 bietet außerdem die Möglichkeit, zusätzliche Daten bei der Deklaration anzugeben. Siehe "Beschreibung, Kommentar oder JSON-String für Variablen und Datentypen angeben" für Details.
VAR
myInt: INT;
myArray: ARRAY [1..10] OF INT;
myRef: REF_TO INT := REF(myInt);
myRefArr: REF_TO ARRAY [1..10] OF INT := REF(myArray);
myRef2: REF_TO INT := REF(myArray[1]);
END_VAR
Zuweisungen auf Referenz-Variablen
→Zuweisungen auf Referenz-Variablen sind prinzipiell im deklarierten Sprachelement möglich. Die Verwendung von REF(...) ist jedoch nur eingeschränkt möglich (siehe Einschränkungen oben).
reference_variable_1 := REF(name) | NULL;
reference_variable_1 := reference_variable_2;
Der Ausdruck auf der rechten Seite des Zuweisungsoperators ":=" darf eines der folgenden Konstrukte sein:
REF(name), wobei name eine Variable vom gleichen Datentyp wie die Referenz-Variable sein muss, auf die die Zuweisung erfolgt – Beachten Sie die Einschränkungen bei der Verwendung von REF(), die oben angeführt sind.
NULL
eine andere deklarierte Referenz-Variable, wobei diese vom gleichen Datentyp wie die Referenz-Variable sein muss, auf die die Zuweisung erfolgt
Bei Zuweisung auf eine ARRAY-Referenz-Variable muss die Variable vom gleichen Datentyp und mit dem gleichen Index-Unterbereich sein.
VAR
Int1R : REF_TO INT;
Int2R : REF_TO INT;
DIntR : REF_TO DINT;
Int1 : INT;
DInt2 : DINT;
ArrIntR1 : REF_TO ARRAY [1..10] OF INT;
ArrInt1 : ARRAY [1..10] OF INT;
ArrInt2 : ARRAY [2..11] OF INT;
END_VAR
Int1R := NULL; (* OK, da 'NULL' für Zuweisung auf Referenz-Variable zulässig ist *)
Int1R := REF(Int1); (* OK, da 'Int1' vom gleichen Datentyp wie 'Int1R' ist *)
Int1R := Int2R; (* OK, da 'Int2R' vom gleichen Datentyp wie 'Int1R' ist *)
ArrIntR1 := REF(ArrInt1); (* OK, da 'ArrInt1' vom gleichen Datentyp und mit dem gleichen Index-Unterbereich wie 'ArrIntR1' ist *)
Int1R := 0; (* Fehler, da '0' für Zuweisung auf Referenz-Variable nicht zulässig ist *)
Int1R := REF(DInt2); (* Fehler, da 'DInt2' nicht vom gleichen Datentyp wie 'Int1R' ist *)
Int1R := DIntR; (* Fehler, da 'DIntR' nicht vom gleichen Datentyp wie 'Int1R' ist *)
Int1R := Int1; (* Fehler, da 'Int1' keine Referenz-Variable ist *)
ArrIntR1 := REF(ArrInt2); (* Fehler, da 'ArrInt2' nicht mit dem gleichen Index-Unterbereich wie 'ArrIntR1' deklariert ist, obwohl sie vom gleichen Datentyp ist *)
ArrIntR1 := ArrInt2; (* Fehler, da 'ArrInt2' keine Referenz-Variable ist *)
Dereferenzierung: Zugriff auf den Inhalt von Referenz-Variablen
Der Zugriff auf den Inhalt von Referenz-Variablen ist als Dereferenzieren bekannt und erfolgt mit dem Zeichen ^, das dem Namen der Referenz-Variable folgt.
Int1 := Int1R^; (* Der Inhalt der Variable, auf welche die Referenz-Variable 'Int1R' verweist, wird der Variable 'Int1' zugewiesen. *)
Int2R^ := ArrIntR1^[2]; (* Die Variable, auf die 'Int2R' referenziert, enthält nun den gleichen Inhalt wie das 2. Element der Array-Variable, auf welche die Referenz-Variable 'ArrIntR1' verweist. *)
ArrIntR1^ := ArrInt1; (* Die Variable 'ArrInt1' wird auf den Inhalt der Variable zugewiesen, auf welche die Referenz-Variable 'ArrIntR1' verweist. *)
Zugriff auf Referenz-Variablen mit dem Inhalt NULL
logi.CAD 3 prüft diese ST-Konstrukte nicht bei der Eingabe im ST-Editor, sondern erst beim Ausführen der Anwendung. Dabei erfolgt diese Fehlerbehandlung:
Der Ausgang ENO der umfassenden →POE wid auf den Wert FALSE (bzw. einer Entsprechung) gesetzt.
Der restliche Baustein-Code wird nicht mehr ausgeführt.
Im obigen Beispiel wird die Zuweisung Int1 := Int1R^; nicht ausgeführt, da der Zugriff auf der rechten Seite des Zuweisungsoperators ":=" erfolgt.
logi.cals empfiehlt Ihnen, Code in Ihrer Anwendung (z.B. IF-Anweisungen) einzufügen, um die Verwendung von solchen Variablen mit dem Inhalt NULL zu erkennen.