F_GetStructMemberAlignment

F_GetStructMemberAlignment 1:

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

F_GetStructMemberAlignment 2: 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)