Deklaration eines strukturierten Datentyps in ST

Syntax
TYPE
   {KeepElementOrder}  (* optional specification per structured data type; affects the sorting of the structure elements within the generated C-code *)
   name_1: STRUCT
      name_e1 : type := initial-value;  (* Partial addresses are also possible for the structure element. *)
      name_e2 : REF_TO type;            (* Partial addresses are also possible for the structure element. *)
      name_e3 : FB-type;                (* Partial addresses are also possible for the structure element. *)
      name_e4 : interface;              (* Partial addresses are also possible for the structure element. *)
      ...
      name_en : type := initial-value;
   END_STRUCT (* optional_begin *) {SIZE := value} (* optional_end *);
   {KeepElementOrder}
   name_2: STRUCT
      name_e1 : type := initial-value;
      ...
   END_STRUCT (* optional_begin *) {SIZE := value} (* optional_end *);
   ... 
   {KeepElementOrder}
   name_n: STRUCT
   ... 
   END_STRUCT (* optional_begin *) {SIZE := value} (* optional_end *);
END_TYPE 
Bedeutung

Deklaration eines oder mehrerer →strukturierter Datentypen (name_1, name_2 etc.) mit einer Sammlung von →benannten Elementen (den Strukturelementen name_e1, name_e2 etc.) von bestimmten →Datentypen (type), →Funktionsbausteinen (FB-type) oder →Interfaces (interface)

STRUCT und END_STRUCT sind die →Schlüsselwörter für die Deklaration eines strukturieren Datentyps. Diese Deklaration ist innerhalb der Deklaration eines anwenderdefinierten Datentyps (TYPE ... END_TYPE) möglich.
name_1, name_2 etc. und name_e1, name_e2 etc. müssen →IEC-Bezeichner sein.

Ein Datentyp ist als Typ für ein Strukturelement möglich. Informieren Sie sich unter "Unterstützte Datentypen", welche Datentypen Sie für die Deklaration angeben können. Zusätzlich ist eine →Referenz (REF_TO), ein vorhandener Funktionsbaustein (in →ST, →FBS oder →KOP erstellt) und ein Interface als Typ für die Strukturelemente möglich.

Mit dem optionalen →Initialisierungswert weisen Sie den := initial-value-Elementen einen Wert zu. Als Initialisierungswert (auf der rechten Seite des Zuweisungsoperators ":=") dürfen Sie einen →konstanter Ausdruck angeben, wie unter "Initialisierung von Variablen in ST" angeführt. Bedingung: Der Initialisierungswert muss vom gleichen Datentyp (type) sein oder einem Datentyp, der aufgrund der impliziten Konvertierung in diesen umgewandelt werden kann. Falls Sie keinen Initialisierungswert eingeben, gilt der Standard-Initialisierungswert des Datentyps.

Mit der optionalen Anweisung {KeepElementOrder} werden die Strukturelemente im generierten C-Code so sortiert, wie diese im ST-Code deklariert sind. Dazu müssen Sie nur die Anweisung vor dem betroffenen Strukturdatentyp im ST-Objekt einfügen (siehe folgende Beispiele).

Einschränkungen

 

Gut zu wissen

(Graue Glühbirne) Informationen über den Zugriff auf die Strukturelemente finden Sie unter: "Zugriff auf strukturierten Datentyp und Strukturelemente".

(Graue Glühbirne) Neuron Power Engineer bietet außerdem die Möglichkeit, noch nicht festgelegte Speicherorte bei der Deklaration anzugeben. Siehe "Deklaration eines Sprachelements mit partieller Adresse in ST" für Details.

(Graue Glühbirne) Darüber hinaus bietet Ihnen Neuron Power Engineer die Möglichkeit, das optionale Attribut SIZE zu definieren. Siehe "Deklaration eines Sprachelements mit partieller Adresse in ST" für Details zu SIZE.

(Graue Glühbirne) Neuron Power Engineer bietet außerdem die Möglichkeit, zusätzliche Daten bei der Deklaration anzugeben. Siehe "Beschreibung, Kommentar, JSON-String oder Typ für Variablen oder Datentypen angeben" für Details.

Beispiele ohne Anweisung für Sortierung der Strukturelemente
TYPE
  Range : STRUCT
    min : INT;         (* no initialization *)
    max : INT := 300;  (* initialization *)
  END_STRUCT;
  RangeS : STRUCT
    signal   : BOOL;        
    scaleMin : DINT;  
    scaleMax : DINT;  
  END_STRUCT;
  RangeD : STRUCT
    signal   : BOOL;
    scaleMin : ARRAY [1..3] OF Data_MIN;   (* 'Data_MIN' is a user-defined data type. *)
    scaleMax : Data_MAX;                   (* 'Data_MAX' is a user-defined data type. *)
    myRef: REF_TO INT;                     (* 'myRef' is a reference to 'INT'. *)
  END_STRUCT;
  Cooler : STRUCT
    Temp    : INT;
    Cooling : TOF;                         (* function block 'TOF' as structure element *) 
  END_STRUCT;
  Data_MIN : INT;
  Data_MAX : ARRAY [1..3] OF INT;
END_TYPE

Ohne Anweisung {KeepElementOrder} werden die Strukturelemente automatisch im generierten C-Code sortiert. Dafür wird zuerst der Datentyp verwendet (beginnend mit BOOL, weiter nach ansteigender Datentypgröße, Struktur- und Array-Datentypen zum Abschluss). Bei gleichem Datentyp wird laut Elementname sortiert (mit alphanumerischer Sortierung).

Beispiel mit Anweisung für Sortierung der Strukturelemente
TYPE
  {KeepElementOrder} 
  Range1 : STRUCT
    min: INT;
    scaling : BOOL;
    max: INT;
    noScaling : Range2;  (* 'Range2' is a structure data type as well. *)
  END_STRUCT;
END_TYPE

Ohne Anweisung {KeepElementOrder} würden die obigen Strukturelemente so automatisch sortiert:

  1. scaling : BOOL;

  2. max: INT;

  3. min: INT;

  4. noScaling : Range2;

Falls ein Element einen anderen Strukturdatentyp verwendet und Sie die Sortierung laut Deklaration auch dafür aktivieren wollen, müssen Sie die Anweisung {KeepElementOrder} auch für diesen anderen Strukturdatentyp einfügen. Auf das Beispiel bezogen müsste die Anweisung {KeepElementOrder} auch vor der Deklaration des Strukturdatentyps Range2 eingefügt werden.

Beispiel für die Initialisierung eines Strukturelements, das einen anderen strukturierten Datentyp verwendet
TYPE
  myStruct : STRUCT
    elem : int;
    myStruct : myStruct2 := (elem := 2);
  END_STRUCT;
 
  myStruct2 : STRUCT
    elem : int;
  END_STRUCT;
END_TYPE