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

AbschnittDie Deklaration der Referenz erfolgt als:
VAR ... END_VARinterne Variable (siehe "Deklaration von internen Variablen und Funktionsbaustein-Instanzen in ST")
VAR_INPUT ... END_VAREingangsvariable (siehe "Deklaration von Eingangsvariablen in ST")
VAR_OUTPUT ... END_VARAusgangsvariable (siehe "Deklaration von Ausgangsvariablen in ST")
VAR_TEMP ... END_VARtemporä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 innerhalb der Deklaration eines →Programms, eines →Funktionsbausteins und einer →Funktion 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. *)

Ein Zugriff auf Referenz-Variablen mit dem Inhalt NULL wird nicht bei der Eingabe im ST-Editor geprüft, sondern erst beim Ausführen der Anwendung. In diesem Fall wird der Ausgang ENO der umfassenden →POE auf den Wert FALSE (bzw. einer Entsprechung) gesetzt. Zusätzlich wird die Zuweisung nicht ausgeführt, falls der Zugriff auf der rechten Seite des Zuweisungsoperators ":=" erfolgt (siehe Int1 := Int1R^; im obigen Beispiel).
logi.cals empfiehlt Ihnen, Code in Ihrer Anwendung (z.B. IF-Anweisungen) einzufügen, um den Zugriff auf Referenz-Variablen mit dem Inhalt NULL zu erkennen.