1BIT
1bit(1位)是计算机和数字通信中最小的数据单位,用于表示二进制状态(0或1)。在工业自动化和通信协议(如Modbus)中,1bit常用于存储开关量信号(如传感器状态、按钮动作)。以下从定义、特性、应用场景及操作示例四方面详细说明:
一、1bit的定义与特性
- 基本概念
- 1bit是二进制的最小单位,只能表示两种状态:
- 0:通常代表“断开”“无信号”“低电平”或“假”;
- 1:通常代表“闭合”“有信号”“高电平”或“真”。
- 例如:
- 光电传感器检测到物体时输出1,未检测到时输出0;
- 急停按钮按下时输出1,松开时输出0。
- 1bit是二进制的最小单位,只能表示两种状态:
- 存储与传输
- 1bit无法单独存储在内存中,通常以位域(Bit Field)或字节(Byte,8bit)的形式组织。
- 在Modbus协议中,离散输入寄存器(DI)和线圈寄存器(Coils)均以1bit为单位,但通信时需按字节或字(16bit)传输,通过位掩码提取具体bit值。
- 与字节/字的关系
- 1字节(Byte) = 8bit:可存储8个独立的开关量信号;
- 1字(Word) = 16bit:常用于存储16个开关量或1个16位整数(如输入寄存器IR)。
二、1bit在Modbus协议中的应用
- 离散输入寄存器(DI)
- 功能:存储只读的开关量输入信号(如传感器、按钮);
- 地址范围:Modbus中DI的显示地址通常为
10001~19999,协议地址为0x0000起始; - 操作:通过功能码
02(Read Discrete Inputs)读取,每次最多读取2000个bit(但实际受设备限制)。
- 线圈寄存器(Coils)
- 功能:存储可读写的开关量输出信号(如继电器、LED);
- 地址范围:显示地址通常为
00001~09999,协议地址为0x0000起始; - 操作:通过功能码
05(Write Single Coil)或15(Write Multiple Coils)写入。
- 位掩码与字节处理
- 由于Modbus通信以字节或字为单位,读取DI时需通过位掩码提取具体bit值。例如:
- 读取
10001~10008(8个DI)时,从设备返回1字节数据; - 若第3个DI(10003)为1,则字节值为
0x04(二进制00000100)。
- 读取
- 由于Modbus通信以字节或字为单位,读取DI时需通过位掩码提取具体bit值。例如:
总结学习心得:
从此看来,在工控的modbus RTU协议中,是遵循功能码来实现具体相关功能的,
例如:
功能码01 读线圈
功能码02(Read Discrete Inputs) 是读取离散输入寄存器DI discrete input registers
功能码03 读保持寄存器
功能码04读输入寄存器
功能码05 (Write Single Coil) 是写单个线圈 coils
功能码06 写单个保持寄存器
功能码15 (Write Multiple Coils) 是写入多个线圈
功能码16 写多个保持寄存器
也就是说modbus协议中的功能码和相关的功能是一一对应的,要实现什么样的功能,就选择其对应的功能码。
三、1bit的典型应用场景
- 传感器信号采集
- 光电传感器:检测物体到位(1)或未到位(0);
- 接近开关:判断机械臂位置(1=到位,0=未到位);
- 编码器:通过脉冲计数转换为位信号(如方向判断)。
- 设备状态监测
- 急停按钮:按下(1)或松开(0);
- 柜门开关:打开(1)或关闭(0);
- 运行模式:自动(1)或手动(0)。
- 故障诊断与保护
- 过流保护:触发(1)或正常(0);
- 过热报警:温度超限(1)或正常(0);
- 通信状态:485总线在线(1)或离线(0)。
四、1bit操作示例
1. 读取离散输入寄存器(DI)
- 场景:读取传感器状态(10001和10002)。
- Modbus RTU指令:响应解析:
uint8_t modbus_cmd[] = { 0x01, // 从站地址(1号设备) 0x02, // 功能码(读取离散输入) 0x00, 0x00, // 起始地址(10001对应0x0000) 0x00, 0x02, // 寄存器数量(2个DI) 0xC1, 0x07 // CRC校验 }; - 若返回数据为
0x03(二进制00000011),则:- 第1个DI(10001)= 1;
- 第2个DI(10002)= 1。
2. 写入线圈寄存器(Coils)
- 场景:控制继电器(00001和00002)。
- Modbus RTU指令(写入单个线圈):
-
uint8_t modbus_cmd[] = { 0x01, // 从站地址 0x05, // 功能码(写入单个线圈) 0x00, 0x00, // 线圈地址(00001对应0x0000) 0xFF, 0x00, // 值(0xFF00=1,0x0000=0) 0x3A, 0x9C // CRC校验 }; - 效果:继电器00001闭合(1)。
五、1bit操作的注意事项
-
地址转换
Modbus协议中,寄存器地址分为“显示地址”和“协议地址”,需按公式转换:
协议起始地址 = 显示地址 - 该类型寄存器起始偏移
例:DI显示地址10005 → 协议地址 = 10005 - 10001 = 0x0004。 -
批量操作限制
- 单次最多读取2000个DI(但实际受设备性能限制);
- 写入线圈时,功能码
15支持批量写入,但需注意字节顺序。
-
硬件匹配
- 确保传感器输出类型(如NPN/PNP)与从设备输入电路匹配;
- 继电器负载能力需满足控制需求(如电压、电流)。
六、1bit与数据效率
- 优势:1bit存储空间极小,适合高密度开关量信号(如数百个传感器);
- 局限:单独操作1bit效率低,通常以字节或字为单位批量处理;
- 优化:通过位域或压缩算法(如Huffman编码)进一步节省空间。
离散输入寄存器
离散输入寄存器(Discrete Input Registers,DI)是Modbus协议中用于存储数字量输入信号的只读寄存器,每个寄存器通过单个位(bit)表示开关量状态(0或1),通常对应硬件层面的传感器信号、按钮状态或设备控制信号。以下从特性、功能码、应用场景及操作示例四方面进行详细说明:
一、核心特性
- 数据类型
每个寄存器为1位(bit),仅存储0(断开/无信号)或1(闭合/有信号),对应开关量的二进制状态。例如:- 光电传感器检测到物体时为1,未检测到为0;
- 急停按钮按下时为1,松开时为0。
- 读写权限
- 只读:主设备(如PLC、HMI)只能读取寄存器值,无法直接修改;
- 从设备更新:寄存器值由硬件输入(如传感器、按钮)动态更新,从设备(如变频器、IO模块)负责将物理信号转换为数字量并存储。
- 地址范围
Modbus协议中,离散输入寄存器的地址通常以1开头,范围为10001~19999。实际通信时需转换为协议地址(起始地址+寄存器数量),例如读取10001~10004时,起始地址为0x0000,数量为4。
二、功能码与通信
-
唯一功能码
离散输入寄存器仅支持功能码02(Read Discrete Inputs),用于读取一个或多个连续寄存器的状态。 -
通信示例
以STM32读取传感器状态为例,发送的Modbus RTU指令如下:uint8_t modbus_cmd[] = { 0x01, // 从站地址(1号设备) 0x02, // 功能码(读取离散输入) 0x00, 0x00, // 起始地址(10001对应0x0000) 0x00, 0x02, // 寄存器数量(2个DI) 0xC1, 0x07 // CRC校验 };从设备响应后,主设备可解析数据判断传感器状态(如
0x01表示第一个DI为1,第二个为0)。
三、典型应用场景
- 设备状态监测
- 读取急停按钮、柜门开关、限位开关等安全信号;
- 监测设备运行模式(如自动/手动、正转/反转)。
- 传感器信号采集
- 光电传感器检测物体到位;
- 接近开关判断机械臂位置;
- 编码器反馈电机转速信号(需通过脉冲计数转换)。
- 故障诊断
- 读取过流、过压、过热等保护信号;
- 监测通信模块在线状态(如485总线连接是否正常)。
四、与其他寄存器的对比
| 寄存器类型 | 读写权限 | 数据宽度 | 典型应用 |
|---|---|---|---|
| 离散输入寄存器(DI) | 只读 | 1位(bit) | 传感器状态、按钮信号 |
| 线圈寄存器(Coils) | 可读可写 | 1位(bit) | 继电器控制、LED指示灯 |
| 输入寄存器(IR) | 只读 | 16位(2字节) | 模拟量采集(温度、压力、电流) |
| 保持寄存器(HR) | 可读可写 | 16位(2字节) | 设备参数设置、运行时间统计 |
五、操作注意事项
-
地址转换
Modbus协议中寄存器地址分为“显示地址”(如10001)和“协议地址”(如0x0000),通信时需按公式转换:
协议起始地址 = 显示地址 - 该类型寄存器起始偏移
例:DI显示地址10005 → 协议地址 = 10005 - 10001 = 0x0004。 -
批量读取限制
标准Modbus单次最多可读取2000个离散输入寄存器,但实际受设备性能限制,建议分批读取。 -
硬件匹配
确保从设备支持离散输入功能,且传感器信号类型(如NPN/PNP)与从设备输入电路匹配。
3913

被折叠的 条评论
为什么被折叠?



