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
|
4 | 4-byte-aligned | Es liegen
|
8 | 8-byte-aligned | Es liegen
|
Einfügeort: Zeile oberhalb der Deklaration der Datenstruktur
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. |
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 |
|
|
|
|
|
|
|
|
|
|