一、核心原理
- 先通过
bytes[offset]获取字节数组中指定偏移量(offset)的单个字节(对应 PLC 中的 1 个字节地址); - 再通过按位与(
&)运算 +位左移(<<)运算,提取该字节中指定位(bitIndex,范围 0~7,0 表示最低位 / 最右边,7 表示最高位 / 最左边)的值; - 判定规则:运算结果非 0 表示该位为 1(对应 C#
true),运算结果为 0 表示该位为 0(对应 C#false)。
二、关键表达式(提取单个位的值)
这是提取指定位的核心代码,直接可复用:
1 2 |
|
表达式逐部分拆解
| 部分 | 含义说明 |
|---|---|
bitIndex | 要提取的位索引,范围 0~7(必须满足0 ≤ bitIndex ≤ 7,否则会出错) |
1 << bitIndex | 把数字 1 左移bitIndex位,生成一个 “仅目标位为 1,其余位为 0” 的掩码(例如bitIndex=2时,1<<2=4,对应二进制00000100) |
bytes[offset] & (1 << bitIndex) | 按位与运算:只有 “目标位同时为 1” 时,结果才非 0,其余情况结果为 0(精准筛选目标位的值) |
!= 0 | 将位运算结果转换为 C# 布尔值:非 0 →true(位值为 1),0 →false(位值为 0) |
三、完整代码示例
下面提供可直接运行的 C# 代码,包含字节数组定义、位提取方法、场景演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
四、运行结果说明
上述代码中,plcBytes[0] = 0x05(十六进制)→ 对应二进制00000101,运行后输出:
plaintext
1 2 3 4 |
|
完全匹配二进制位的实际值,验证了提取逻辑的正确性。
五、补充说明
- 位索引顺序:PLC 中常用的位编号(如 I0.0、I0.1)通常对应
bitIndex=0、bitIndex=1,与上述代码的位索引一致; - 批量提取:若需提取 1 个字节对应的 8 个位,可通过循环
bitIndex从 0 到 7 依次调用提取方法; - PLC 场景适配:该方法完全适配 Sharp7、S7NetPlus 等主流 PLC 通信库,可直接集成到 PLC 数据读取业务中。
总结
- 核心表达式:
(bytes[offset] & (1 << bitIndex)) != 0(快速提取指定位的值); - 关键运算:按位与(
&)用于筛选目标位,位左移(<<)用于生成位掩码; - 位索引范围:0~7(0 最低位,7 最高位),偏移量
offset为字节数组的索引; - 实际使用时需增加合法性校验,避免数组越界和无效位索引。