此编译指令定义在分配期间如何打包数据结构。该属性必须插入到数据结构上方,并且会影响整个结构的打包。
语法:
{attribute 'pack_mode' := '<Value>'}
插入位置:在数据结构的声明上方
.<值>的可能值:
pack_mode | 关联的打包方法说明 | 描述 |
---|
0 | 对齐, | 所有变量都分配给字节地址。没有内存缺口。 |
1 | 1字节对齐 |
2 | 2字节对齐 | |
4 | 4字节对齐 | .有 字节地址处的1字节变量 字节地址处的1字节变量最大间隔为1个字节。 地址可被4整除的4字节变量。最大间隔为3个字节。 地址可被4整除的8字节变量。最大间隔为3个字节。 字符串始终位于字节地址。没有差距的结果。
|
8 | 8字节对齐 | .有 字节地址处的1字节变量 地址可被2整除的2字节变量。最大间隔为1个字节。 地址可被4整除的4字节变量。最大间隔为3个字节。 地址可被8整除的8字节变量。最大间隔为7个字节。 字符串始终位于字节地址。没有差距的结果。
|
|
根据结构,各个模式的内存映射可能没有差异。因此,具有pack_mode = 4的结构的内存分配可以对应于pack_mode = 8的结构。
|
|
结构数组:如果将结构组合成数组,则在结构末尾添加字节,以便对齐下一个结构。 |
.例如
{attribute 'pack_mode' := '1'}
TYPE myStruct:
STRUCT
Enable: BOOL;
Counter: INT;
MaxSize: BOOL;
MaxSizeReached: BOOL;
END_STRUCT
END_TYPE
数据类型为myStruct的变量的内存范围已“对齐”分配:例如,如果其组件Enable的存储地址为0x0100,则组件Counter的地址为0x0101,MaxSize为地址0x0103,MaxSizeReached为地址0x0104 。在'pack_mode':= 2的情况下,Counter将为0x0102,MaxSize为0x0104,MaxSizeReached为0x0106。
.
STRUCT
Var1 : BOOL := 16#01;
Var2 : BYTE := 16#11;
Var3 : WORD := 16#22;
Var4 : BYTE := 16#44;
Var5 : DWORD := 16#88776655;
Var6 : BYTE := 16#99;
Var7 : BYTE := 16#AA;
Var8 : DWORD := 16#AA;
END_TYPE
| pack_mode = 0 | pack_mode = 1 | pack_mode = 2 | pack_mode = 4 | pack_mode = 8 |
---|
| 变量 | 值 | 变量 | 值 | 变量 | 值 | 变量 | 值 | 变量 | 值 |
---|
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 | | | | | | | | | | |
.
STRUCT
Var1 : BYTE := 16#01;
Var2 : LWORD := 16#11;
Var3 : BYTE := 16#22;
Var4 : BYTE := 16#44;
Var5 : DWORD := 16#88776655;
Var6 : BYTE := 16#99;
Var7 : BYTE := 16#AA;
Var8 : WORD := 16#AA;
END_TYPE
| pack_mode = 0 | pack_mode = 1 | pack_mode = 2 | pack_mode = 4 | pack_mode = 8 |
---|
| 变量 | 值 | 变量 | 值 | 变量 | 值 | 变量 | 值 | 变量 | 值 |
---|
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 | | | | | | | | | | |