From c22d55236f24b8b443ecb1a6dc58b06866d667a2 Mon Sep 17 00:00:00 2001 From: wangfq Date: Wed, 29 Jul 2026 11:11:41 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20Modbus=E5=8D=8F=E8=AE=AE=20V1.2?= =?UTF-8?q?=E2=86=92V1.3=20=E4=BF=AE=E6=AD=A3=E5=AF=B9=E9=BD=90=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E7=A1=AC=E4=BB=B6=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 灵敏度档位 3→4 (范围 0-3, 默认 1) - MEASUREMENT_BASE 131072→524288 (CH591R@60MHz 无分频) - Origin 窗口 100→500 - 融合模式 5/6 待定义→已实现+状态机 - 命令示例数值对齐实际值 (Freq/CAPVD/Origin/Variation) - 700BS 标注为已完成 - 版本号 FW 3.00→3.01 --- docs/rs485-modbus-protocol.md | 60 ++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/docs/rs485-modbus-protocol.md b/docs/rs485-modbus-protocol.md index 10ac269..b2960af 100644 --- a/docs/rs485-modbus-protocol.md +++ b/docs/rs485-modbus-protocol.md @@ -1,10 +1,10 @@ # DLD154Pro RS485 Modbus RTU 协议 -> 版本: V1.2 | 日期: 2026-07-22 | 状态: 草案(待评审,未实现) +> 版本: V1.3 | 日期: 2026-07-29 | 状态: 定稿(待编码实现) > > 适用产品: DLD154Pro (CH591R, 单路线圈车检器) > -> RS485 支持两种协议:700BS(后续定义)和 Modbus RTU。 +> RS485 支持两种协议:700BS(已完成)和 Modbus RTU(待实现)。 > 协议选择通过 `g_function_mode` bit0 控制(BLE 小程序设置 `direction_mode` 高 4 位的 bit0)。 --- @@ -82,21 +82,21 @@ | 0x0007 | Variation Lo | int16 | | 变化量,低 16 位 | | 0x0008 | FW Version | uint16 | 1 寄存器 | 固件版本,高字节=主版本,低字节=子版本。例 `0x0300` = v3.00 | | 0x0009 | HW Version | uint16 | 1 寄存器 | 硬件版本。例 `0x0301` = v3.01 | -| 0x000A | Freq Sens | uint16 | 1 寄存器 | 当前灵敏度等级 (0=低, 1=中, 2=高) | +| 0x000A | Freq Sens | uint16 | 1 寄存器 | 当前灵敏度等级 (0=低, 1=中, 2=高, 3=最高) | | 0x000B | Condition | uint16 | 1 寄存器 | 环境活跃度 (0=安静, 1–100=嘈杂) | | 0x000C | DIP Virtual | uint16 | 1 寄存器 | 虚拟拨码(700BS 兼容): bit[7:4]=function_mode, bit[3:0]=fusion_mode | > **32-bit 值换算**: > - 频率:`freq_hz = (reg[0x0000] << 16) | reg[0x0001]`,单位 Hz。典型空线圈 50–120kHz。 -> - CAPVD:`capvd = (reg[0x0002] << 16) | reg[0x0003]`,归一化到 `MEASUREMENT_BASE = 131072`。 -> - Origin:`origin = (reg[0x0004] << 16) | reg[0x0005]`,100 次滑动平均累加值。 +> - CAPVD:`capvd = (reg[0x0002] << 16) | reg[0x0003]`,归一化到 `MEASUREMENT_BASE = 524288`。 +> - Origin:`origin = (reg[0x0004] << 16) | reg[0x0005]`,500 窗滑动平均累加值。 > - Variation:`var = (int32_t)((reg[0x0006] << 16) | reg[0x0007])`,正值=频率降低(可能有车),负值=频率升高。 ### 3.3 保持寄存器 (Holding Registers) — 功能码 0x03 / 0x06 / 0x10 | 地址 | 名称 | 范围 | 默认 | R/W | 说明 | |------|------|------|------|-----|------| -| 0x0000 | Sensitivity | 0–2 | 2 | R/W | 灵敏度等级 (0=低, 1=中, 2=高) | +| 0x0000 | Sensitivity | 0–3 | 1 | R/W | 灵敏度等级 (0=低, 1=中, 2=高, 3=最高) | | 0x0001 | Fusion Mode | 0–6 | 0 | R/W | 输出组合模式(见 §6.5) | | 0x0002 | Hold Time | 0–255 | 0 | R/W | 有限存在时间 (×5s), 0=永久存在 | | 0x0003 | Output Delay | 0–255 | 10 | R/W | 离开延时 (×50ms), 例 10=500ms | @@ -134,10 +134,10 @@ ``` >>> 01 04 00 00 00 08 70 1F (读 0x0000 起 8 个寄存器) <<< 01 04 10 - 00 01 86 A0 ← Freq = 0x000186A0 = 100000 Hz - 00 02 00 7C ← CAPVD = 0x0002007C = 131196 - 00 01 FF F3 ← Origin = 0x0001FFF3 = 131059 - FF FF 00 99 ← Var = 0xFFFF0099 = −65383 (频率降低) + 00 01 38 80 ← Freq = 0x00013880 = 80000 Hz + 00 07 FF C8 ← CAPVD = 0x0007FFC8 = 524200 + 00 08 00 00 ← Origin = 0x00080000 = 524288 + FF FF FF A8 ← Var = 0xFFFFFFA8 = −88 (频率升高,有车) XX XX ``` @@ -147,17 +147,17 @@ ``` >>> 01 03 00 00 00 05 84 09 (读 5 个: 灵敏度/融合模式/存在时间/延时/频率档) -<<< 01 03 0A 00 02 00 00 00 00 00 0A 00 00 XX XX - → 灵敏度=2(高), 融合模式=0(仅地感), 永久存在, 延时=500ms, 高频 +<<< 01 03 0A 00 01 00 00 00 00 00 0A 00 00 XX XX + → 灵敏度=1(中), 融合模式=0(仅地感), 永久存在, 延时=500ms, 高频 ``` ### 4.4 写单个寄存器 — 功能码 0x06 -修改灵敏度为"中": +修改灵敏度为"高": ``` ->>> 01 06 00 00 00 01 49 F3 (写 0x0000=1) -<<< 01 06 00 00 00 01 49 F3 +>>> 01 06 00 00 00 02 88 32 (写 0x0000=2) +<<< 01 06 00 00 00 02 88 32 ``` 修改融合模式为"地感或雷达": @@ -182,7 +182,7 @@ 写入超出范围的灵敏度值: ``` ->>> 01 06 00 00 00 05 88 32 (写 0x0000=5, 超出 0–2) +>>> 01 06 00 00 00 05 88 32 (写 0x0000=5, 超出 0–3) <<< 01 86 03 02 63 (异常: 功能码 0x86, 异常码 0x03=Illegal Data Value) ``` @@ -224,7 +224,7 @@ ### 6.1 为什么 CAPVD/Origin/Variation 用 2 个寄存器? -DLD154V4B 算法移植后,`MEASUREMENT_BASE = 131072 (2^17)`,IIR 滤波后的 CAPVD 和 Origin 是 `uint32_t` 类型,典型值在 10 万级,远超 16 位(65535)。Variation 是差值且可能为负,需要完整 32-bit 有符号表示。因此各占 2 个 Modbus 寄存器(寄存器对,大端序)。 +DLD154Pro 算法移植后,`MEASUREMENT_BASE = 524288 (2^19)`(CH591R@60MHz 无内部分频,需要比 DLD154V4B 更大的 BASE)。IIR 滤波后的 CAPVD 和 Origin 是 `uint32_t` 类型,典型值在 50 万级,远超 16 位(65535)。Variation 是差值且可能为负,需要完整 32-bit 有符号表示。因此各占 2 个 Modbus 寄存器(寄存器对,大端序)。 ### 6.2 为什么不通过 Modbus 修改 RS485 地址/波特率? @@ -242,11 +242,14 @@ DLD154V4B 算法移植后,`MEASUREMENT_BASE = 131072 (2^17)`,IIR 滤波后 | 灵敏度值 | SensTable 进入 | ΔL/L 进入 | SensTable1 离开 | ΔL/L 离开 | |---------|---------------|-----------|----------------|-----------| +| 3 (最高) | 14 | **0.043%** | 12 | 0.037% | | 2 (高) | 28 | **0.085%** | 16 | 0.049% | | 1 (中) | 54 | **0.165%** | 32 | 0.098% | | 0 (低) | 108 | **0.330%** | 81 | 0.247% | -ΔL/L 越大越不灵敏。高灵敏度 (2) 适合安静环境,低灵敏度 (0) 适合强干扰环境。 +ΔL/L 越大越不灵敏。最高灵敏度 (3) 适合摩托车/安静环境,低灵敏度 (0) 适合强干扰环境。 + +> ⚠ 第 3 档 (sens=14) 信噪比余量仅约 2:1(20°C 温漂 ≈0.1% 感量偏移),仅推荐摩托车/小型车辆检测场景,需确保线圈安装质量。 ### 6.5 输出组合模式 (Fusion Mode) @@ -261,15 +264,19 @@ DLD154V4B 算法移植后,`MEASUREMENT_BASE = 131072 (2^17)`,IIR 滤波后 | 值 | 模式 | 继电器吸合条件 | 适用场景 | |----|------|--------------|---------| -| 0 | 默认 (仅地感) | 线圈有车 | 纯线圈场景(光耦未接雷达时也用此模式) | -| 1 | 仅地感 | 线圈有车 | 同 0,显式指定忽略雷达 | -| 2 | 仅雷达 | 光耦输入有效(雷达有车) | 纯雷达,地感只做背景监控 | -| 3 | 地感 **或** 雷达 | 线圈 OR 雷达 | 互补冗余,任一触发即吸合 | -| 4 | 地感 **且** 雷达 | 线圈 AND 雷达 | 双确认,防地感误触(如行人/拖车) | -| 5 | 混行模式 | 待定义 | 混合交通流场景 | -| 6 | ETC 模式 | 待定义 | ETC 专用逻辑 | +| 0 | 光耦复位 + 地感 | 线圈有车(光耦用于远程复位) | 需要远程复位功能 | +| 1 | 仅地感 | 线圈有车 | 纯线圈场景(默认,未接光耦时也用此模式) | +| 2 | 仅光耦 | 光耦输入有效(雷达有车) | 纯雷达,地感只做背景监控 | +| 3 | 地感 **或** 光耦 | 线圈 OR 雷达 | 互补冗余,任一触发即吸合 | +| 4 | 地感 **且** 光耦 | 线圈 AND 雷达 | 双确认,防地感误触(如行人/拖车) | +| 5 | 人车混行防砸 | 有车后 coil OR opto,离场 3s 窗口内光耦有效 | 混合交通流防砸人 | +| 6 | ETC 模式 | 有车后 coil OR opto,光耦断开 500ms 防抖才释放 | ETC 专用逻辑 | -> **注意**:当 `g_fm_radar_input_disable = 1`(光耦配置为复位功能)时,`fusion_mode` 无效,继电器仅由线圈检测结果驱动。 +**模式 5(人车混行防砸)状态机**:IDLE(仅线圈检测)→ 线圈有车 → ARMED(线圈||光耦)→ 两者均释放 → WINDOW(3s 防砸窗口,光耦触发即续吸,连续进入持续防砸)→ 3s 超时 → IDLE。 + +**模式 6(ETC)状态机**:IDLE(仅线圈检测)→ 线圈有车 → ARMED(线圈||光耦)→ 两者均释放 → DEBOUNCE(500ms 防抖,期间触发即回 ARMED)→ 超时 → IDLE。 + +> **注意**:当光耦配置为复位功能(`function_mode` bit1=1)时,`fusion_mode` 无效,继电器仅由线圈检测结果驱动。模式 0 下光耦输入低电平 ≥400ms 后上升沿触发 `SYS_ResetExecute()` 芯片全复位。 ### 6.6 实现要点(待编码时参考) @@ -321,6 +328,7 @@ DLD154Pro RS485 同时支持 700BS 协议(`g_fm_700bs_disable=0`)和 Modbus | 版本 | 日期 | 作者 | 变更 | |------|------|------|------| +| V1.3 | 2026-07-29 | wangfq | 修正: 灵敏度档位 3→4 (范围 0–3, 默认 1); MEASUREMENT_BASE 131072→524288; Origin 窗口 100→500; 融合模式 5/6 待定义→已实现+状态机; 命令示例数值对齐实际硬件; 700BS 标注为已完成; 版本号 FW 3.00→3.01 | | V1.2 | 2026-07-22 | wangfq | 700BS 兼容: +DI Freq Low/High Fault, +DI Init Flag, +IR DIP Virtual, +HR Device Reset(0x00FF), +HR Init Flag Clear(0x00FE); +§7 700BS 兼容对照表 | | V1.1 | 2026-07-22 | wangfq | 修正: CAPVD/Origin/Variation 扩展为 32-bit (×2 寄存器); Output Mode 删除脉冲模式(仅存在输出); 新增 Fusion Mode(输出组合模式 0-6); direction_mode 字段重构说明 | | V1.0 | 2026-07-22 | wangfq | 初版草案 |