Twincat 3 - SizeOf 返回错误的结构大小

Twincat 3 - SizeOf returning wrong structure size

我有一个结构,正在尝试获取该结构的大小。 SizeOf returns 16,但我期待 14 作为答案。

2+2+4+2+2+2=14

通过使用指针,我注意到结构末尾有 2 个空字节。

如果我用 UINT 替换 UDINT 那么大小是正确的。如果我把UDINT放在结构的末尾,那么这两个空字节就放在iCrateCnt之后。

这让我相信 sizeOf 工作正常,但由于某些未知原因,在我的结构中某处放置了两个我未使用的额外字节。

为什么会这样,如何解决?

pack_mode 属性可用于消除结构中未使用的字节。

https://infosys.beckhoff.com/english.php?content=../content/1033/tc3_plc_intro/2529746059.html&id=3686945105176987925

SIZEOF() 返回的意外大小是由于所谓的 'padding bytes'。 这些填充字节出现的位置取决于:

  1. 使用的系统(Tc2 x86、Tc2 ARM、Tc3)
  2. 使用的数据类型
  3. 定义这些数据类型(c.q.变量)的顺序

有关填充字节的详细信息,请参阅 Alignment and Structures

正如 Kolyur 正确提到的,属性 Pack_Mode 可用于控制这些填充字节。

例如在 Tc3 中:

TYPE HMI_POPUPSTRUCT : // The total size of this struct is 8 bytes
STRUCT
    bVar1: BOOL;       // At byte 0. 
                       // At byte 1 there will be a padding byte 
    bVar2: INT;        // At byte 2 and 3
    bVar3: BOOL;       // At byte 4     
    bVar4: BOOL;       // At byte 5
    bVar5: BOOL;       // At byte 6.
                       // At byte 7 there will be a padding byte (8th byte)
END_STRUCT

插入时

{attribute 'pack_mode' := '0'}

{attribute 'pack_mode' := '1'}

就在结构之上,那么不会有任何填充字节导致 struct-size 为 6 个字节而不是 8 个字节。