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)];   (* Up to 4 dimensions are possible. *)
   ...
(* Additional pieces of data, such as partial addresses, are also possible for the variables. *)
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.

Als type für die Referenz-Variable können Sie einen →Datentyp, einen →Funktionsbaustein oder eine →Klasse verwenden. Informieren Sie sich unter "Unterstützte Datentypen (in ST)", welche Datentypen Sie 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 ein →Interface oder auf eine →Funktion werden nicht in Neuron Power Engineer 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ührungssteuerungEN 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:
(Informieren Sie sich in der jeweiligen Beschreibung zum Abschnitt über evtl. zusätzliche Möglichkeiten für die Variable.)

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")

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

Beispiel
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, because 'NULL' is allowed for assignment to a reference variable *)
Int1R := REF(Int1);        (* OK, because 'Int1' is of the same data type as 'Int1R' *)
Int1R := Int2R;            (* OK, because 'Int2R' is of the same data type as 'Int1R' *)
ArrIntR1 := REF(ArrInt1);  (* OK, because 'ArrInt1' is of the same data type and the same index subrange as 'ArrIntR1' *)
 
Int1R := 0;                (* error, because '0' is not allowed for assignment to a reference variable *)
Int1R := REF(DInt2);       (* error, because 'DInt2' is not of the same data type as 'Int1R' *)
Int1R := DIntR;            (* error, because 'DIntR' is not of the same data type as 'Int1R' *) 
Int1R := Int1;             (* error, because 'Int1' kis not a reference variable *)  
ArrIntR1 := REF(ArrInt2);  (* error, because 'ArrInt2' has not been declared with the same index subrange as 'ArrIntR1', although it is of the same data type *) 
ArrIntR1 := ArrInt2;       (* error, because 'ArrInt2' is not a reference variable *)

Dereferenzierung: Zugriff auf den Inhalt von Referenz-Variablen

Der Zugriff auf den Inhalt von Referenz-Variablen ist als Dereferenzieren bekannt. Dies erfolgt mit dem Zeichen ^, das dem Namen der Referenz-Variable folgt.

Beispiele
Int1   := Int1R^;         (* The content of the variable to which the reference variable 'Int1R' references is assigned to the variable 'Int1'. *)
Int2R^ := ArrIntR1^[2];   (* Now the variable to which 'Int2R' references contains the same content as the 2nd element of the ARRAY variable to which the reference variable 'ArrIntR1' references. *)
ArrIntR1^ := ArrInt1;     (* The variable 'ArrInt1' is assigned to the content of the variable to which the reference variable 'ArrIntR1' references. *)

Zugriff auf Referenz-Variablen mit dem Inhalt NULL

Neuron Power Engineer 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 wird auf den Wert FALSE (bzw. eine 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.

Neuron empfiehlt Ihnen, Code in Ihrer Anwendung (z.B. IF-Anweisungen) einzufügen, um die Verwendung von solchen Variablen mit dem Inhalt NULL zu erkennen.