Deklaration von Referenz-Variablen (inkl. Zuweisungen darauf)

Syntax
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).
Als Erweiterung zur →IEC-Norm ist es möglich, eine Referenz auf ein ARRAY direkt zu deklarieren – analog zu "Deklaration eines ARRAY-Datentyps in ST".

Einschränkungen

  • Sie können keine Referenzen als Basis für →abgeleitete Datentypen verwenden.

  • Sie können keine Referenz-Variablen als Basis für ARRAY-Datentypen oder ARRAY-Variablen verwenden.

  • Sie können keine Referenzen auf Referenzen deklarieren.

  • Sie können keine Referenzen auf konstante Variablen deklarieren.

  • Sie können keine Referenzen auf →globale Variablen mit dem Attribute DMA deklarieren.

  • Referenzen auf den Typ eines →Funktionsbausteins, auf ein →Interface oder auf →Funktionen werden nicht in logi.CAD 3 unterstützt.

  • Beachten Sie bei der Verwendung von REF(...):

    • →Temporäre Variablen (= VAR_TEMP) sind innerhalb von REF(...) nicht zulässig.

    • Die Parameter zur Ausführungssteuerung EN und ENO sind innerhalb von REF(...) nicht zulässig.

    • In →Funktionen sind nur →externe Variablen innerhalb von REF(...) zulässig – sofern die Regel Referenzen auf lokale Variablen dürfen in Funktionen/Methoden nicht verwendet werden aktiviert ist.

    • Referenzen auf →Ein-/Ausgangsvariablen sind nicht als Initialisierungswert für Referenz-Variablen zulässig.

    • Falls eine ARRAY-Referenz-Variable innerhalb von REF(...) verwendet wird, muss die Variable vom gleichen Datentyp und mit dem gleichen Index-Unterbereich wie die Referenz-Variable sein, auf die die Zuweisung erfolgt.

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.

Beispiele
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).

Syntax
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.

Beispiele
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.

Beispiele
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:

  1. Der Ausgang ENO der umfassenden →POE wid auf den Wert FALSE (bzw. einer Entsprechung) gesetzt.

  2. 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.