首页/协议速查/Modbus
📦

Modbus 工业应用层协议

工业总线
设备兼容之王:跑在RS485上的主从协议,PLC/电表/传感器都认它。
🧩 核心原理
📈 时序 / 工作过程图
Modbus RTU 报文帧格式主从一问一答 · CRC16 校验(多项式 0xA001)CRC16 高RTU 帧(无起始/结束符,靠 ≥3.5字符 静默间隔分帧)功能码:01读线圈 03读保持寄存器 04读输入 05写单线圈 06写单寄存器 10写多寄存器例:读从站1 保持寄存器 地址0x0000 数量2 → 01 03 0000 0002 CRC
⚙️ 配置 / 使用要点
  1. 分配从站地址与寄存器映射表
  2. 实现帧解析状态机 + CRC 校验
  3. 按功能码分发处理函数
  4. 响应超时与重试策略(主站)
🛠️ 项目示例
Modbus RTU 从站解析 03 功能码(读保持寄存器)
// 收到: [01] [03] [00 00] [00 02] [CRC]
// 从站1 读起始地址0x0000 数量2
if(frame[0]==ADDR && frame[1]==0x03){
  uint16_t start = (frame[2]<<8)|frame[3];
  uint16_t n     = (frame[4]<<8)|frame[5];
  // 应答: ADDR 03 [字节数] [数据2*n] [CRC]
  resp[0]=ADDR; resp[1]=0x03; resp[2]=n*2;
  for(i=0;i<n;i++){
    uint16_t v = regs[start+i];
    resp[3+i*2]=v>>8; resp[4+i*2]=v&0xFF;
  }
  uint16_t crc = modbus_crc16(resp, 3+n*2);
  resp[3+n*2]=crc&0xFF; resp[4+n*2]=crc>>8;
  uart_send(resp, 5+n*2);
}
❓ 面试高频
Modbus RTU怎么分帧?
没有帧头帧尾,靠 ≥3.5 字符时间静默间隔判断一帧结束,接收状态机超时组帧
RTU和TCP区别?
RTU在串行链路上有CRC16;TCP去CRC换6字节MBAP头(事务ID+协议ID+长度+单元ID),地址进单元ID
为什么Modbus是工业默认?
开放简单、寄存器模型通用(保持/输入/线圈/离散输入)、从PLC到仪表全支持
✅ 自查清单 (点击勾选,本地保存)
0/0
知道RTU帧结构
会写CRC16
知道常用功能码
知道主从机制
知道RTU vs TCP