Attribut 'pack_mode'

Das Pragma legt fest, wie eine Datenstruktur während der Allozierung gepackt wird. Das Attribut muss oberhalb der Datenstruktur eingefügt werden und wirkt sich auf das Packen der gesamten Struktur aus.

Syntax: {attribute 'pack_mode' := '<pack mode value>'}

Mögliche Werte für <pack mode value>:

<pack mode value>

Assoziierte Packungsart

Beschreibung

0

aligned

Es liegen alle Variablen auf Byte-Adressen; es treten keine Speicherlücken auf.

1

1-byte-aligned

2

2-byte-aligned

Es liegen

  • 1 Byte-Variablen auf Byte-Adressen
  • 2 Byte-Variablen auf durch 2-teilbare Adressen. Es entsteht maximal eine Lücke von 1 Byte
  • 4 Byte-Variablen auf durch 2-teilbare Adressen. Es entsteht maximal eine Lücke von 1 Byte
  • 8 Byte-Variablen auf durch 2-teilbare Adressen. Es entsteht maximal eine Lücke von 1 Byte
  • Strings immer an Byte-Adressen. Es entsteht keine Lücke.

4

4-byte-aligned

Es liegen

  • 1 Byte-Variablen auf Byte-Adressen
  • 2 Byte-Variablen auf durch 2-teilbare Adressen. Es entsteht maximal eine Lücke von 1 Byte
  • 4 Byte-Variablen auf durch 4-teilbare Adressen. Es entsteht maximal eine Lücke von 3 Byte
  • 8 Byte-Variablen auf durch 4-teilbare Adressen. Es entsteht maximal eine Lücke von 3 Byte
  • Strings immer an Byte-Adressen. Es entsteht keine Lücke.

8

8-byte-aligned

Es liegen

  • 1 Byte-Variablen auf Byte-Adressen
  • 2 Byte-Variablen auf durch 2-teilbare Adressen. Es entsteht maximal eine Lücke von 1 Byte
  • 4 Byte-Variablen auf durch 4-teilbare Adressen. Es entsteht maximal eine Lücke von 3 Byte
  • 8 Byte-Variablen auf durch 8-teilbare Adressen. Es entsteht maximal eine Lücke von 7 Byte
  • Strings immer an Byte-Adressen. Es entsteht keine Lücke.

Einfügeort: Zeile oberhalb der Deklaration der Datenstruktur

Attribut 'pack_mode' 1:

Abhängig vom Aufbau der Struktur kann es somit vorkommen, dass es keinen Unterschied in der Speicheraufteilung zwischen den einzelnen Modi gibt. Somit kann die Speicherverteilung einer Struktur mit pack_mode =4 der von pack_mode = 8 entsprechen.

Attribut 'pack_mode' 2:

Arrays von Strukturen: Werden die Strukturen in Arrays zusammengefasst, so werden am Ende der Struktur Bytes eingefügt, damit die nächste Struktur wieder aligned ist.

Beispiel 1

{attribute 'pack_mode' := '1'} 
TYPE ST_MyStruct:  
STRUCT 
    bEnable         : BOOL;
    nCounter        : INT; 
    nMaxSize        : INT;
    bMaxSizeReached : BOOL;
    bReset          : BOOL;
END_STRUCT
END_TYPE 

Der Speicherbereich für eine Variable vom Datentyp ST_MyStruct wird „aligned“ alloziert: Ist die Speicheradresse ihrer Komponente bEnable beispielsweise 0x0100, dann folgt die Komponente nCounter an der Adresse 0x0101, nMaxSize an Adresse 0x0103, bMaxSizeReached an Adresse 0x0105 und bReset an Adresse 0x0106. Mit 'pack_mode' := '2' läge nCounter bei 0x0102, nMaxSize bei 0x0104, bMaxSizeReached bei 0x0106 und bReset bei 0x0107.

Beispiel 2

STRUCT 
    bVar1 : BOOL  := 16#01;
    nVar2 : BYTE  := 16#11;
    nVar3 : WORD  := 16#22;
    nVar4 : BYTE  := 16#44;
    nVar5 : DWORD := 16#88776655;
    nVar6 : BYTE  := 16#99;
    nVar7 : BYTE  := 16#AA;
    nVar8 : DWORD := 16#AA;
END_TYPE 

 

pack_mode = 0

pack_mode = 1

pack_mode = 2

pack_mode = 4

pack_mode = 8

 

Variable

Wert

Variable

Wert

Variable

Wert

Variable

Wert

Variable

Wert

0

Var1

01

Var1

01

Var1

