我正在创建一个软件包,一次取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);
我认为我可以对booleans做一些事情,然后进入bitContainer将它们转换为1或0并发现它似乎不起作用,所以我想看看我的选项可能是什么,而避免很多of if(true){var = 1} else {var = 0}类型的场景,因为我对这类任务并不熟悉。由于这些通信将负责机器行为,因此减少了打包机器人的开销和时间。发送它们至关重要。
答案 0 :(得分:2)
1)BitArry(16)占用的空间超过16位。尝试使用ushort来获取恰好16位的东西。
2)如果你想要速度,我建议你使用ushort并对它进行按位操作。您可以这样设置:
bitContainer = (ushort)(result.Spare_7 << 15 | result.Spare_6 << 14...)
然后您可以根据需要设置或重置每个位。
编辑:按位OR运算符'|'这里使用链接每个入口位到最终的ushort变量。 '&lt;&lt;&lt;&lt;&lt; operator将值向左移位n位,因此这会将result.xxxx中的每个1或0引入bitContainer中的正确位置。