From 984be481c957600c4c7cd0a7faccfd96265c8489 Mon Sep 17 00:00:00 2001 From: zouhaitao Date: Wed, 27 May 2026 18:32:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20Modbus=20RTU=20=E6=8A=A5?= =?UTF-8?q?=E6=96=87=E8=AF=B4=E6=98=8E=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modbus_RTU报文 | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 Modbus_RTU报文 diff --git a/Modbus_RTU报文 b/Modbus_RTU报文 new file mode 100644 index 0000000..380a1ea --- /dev/null +++ b/Modbus_RTU报文 @@ -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 数据字节数 = 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 空闲。 \ No newline at end of file