Deklaration eines direkt abgeleiteten Datentyps in ST

Syntax
TYPE
   name_1 : data-type (* optional_begin *) {SIZE := value} (* optional_end *) := initial-value;
   name_2 : ARRAY [x..y] OF data-type := [initial-value_1, initial-value_2, .., initial-value_n];
   ... 
END_TYPE
Bedeutung

Deklaration eines oder mehrerer direkt →abgeleiteter Datentypen, wobei name_1, name_2 usw. →IEC-Bezeichner sein müssen
Mit Hilfe solcher Deklarationen können Sie neue typspezifische Initialisierungswerte vorgeben. Wenn Sie z.B. INT-Variablen mit dem Initialisierungswert 5 in →Zuweisungen benötigen, deklarieren Sie einen abgeleiteten Datentyp (siehe Beispiel myINT unten) und verwenden Sie dann myINT als Datentyp für die Variablen, die in den Zuweisungen verwendet werden.

Diese Deklaration ist innerhalb der Deklaration eines anwenderdefinierten Datentyps (TYPE ... END_TYPE) möglich.
Der →Basistyp (data-type) des abgeleiteten Datentyps muss ein elementarer oder anwenderdefinierter Datentyp sein (siehe "Unterstützte Datentypen").

Mit dem optionalen →Initialisierungswert weisen Sie dem abgeleiteten Datentyp einen Wert zu. Dieser Wert hat Vorrang, d.h. der Initialisierungswert des Basistyps wird "überschrieben". Falls kein Initialisierungswert für den abgeleiteten Datentyp definiert ist, gilt der Initialisierungswert des Basistyps.
Mit := beginnen die Initialisierungsangaben. Die erforderliche Initialisierungsangaben richten sich nach dem Basistyp. So weisen Sie mit := initial-value einen Wert bei einem elementaren Basistyp zu. Für einen Array-Datentyp oder einen strukturierten Datentyp als Basistyp benötigen Sie jedoch etwas andere Initialisierungsangaben. Informieren Sie sich bei der Beschreibung des entsprechenden Datentyps über die erforderlich Syntax für die Initialisierung.

Aktuelle Einschränkungen

  • Für data-type können Sie keine →Referenz-Typen (REF_TO ...) und keine →Funktionsbausteine angeben.
  • Abgeleitete Datentypen können nur bis max. 10 Ebenen verschachtelt werden. Rekursionen sind dabei nicht zulässig.

Das optionale Attribut SIZE für die Bitgröße ist nur erlaubt, falls es sich beim Basistyp um bestimmte elementare Datentypen handelt, wobei der dafür erlaubte Bereich von diesem Datentyp abhängt. Mit diesem Attribut definieren Sie die Bits, die zwischen IO-Segment und Variable kopiert werden (siehe folgendes Beispiel für Datentyp bit5).

Erweiterung zur IEC-Norm

Das Attribut SIZE ist eine Erweiterung zur →IEC-Norm.

Das Attribut SIZE ist für diese elementaren Datentypen erlaubt:

Der dafür erlaubte Bereich ist:

BOOL

1 Bit

SINT, USINT, BYTE

1 bis 8 Bit

INT, UINT, WORD

1 bis 16 Bit

DINT, UDINT, DWORD

1 bis 32 Bit

LINT, ULINT, LWORD

1 bis 64 Bit

Das Attribut SIZE ist ebenfalls für einen direkt abgeleiteten Datentyp erlaubt, sofern dessen Basistyp einer der oben angeführten Datentypen ist (siehe folgendes Beispiel für Datentyp  myBit5_v1). Direkte Ableitungen von einem Datentypen mit Attribut SIZE sind ohne und mit Attribut SIZE möglich (siehe folgende Beispiele für Datentypen myBit5_v2 und myBit3). 

(info) Ein direkt abgeleiteter Datentyp darf dort verwenden, wo auch der elementare Basistyp verwendet werden darf. Beispiel: Der Datentyp myINT aus dem folgenden Beispiel ist als Eingangsdatentyp für den ADD-Baustein zulässig, jedoch nicht der Datentyp typeScalings.

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.

Beispiel
TYPE
   myINT        : INT := 5;       (* Datentyp, der vom elementaren Datentyp 'INT' abgeleitet wird. Initialisierung mit Wert '5'. *)
   Freq         : REAL := 50.0;   (* Datentyp, der vom elementaren Datentyp 'REAL' abgeleitet wird. Initialisierung mit Wert '50.0'. *)
   typeScalings : ARRAY [1..5] OF myINT := [2(3), 2(), 4];       
       (* Datentyp mit 5 Elementen von 'myINT' deklarieren - die ersten 2 Array-Elemente werden mit '3' initialisiert, *)
       (* die nächsten 2 Array-Elemente mit dem Initialisierungswert '5' von 'myINT', das letzte Array-Element mit '4'  *)
   RangeConf    : RangeS := (scaleMin := -5, scaleMax := 5);
       (* Datentyp, der vom strukturierten Datentyp 'RangeS' abgeleitet wird. Für 'RangeS' sind 3 Strukturelemente definiert.             *)
       (* Initialisierung der Elemente 'scaleMin' und 'scaleMax'. Diese Werte haben Vorrang für 'RangeConf'.                              *)
       (* Da das Element 'signal' hier nicht initialisiert ist, gilt dafür der Initialisierungswert von 'RangeS', der dort definiert ist. *)
END_TYPE
Beispiel: Definition von Datentypen mit und ohne Attribut "SIZE"
TYPE
  bit5      : INT    { SIZE := 5 };  (* 5 Bits werden zwischen IO-Segment und Variable kopiert. *)
  myInt     : INT;
  myBit5_v1 : myInt  { SIZE := 5 };  (* Wie bei 'bit5': 5 Bits werden kopiert. *)
  myBit5_v2 : bit5;                  (* Wie bei 'bit5': 5 Bits werden kopiert. *)
  myBit2    : myInt  { SIZE := 2 };  (* 2 Bits werden zwischen IO-Segment und Variable kopiert. *)
  myBit3    : myBit2 { SIZE := 3 };  (* 3 Bits werden zwischen IO-Segment und Variable kopiert. *)
END_TYPE

... 

VAR_GLOBAL
  Status AT %IB1.2.0 : bit5; (* Verwendung des Datentyps 'bit5' *)
  ...
END_VAR