Codesys 中的位数组

问题描述 投票:0回答:2

我可以使用 C 中的位结构数组为位变量分配不同的值。在 Codesys 方面,我不允许在结构中定义位数组。您可以建议一个解决方案来解决这个问题吗?

致以诚挚的问候

C

struct {
            uint16_t reserved : 2;
            uint16_t reserved_0: 3;
} bits;

在 codesys 中; this photo

arrays bit codesys
2个回答
1
投票

如您所见,您无法在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;

在上述情况下,您可以完全跳过定义保留/未使用的位。


0
投票

“另一方面,位访问明显更耗时。因此,仅当需要以预定义格式定义数据时才应使用 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

© www.soinside.com 2019 - 2024. All rights reserved.