Strukturen

Strukturen werden als Objekte im Object Organizer unter der Registerkarte Datentypen abgelegt. Sie beginnen mit dem Schlüsselwort TYPE und STRUCT und enden mit END_STRUCT und END_TYPE. Strukturdeklarationen haben folgende Syntax:

TYPE <Strukturname>:

    STRUCT <Variablendeklaration 1> . .
<Variablendeklaration n>

    END_STRUCT

END_TYPE

<Strukturname> ist nun ein Typ, der im gesamten Projekt bekannt ist, und der wie ein Standard Datentyp benutzt werden kann. Verschachtelte Strukturen sind erlaubt. Die einzige Einschränkung ist, dass Variablen nicht auf Adressen gesetzt werden können (AT-Deklaration ist nicht erlaubt!).

Beispiel für eine Strukturdefinition mit Namen Polygonzug:

TYPE Polygonzug:
    STRUCT
     Start:ARRAY [1..2] OF INT;
     Punkt1:ARRAY [1..2] OF INT;
     Punkt2:ARRAY [1..2] OF INT;
     Punkt3:ARRAY [1..2] OF INT;
     Punkt4:ARRAY [1..2] OF INT;
     Ende:ARRAY [1..2] OF INT;
    END_STRUCT
END_TYPE

Beispiel für die Initialisierung einer Struktur:

Poly_1:polygonzug := ( Start:=3,3, Punkt1 =5,2, Punkt2:=7,3, Punkt3:=8,5, Punkt4:=5,7, Ende := 3,5);

Auf Komponenten von Strukturen greift man mit folgender Syntax zu:

<Struktur_Name>.<Komponentenname>

Wenn wir zum Beispiel eine Struktur mit Namen "Woche" haben, die eine Komponente mit Namen "Montag" beinhaltet, dann können wir darauf folgendermaßen zugreifen: Woche.Montag

Hinweis

Unterschiedliche Strukturen

Strukturen und Arrays können auf verschiedenen Hardwareplattformen (beispielsweise CX1000 und CX90xx) aufgrund unterschiedlicher Alignments in Aufbau und Größe unterschiedlich sein.
Beim Datenaustausch ist auf die identische Größe und gleich ausgerichtete Strukturen zu achten!

Beispiel für eine Strukturdefinition mit Namen ST_ALIGN_SAMPLE:

TYPE ST_ALIGN_SAMPLE:
    STRUCT
     _diField1   : DINT;
     _byField1   : BYTE;
     _iField     : INT;
     _byField2   : BYTE;
     _diField2   : DINT;
     _pField     : POINTER TO BYTE;
   END_STRUCT
END_TYPE

Somit ergeben sich für die Memberkomponenten der Struktur ST_ALIGN_SAMPLE auf CX90xx(RISC) folgende Größen und Offsets:

_diField1 (DINT), Offset = 0 (16#0), Size = 4
_byField1 (BYTE), Offset = 4 (16#4), Size = 1
_iField (INT), Offset = 6 (16#6), Size = 2
_byField2 (BYTE), Offset = 8 (16#8), Size = 1
_diField2 (DINT), Offset = 12 (16#C), Size = 4
_pField (POINTER TO BYTE), Offset = 16 (16#10), Size = 4

Gesamtgröße durch natürliches Alignment mit Pack(4) und mit sogenannten Paddingbytes: 20

Somit ergeben sich für die Memberkomponenten der Struktur ST_ALIGN_SAMPLE auf CX10xx folgende Größen und Offsets:

_diField1 (DINT), Offset = 0 (16#0), Size = 4
_byField1 (BYTE), Offset = 4 (16#4), Size = 1
_iField (INT), Offset = 5 (16#5), Size = 2
_byField2 (BYTE), Offset = 7 (16#7), Size = 1
_diField2 (DINT), Offset = 8 (16#8), Size = 4
_pField (POINTER TO BYTE), Offset = 12 (16#C), Size = 4

Gesamtgröße: 16

Ansicht der Struktur ST_ALIGN_SAMPLE bei CX90xx Plattformen (RISC) mit Darstellung der Paddingbytes:

TYPE ST_ALIGN_SAMPLE:
    STRUCT
     _diField1    : DINT;
     _byField1    : BYTE;
     _byPadding   : BYTE;
     _iField      :INT;
     _byField2    : BYTE;
     _a_byPadding : ARRAY[0..2] OF BYTE;
     _diField2    : DINT;
     _pField      : POINTER TO BYTE;
   END_STRUCT
END_TYPE