F_GetStructMemberAlignment

Die Funktion liefert Informationen über die vom Compiler verwendete Speicherausrichtung (alignment). Die Speicherausrichtung bestimmt die Anordnung der SPS-Datenstrukturelemente im Speicher.
FUNCTION F_GetStructMemberAlignment : BYTE
Eingänge
VAR_INPUT
(* keine Eingangsparameter *)
END_VAR
Rückgabeparameter | Beschreibung |
---|---|
1 | 1 byte alignment (z.B. TwinCAT v2.11, x86-Zielplattform) |
2 | 2 byte alignment |
4 | 4 byte alignment (z.B. TwinCAT v2.11, ARM-Zielplattform) |
8 | 8 byte alignment |
Die folgenden Beispiele zeigen die Anordnung der Datenstrukturelemente im Speicher in Abhängigkeit von der verwendeten Speicherausrichtung.
?? := Füllbyte (padding byte)
Beispiel 1
TYPE ST_TEST1
STRUCT
ui8 : BYTE := 16#FF;(* FF *)
f64 : LREAL := 1234.5678;(* AD FA 5C 6D 45 4A 93 40 *)
END_STRUCT
END_TYPE
test1 : ST_TEST1;
Alignment | SIZEOF(test1) | Memory contents |
---|---|---|
1 byte | 9 | FF AD FA 5C 6D 45 4A 93 40 |
2 byte | 10 | FF ?? AD FA 5C 6D 45 4A 93 40 |
4 byte | 12 | FF ?? ?? ?? AD FA 5C 6D 45 4A 93 40 |
8 byte | 16 | FF ?? ?? ?? ?? ?? ?? ?? AD FA 5C 6D 45 4A 93 40 |
Beispiel 2
Durch die Umstellung der Reihenfolge der Strukturelemente ändert sich die Anordnung der Füllbytes. Diese werden jetzt hinten angefügt.
TYPE ST_TEST2
STRUCT
f64 : LREAL := 1234.5678;(* AD FA 5C 6D 45 4A 93 40 *)
ui8 : BYTE := 16#FF;(* FF *)
END_STRUCT
END_TYPE
test2 : ST_TEST2;
Alignment | SIZEOF(test2) | Memory contents |
---|---|---|
1 byte | 9 | AD FA 5C 6D 45 4A 93 40 FF |
2 byte | 10 | AD FA 5C 6D 45 4A 93 40 FF ?? |
4 byte | 12 | AD FA 5C 6D 45 4A 93 40 FF ?? ?? ?? |
8 byte | 16 | AD FA 5C 6D 45 4A 93 40 FF ?? ?? ?? ?? ?? ?? ?? ?? |
Beispiel 3
Beim 2-, 4- und 8-Byte-Alignment sind die Elemente ui32 und f64 bereits passend ausgerichtet, so dass keine Füllbytes hinzugefügt werden müssen.
TYPE ST_TEST3
STRUCT
ui8 : BYTE := 16#FF;(* FF *)
ui16 : WORD := 16#1234;(* 34 12 *)
ui32 : DWORD := 16#AABBCCDD;(* DD CC BB AA *)
f64 : LREAL := 1234.5678;(* AD FA 5C 6D 45 4A 93 40 *)
END_STRUCT
END_TYPE
test3 : ST_TEST3;
Alignment | SIZEOF(test3) | Memory contents |
---|---|---|
1 byte | 15 | FF 34 12 DD CC BB AA AD FA 5C 6D 45 4A 93 40 |
2 byte | 16 | FF ?? 34 12 DD CC BB AA AD FA 5C 6D 45 4A 93 40 |
4 byte | 16 | FF ?? 34 12 DD CC BB AA AD FA 5C 6D 45 4A 93 40 |
8 byte | 16 | FF ?? 34 12 DD CC BB AA AD FA 5C 6D 45 4A 93 40 |
Beispiel 4
TYPE ST_A1
STRUCT
ui8 : BYTE := 16#FF;(* FF *)
ui32 : DWORD := 16#AABBCCDD;(* DD CC BB AA *)
rsv : BYTE := 16#EE;(* EE *)
END_STRUCT
END_TYPE
TYPE ST_A2
STRUCT
ui16 : WORD := 16#1234;(* 34 12 *)
ui8 : BYTE := 16#55;(* 55 *)
END_STRUCT
END_TYPE
TYPE ST_TEST4
STRUCT
a1 : ST_A1;
a2 : ST_A2;
END_STRUCT
END_TYPE
test4 : ST_TEST4;
Alignment | SIZEOF(test4) | SIZEOF(test4.a1) | a1/a2 padding bytes | SIZEOF(test4.a2) | Memory contents |
---|---|---|---|---|---|
1 byte | 9 | 6 | - | 3 | FF DD CC BB AA EE 34 12 55 |
2 byte | 12 | 8 | - | 4 | FF ?? DD CC BB AA EE ?? 34 12 55 ?? |
4 byte | 16 | 12 | - | 4 | FF ?? ?? ?? DD CC BB AA EE ?? ?? ?? 34 12 55 ?? |
8 byte | 16 | 12 | - | 4 | FF ?? ?? ?? DD CC BB AA EE ?? ?? ?? 34 12 55 ?? |
Beispiel 5
TYPE ST_D1
STRUCT
ui16 : WORD := 16#1234;(* 34 12 *)
ui8 : BYTE := 16#55;(* 55 *)
END_STRUCT
END_TYPE
TYPE ST_D2
STRUCT
ui8 : BYTE := 16#FF;(* FF *)
f64 : LREAL := 1234.5678;(* AD FA 5C 6D 45 4A 93 40 *)
rsv : BYTE := 16#EE;(* EE *)
END_STRUCT
END_TYPE
TYPE ST_TEST5
STRUCT
d1 : ST_D1;
d2 : ST_D2;
END_STRUCT
END_TYPE
test5 : ST_TEST5;
Alignment | SIZEOF(test5) | SIZEOF(test5.d1) | d1/d2 padding bytes | SIZEOF(test5.d2) | Memory contents |
---|---|---|---|---|---|
1 byte | 13 | 3 | - | 10 | 34 12 55 FF AD FA 5C 6D 45 4A 93 40 EE |
2 byte | 16 | 4 | - | 12 | 34 12 55 ?? FF ?? AD FA 5C 6D 45 4A 93 40 EE ?? |
4 byte | 20 | 4 | - | 16 | 34 12 55 ?? FF ?? ?? ?? AD FA 5C 6D 45 4A 93 40 EE ?? ?? ?? |
8 byte | 32 | 4 | 4 | 24 | 34 12 55 ?? ?? ?? ?? ?? FF ?? ?? ?? ?? ?? ?? ?? AD FA 5C 6D 45 4A 93 40 EE ?? ?? ?? ?? ?? ?? ?? |
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS-Bibliotheken (Kategoriegruppe) |
---|---|---|
TwinCAT v3.1.0 | PC oder CX (x86, x64, ARM) | Tc2_System (System) |