优化 Modbus RTU 报文说明文档

This commit is contained in:
2026-05-27 18:32:21 +08:00
parent 5318c35d37
commit 984be481c9

99
Modbus_RTU报文 Normal file
View File

@ -0,0 +1,99 @@
Modbus RTU 报文说明
1. 请求帧MCU → Noris AMS
发送示例01 03 04 88 00 01 C5 D3
字节偏移 值 含义
0 01 从站地址 = 1
1 03 功能码 = Read Holding Registers
2-3 04 88 寄存器起始地址 = 0x0488 = 1160对应 Noris 41161
4-5 00 01 读取数量 = 1 个寄存器
6-7 C5 D3 CRC16-Modbus 校验(低字节在前)
帧长度8 字节
发送间隔:每 1000ms 发送一次
发送方式HAL_UART_Transmit() 阻塞发送,@19200bps 约 4.2ms
2. 正常响应帧Noris AMS → MCU
示例01 03 02 00 F0 B8 47
字节偏移 值 含义
0 01 从站地址 = 1
1 03 功能码 = 03正常响应
2 02 数据字节数 = 21个寄存器×2字节
3-4 00 F0 寄存器值 = 0x00F0大端序
5-6 B8 47 CRC16-Modbus 校验
帧长度7 字节
3. 寄存器值 → 报警映射
寄存器 41161 值为 0x00F0 时Bit4-7 全为 1
Bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0
↑ ↑ ↑ ↑
│ │ │ └─ Bit4: 火灾综合报警 (Fire)
│ │ └──── Bit5: 水密门综合报警 (Door)
│ └─────── Bit6: 舱底水综合报警 (Bilge)
└────────── Bit7: 气体检测综合报警 (Gas)
提取后映射到紧凑报警字节:
位 1-based偏移 0-based偏移
Bit5 (手册) >>4 >>5
Bit6 (手册) >>5 >>6
Bit7 (手册) >>6 >>7
Bit8 (手册) >>7 >>8xian
当前代码按 1-based 偏移 4/5/6/7 实现。
4. 报警状态 → RF433 数据包
4a. 变化通知包Type 0x4D
报警状态变化时立即发送:
示例AA 4D 03 69 0F [SUM]
字节 值 含义
0 AA 帧头
1 4D 协议类型 = Modbus RTU 报警
2 03 LEN = ID(1) + Payload(1) + SUM(1)
3 69 设备ID = 105
4 0F 报警状态字节(见下表)
5 SUM Sum8 校验和
报警字节 0x0F 各位含义:
Bit: 7 6 5 4 3 2 1 0
0 0 0 0 1 1 1 1
↑ ↑ ↑ ↑
│ │ │ └─ 火灾报警
│ │ └──── 水密门报警
│ └─────── 舱底水报警
└────────── 气体检测报警
4b. 心跳包Type 0xAA扩展后 8 字节载荷)
示例AA AA 0A 69 [Seq_H] [Seq_L] [FW_H] [FW_L] [IO] [TCP_H] [TCP_L] [RTU] [SUM]
字节偏移 含义 说明
0 AA 帧头
1 AA 协议类型 = 心跳
2 0A LEN = 10
3 69 设备ID = 105
4-5 Seq 序列号16-bit 大端)
6-7 FW 固件版本码
8 IO IO状态Bit0-3=DI1-4, Bit7=网口连接)
9-10 TCP Modbus TCP 最后寄存器值
11 RTU Modbus RTU 报警状态(新增)
12 SUM Sum8 校验和
5. 异常响应帧(参考)
如果从站返回异常:
01 83 02 C0 F1
字节 值 含义
0 01 从站地址
1 83 功能码 + 0x80异常标志
2 02 异常码 = 02非法寄存器地址
3-4 CRC 校验
当前代码:异常响应的 FC ≠ 0x03会被 parse_modbus_response() 的 mb_rx_buf[1] != 0x03 判断拦截,静默丢弃。
6. 时序图
时间轴 (ms)
0 1000 2000 3000
│ │ │ │
├─ TX: 请求帧(8B, ~4ms)
│ (发送后屏蔽回波10ms)
├─ RX: 响应帧(7B, ~3.6ms) ─┤
│ ├─ 解析+变化检测
│ ├─ 变化? → RF433发送
│ │
│ ├─ TX: 请求帧
│ ├─ RX: 响应帧
│ ├─ 解析
│ │
│ │ ├─ TX: 请求帧
│ │ ├─ 超时500ms无响应
│ │ ├─ 回IDLE下次重试
│ │ │ ├─ TX: 请求帧
│ │ │ ├─ RX: 响应帧
│ │ │ ├─ 解析
每秒一个完整轮询周期:发送(~4ms) + 等响应(~10ms) + 解析(<1ms) ≈ 15ms其余 985ms 空闲。