我可以使用 C 中的位结构数组为位变量分配不同的值。在 Codesys 方面,我不允许在结构中定义位数组。您可以建议一个解决方案来解决这个问题吗?
致以诚挚的问候
C
struct {
uint16_t reserved : 2;
uint16_t reserved_0: 3;
} bits;
如您所见,您无法在codesys中定义位数组。如果您的结构中需要位,您可以单独定义它们:
TYPE DUT1 :
STRUCT
reserved1: BIT;
reserved2: BIT;
data1: BIT;
data2: BIT;
data3: BIT;
data4: BIT;
reserved3: BIT;
reserved4: BIT;
END_STRUCT
END_TYPE
或者,您可以将它们本身组合成一个结构:
TYPE DUT2 :
STRUCT
reserved_before: Reserved2Bits;
data1: BIT;
data2: BIT;
data3: BIT;
data4: BIT;
reserved_after: Reserved2Bits;
END_STRUCT
END_TYPE
但是,如果您确实为此使用单独的结构,则这些位将不会与其余部分压缩。上面DUT1的大小为1字节,DUT2的大小为3字节(每个Reserved2Bits 1字节,数据位1字节)。
最后,您可以直接访问整数类型上的位,例如:
VAR
bits: BYTE;
END_VAR
bits.2 := TRUE; // data1
bits.5 := FALSE; // data4
您可以使用常量代替数字:
VAR
bits: BYTE;
END_VAR
VAR CONSTANT
data1: BYTE := 2;
data2: BYTE := 3;
data3: BYTE := 4;
data4: BYTE := 5;
END_VAR
bits.data1 := TRUE;
bits.data4 := FALSE;
在上述情况下,您可以完全跳过定义保留/未使用的位。
“另一方面,位访问明显更耗时。因此,仅当需要以预定义格式定义数据时才应使用 BIT 数据类型。” https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_datatype_bit.html
BIT 是一种需要谨慎使用的特殊类型。您没有解释为什么需要 BIT 数组。如果您不需要存储在精确的地址中,我建议您使用 bool 数组(以 8 位编码)。否则,请遵循 Guiorgy 的建议,使用字节或字并使用“byte.1”直接访问您需要的位。
如果您需要以精确的顺序排列数据,我建议您还查看结构中字节的对齐方式。 https://help.codesys.com/webapp/_cds_pragma_attribute_pack_mode;product=codesys;version=3.5.17.0