【问题标题】:BitArray conversions and data lengthsBitArray 转换和数据长度
【发布时间】:2016-06-25 14:43:22
【问题描述】:

我正在创建一个软件包,它一次接收 16 个布尔值,将它们放入一个位数组中,然后将它们发送到 PLC 以供 PLC 解包和使用。我的问题有两个:

1) 如果我创建一个 BitArray(16),它会只占用 16 位数据还是 BitArray 对象会自动在其中包含额外数据作为对象的一部分(我假设它只有 16 位但找不到到目前为止,它确实得到了很好的确认)和

2) PLC 需要一个 16 位整数(短整数),以便通信耦合器在必要时工作,因此我想我可以简单地将 BitArray 转换为短整数,但我需要一个 1 和 0 的列表,而不是“真”和“假”——那么最好的方法是什么?下面是我想到的一些示例代码:

/*  Pack bits into a container to send them as one item */
var bitContainer_1 = new BitArray(16);
bitContainer_1[0] = result.Toggle_Signal;
bitContainer_1[1] = result.Auto_RFO;
bitContainer_1[2] = result.Spare_1;
bitContainer_1[3] = result.Spare_2;
bitContainer_1[4] = result.HMI_Horn_Necessary;
bitContainer_1[5] = result.HMI_Horn_Urgent;
bitContainer_1[6] = result.HMI_Horn_Emergency;
bitContainer_1[7] = result.Spare_3;
bitContainer_1[8] = result.Sys_1_Auto_Ready;
bitContainer_1[9] = result.Sys_1_Auto_Active;
bitContainer_1[10] = result.Spare_4;
bitContainer_1[11] = result.Spare_5;
bitContainer_1[12] = result.Sys_2_Auto_Ready;
bitContainer_1[13] = result.Sys_2_Auto_Active;
bitContainer_1[14] = result.Spare_6;
bitContainer_1[15] = result.Spare_7;
short packagedBits_1 = Convert.ToInt16(bitContainer_1);

我认为我可以在进入 bitContainer 之前对布尔值做一些事情,将它们转换为 1 或 0,但发现这似乎不起作用,所以我想看看我的任何/所有选项可能是什么避免很多if(true){var = 1} else{var = 0} 类型的场景,因为我对这种类型的任务相当不熟悉。由于这些通信将负责机器行为,因此减少打包和发送它们的开销和时间至关重要。

【问题讨论】:

标签: c# .net bitarray


【解决方案1】:

1) BitArry(16) 占用的空间超过 16 位。尝试使用 ushort 来获取恰好需要 16 位的内容。

2) 如果您想要速度,我建议您使用 ushort 并对其执行按位运算。你可以这样设置:

    bitContainer = (ushort)(result.Spare_7 << 15 | result.Spare_6 << 14...)

然后您可以根据需要设置或重置每个位。

编辑:按位或运算符“|”在这里用于将每个条目位链接到最终的 ushort 变量中。 '

【讨论】:

  • 我对按位运算有点缺乏经验,但这个解决方案是否不仅仅是比较值而不是实际将它们复制到我可以发送的可靠数据类型中?我基本上想在我的内部(在这种情况下,ushort)中得到一个 1100101101111010 的字符串(不一定是“字符串”)。这样,PLC 端可以解析它并将其拆开并知道哪个位属于什么(映射方案是在我发布的问题之外设置的)
  • 按位或运算符'|'用于将这些位值中的每一个“链接”在一起。
  • 好的。正在对按位运算进行一些查找,而 MSDN 对其解释的表述方式有时……具有误导性。谢谢!
猜你喜欢
  • 2012-12-21
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2017-06-15
  • 2012-06-27
  • 2013-12-26
相关资源
最近更新 更多