01

Var1

01

Var1

01

1

Var2

11

Var2

11

Var2

11

Var2

11

Var2

11

2

Var3

22

Var3

22

Var3

22

Var3

22

Var3

22

3

...

00

...

00

...

00

...

00

...

00

4

Var4

44

Var4

44

Var4

44

Var4

44

Var4

44

5

Var5

55

Var5

55

 

 

 

 

 

 

6

...

66

...

66

Var5

55

 

 

 

 

7

...

77

...

77

...

66

 

 

 

 

8

...

88

...

88

...

77

Var5

55

Var5

55

9

Var6

99

Var6

99

...

88

...

66

...

66

10

Var7

AA

Var7

AA

Var6

99

...

77

...

77

11

Var8

AA

Var8

AA

Var7

AA

...

88

...

88

12

...

00

...

00

Var8

AA

Var6

99

Var6

99

13

...

00

...

00

...

00

Var7

AA

Var7

AA

14

...

00

...

00

...

00

 

 

 

 

15

 

 

 

 

...

00

 

 

 

 

16

 

 

 

 

 

 

Var8

AA

Var8

AA

17

 

 

 

 

 

 

...

00

...

00

18

 

 

 

 

 

 

...

00

...

00

19

 

 

 

 

 

 

...

00

...

00

20

 

 

 

 

 

 

 

 

 

 

21

 

 

 

 

 

 

 

 

 

 

22

 

 

 

 

 

 

 

 

 

 

23

 

 

 

 

 

 

 

 

 

 

24

 

 

 

 

 

 

 

 

 

 

25

 

 

 

 

 

 

 

 

 

 

26

 

 

 

 

 

 

 

 

 

 

27

 

 

 

 

 

 

 

 

 

 

28

 

 

 

 

 

 

 

 

 

 

29

 

 

 

 

 

 

 

 

 

 

30

 

 

 

 

 

 

 

 

 

 

31

 

 

 

 

 

 

 

 

 

 

Beispiel 3

STRUCT 
    nVar1 : BYTE  := 16#01;
    nVar2 : LWORD := 16#11;
    nVar3 : BYTE  := 16#22;
    nVar4 : BYTE  := 16#44;
    nVar5 : DWORD := 16#88776655;
    nVar6 : BYTE  := 16#99;
    nVar7 : BYTE  := 16#AA;
    nVar8 : WORD  := 16#AA;
END_TYPE 

 

pack_mode = 0

pack_mode = 1

pack_mode = 2

pack_mode = 4

pack_mode = 8

 

Variable

Wert

Variable

Wert

Variable

Wert

Variable

Wert

Variable

Wert

0

Var1

01

Var1

01

Var1

01

Var1

01

Var1

01

1

Var2

11

Var2

11

 

 

 

 

 

 

2

...

00

...

00

Var2

11

 

 

 

 

3

...

00

...

00

...

00

 

 

 

 

4

...

00

...

00

...

00

Var2

11

 

 

5

...

00

...

00

...

00

...

00

 

 

6

...

00

...

00

...

00

...

00

 

 

7

...

00

...

00

...

00

...

00

 

 

8

...

00

...

00

...

00

...

00

Var2

11

9

Var3

22

Var3

22

...

00

...

00

...

00

10

Var4

44

Var4

44

Var3

22

...

00

...

00

11

Var5

55

Var5

55

Var4

44

...

00

...

00

12

...

66

...

66

Var5

55

Var3

22

...

00

13

...

77

...

77

...

66

Var4

44

...

00

14

...

88

...

88

...

77

 

 

...

00

15

Var6

99

Var6

99

...

88

 

 

...

00

16

Var7

AA

Var7

AA

Var6

99

Var5

55

Var3

22

17

Var8

AA

Var8

AA

Var7

AA

...

66

Var4

44

18

...

00

...

00

Var8

AA

...

77

 

 

19

 

 

 

 

...

00

...

88

 

 

20

 

 

 

 

 

 

Var6

99

Var5

55

21

 

 

 

 

 

 

Var7

AA

...

66

22

 

 

 

 

 

 

Var8

AA

...

77

23

 

 

 

 

 

 

...

00

...

88

24

 

 

 

 

 

 

 

 

Var6

99

25

 

 

 

 

 

 

 

 

Var7

AA

26

 

 

 

 

 

 

 

 

Var8

AA

27

 

 

 

 

 

 

 

 

...

00

28

 

 

 

 

 

 

 

 

 

 

29

 

 

 

 

 

 

 

 

 

 

30

 

 

 

 

 

 

 

 

 

 

31