Deklaration eines strukturierten Datentyps in ST

Ein strukturierter Datentyp wird auch als Strukturdatentyp bezeichnet.

Syntax
TYPE
   {KeepElementOrder}  (* optionale Anweisung pro strukturiertem Datentyp; beeinflusst die Sortierung der Strukturelemente im generierten C-Code *)
   name_1: STRUCT
      name_e1 : type := initial-value;
      name_e2 : REF_TO type;
      FB_instance_e3 : FB-type;
      ...
      name_en : type := initial-value;
      FB_instance_en : FB-type;
   END_STRUCT;
   {KeepElementOrder}
   name_2: STRUCT
      name_e1 : type := initial-value; 
      FB_instance_e2 : FB-type;
      ...
   END_STRUCT;
   ... 
   {KeepElementOrder}
   name_n: STRUCT
   ... 
   END_STRUCT;
END_TYPE 
Bedeutung

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

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 usw. und
name_e1, name_e2 usw. 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) und ein vorhandener Funktionsbaustein (in →ST oder →FBS erstellt) als Typ für die Strukturelemente möglich.

Mit dem optionalen →Initialisierungswert := initial-value weisen Sie dem Strukturelement einen Wert zu. Als Initialisierungswert (auf der rechten Seite des Zuweisungsoperators ":=") dürfen Sie ein Literal eingeben, wie unter "Initialisierung von Variablen in STangefü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).

Aktuelle Einschränkungen


Informationen über den Zugriff auf die Strukturelemente finden Sie unter: "Zugriff auf strukturierten Datentyp und Strukturelemente"
Informationen über die Deklaration von noch nicht festgelegten Speicherorten finden Sie unter: "Deklaration eines strukturierten Datentyps mit partieller Adresse 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 ohne Anweisung für Sortierung der Strukturelemente
TYPE
  Range : STRUCT
    min : INT;         (* keine Initialisierung *)
    max : INT := 300;  (* Initialisierung *)
  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' ist ein anwenderdefinierter Datentyp. *)
    scaleMax : Data_MAX;                   (* 'Data_MAX' ist ein anwenderdefinierter Datentyp. *)
    myRef: REF_TO INT;                     (* 'myRef' ist eine Referenz auf 'INT'. *)
  END_STRUCT;
  Cooler : STRUCT
    Temp    : INT;
    Cooling : TOF;                         (* Funktionsbaustein 'TOF' als Strukturelement *) 
  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' ist ebenfalls ein Strukturdatentyp. *)
  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