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

Speicherplatz

Aufgrund dieser Alignment-Regeln können ggf. implizite Füllbytes entstehen.

Alignment 1:

Bitte beachten Sie (z.B. bei einem Speichervergleich mit Hilfe der Tc2_System-Funktion MEMCMP), dass Füllbytes nicht initialisiert werden.

Alignment 2:

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.

Alignment 3:

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:

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:

Weiterführende Informationen + Beispielprojekt: