Alignment
Mit TwinCAT 3 wurde ein 8-Byte-Alignment eingeführt.
System | Alignment |
---|---|
TwinCAT 2, x86 | 1 Byte |
TwinCAT 2, ARM | 4 Byte |
TwinCAT 3 | 8 Byte |
Besondere Beachtung ist geboten, wenn Daten als gesamter Speicherblock mit anderen Steuerungen oder Softwarekomponenten wie Visualisierungen ausgetauscht werden.
Speicherstelle
- Eine Variable liegt an der Speicherstelle, die von der Größe ihres Datentyps und vom Alignment vorgegeben wird.
- Wenn der Datentyp kleiner gleich dem Alignment des Systems ist, entspricht die Speicherstelle der Variablen einem Vielfachen der Datentypgröße.
- Wenn der Datentyp größer als das Alignment des Systems ist, entspricht die Speicherstelle der Variablen einem Vielfachen des Alignments.
- Ein strukturierter Datentyp (Struktur, Funktionsbaustein) liegt an der Speicherstelle, die von der Größe des größten Datentyps in der Struktur und vom Alignment vorgegeben wird.
- Wenn der größte Datentyp kleiner gleich dem Alignment des Systems ist, entspricht die Speicherstelle der Strukturinstanz einem Vielfachen dieser Datentypgröße.
- Wenn der größte Datentyp größer als das Alignment des Systems ist, entspricht die Speicherstelle der Strukturinstanz einem Vielfachen des Alignments.
Speicherplatz
- Eine Variable nimmt ab obiger Speicherstelle so viel Speicherplatz ein, wie es der Größe ihres Datentyps entspricht.
- Ein strukturierter Datentyp (Struktur, Funktionsbaustein) nimmt ab obiger Speicherstelle so viel Speicherplatz ein, wie es von der Größe des größten Datentyps in der Struktur und dem Alignment vorgegeben wird.
- Wenn der größte Datentyp kleiner gleich dem Alignment des Systems ist, entspricht der Speicherplatz der Strukturinstanz einem Vielfachen dieser Datentypgröße.
- Wenn der größte Datentyp größer als das Alignment des Systems ist, entspricht der Speicherplatz der Strukturinstanz einem Vielfachen des Alignments.
Aufgrund dieser Alignment-Regeln können ggf. implizite Füllbytes entstehen.
Bitte beachten Sie (z.B. bei einem Speichervergleich mit Hilfe der Tc2_System-Funktion MEMCMP), dass Füllbytes nicht initialisiert werden. |
Größter Datentyp in einem Funktionsbaustein Jeder Funktionsbaustein enthält implizit mindestens einen Zeiger, um die Adresse der virtuellen Methodentabelle abzulegen. Daraus folgt, dass bei einem Zielsystem mit 64 Bit Architektur ein Datentyp von 8 Bytes Größe im Funktionsbaustein enthalten ist. Dabei kann es sich je nach Funktionsbaustein um den größten enthaltenen Datentypen handeln, der somit Speicherstelle und Speicherplatz bestimmt. |
Beispiel 1 (TwinCAT 3)
TYPE ST_Test1 :
STRUCT
fVar : LREAL; // 8 Byte
nVar1 : DINT; // 4 Byte
nVar2 : SINT; // 1 Byte
(* 3 filler bytes to reach a limit corresponding to the largest data type (divisible by 8 byte) *)
END_STRUCT
END_TYPE
TYPE ST_Test2 :
STRUCT
nVar2 : SINT; // 1 Byte
(* 3 filler bytes to reach a limit corresponding to the following data type (divisible by 4 byte) *)
nVar1 : DINT; // 4 Byte
fVar : LREAL; // 8 Byte
END_STRUCT
END_TYPE
TYPE ST_Test3 :
STRUCT
nVar2 : SINT; // 1 Byte
(* 7 filler bytes to reach a limit corresponding to the following data type (divisible by 8 byte) *)
fVar : LREAL; // 8 Byte
nVar1 : DINT; // 4 Byte
(* 4 filler bytes to reach a limit corresponding to the largest data type (divisible by 8 byte) *)
END_STRUCT
END_TYPE
Aufgrund des 8-Byte-Alignment von TwinCAT 3 werden implizit Füllbytes eingefügt. Die Gesamtgröße der Strukturen kann variieren, obwohl sie drei Variablen desselben Datentyps beinhalten.
Auf einem System mit 1-Byte-Alignment würden die drei Strukturen denselben Speicherbedarf von jeweils 13 Bytes einnehmen.
Beispiel 2
TYPE ST_Test :
STRUCT
nDWORD : DWORD; // 4 Byte
(* With an 8-byte alignment: 4 filler bytes *)
nLWORD : LWORD; // 8 Byte
END_STRUCT
END_TYPE
Bei einem 4-Byte-Alignment hat die Struktur eine Größe von 12 Byte. Es werden keine Füllbytes eingefügt. Begründung:
- Die Variable nLWORD liegt an einer Speicherstelle, die einem Vielfachen des Alignments entspricht, da ihr Datentyp (8 Byte) größer als das Alignment (4 Byte) ist.
- Der strukturierte Datentyp nimmt so viel Speicherplatz ein, wie es einem Vielfachen des Alignments entspricht, da der größte enthaltene Datentyp in der Struktur (8 Byte) größer als das Alignment (4 Byte) ist.
Bei einem 8-Byte-Alignment hat die Struktur hingegen eine Größe von 16 Byte, da zwischen den beiden Variablen 4 Füllbytes eingefügt werden. Begründung:
- Die Variable nLWORD liegt an einer Speicherstelle, die einem Vielfachen der Größe ihres Datentyps entspricht, da ihr Datentyp (8 Byte) kleiner gleich dem Alignment (8 Byte) ist.
- Der strukturierte Datentyp nimmt so viel Speicherplatz ein, wie es einem Vielfaches der Größe des größten Datentypen entspricht, da der größte enthaltene Datentyp in der Struktur (8 Byte) kleiner gleich dem Alignment (8 Byte) ist.
Weiterführende Informationen + Beispielprojekt:
- Sehen Sie auch das Attribut 'pack_mode', um festzulegen, wie eine Datenstruktur gepackt werden soll.
- Auf der SPS-Samples-Seite können Sie außerdem ein Beispielprojekt zum Thema Byte-Alignment herunterladen.