Files
433_STM32/Modbus_RTU报文

99 lines
4.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 空闲。