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