99 lines
4.0 KiB
Plaintext
99 lines
4.0 KiB
Plaintext
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 数据字节数 = 2(1个寄存器×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 空闲。 |