Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
692b406d0f | ||
|
|
d1fde88dd1 |
@@ -17,10 +17,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define PRODUCT_MODEL "DLD154Pro"
|
#define PRODUCT_MODEL "DLD154Pro"
|
||||||
#define FIRMWARE_VER "3.04"
|
#define FIRMWARE_VER "3.05"
|
||||||
#define HARDWARE_VER "3.01"
|
#define HARDWARE_VER "3.01"
|
||||||
#define FIRMWARE_VER_MAIN 3
|
#define FIRMWARE_VER_MAIN 3
|
||||||
#define FIRMWARE_VER_SUB 4
|
#define FIRMWARE_VER_SUB 5
|
||||||
|
|
||||||
/* 归一化基数: variation 换算 dL/L 时除以该值 (2^19=524288, 必须与 peripheral_main.c MEASUREMENT_BASE 同步) */
|
/* 归一化基数: variation 换算 dL/L 时除以该值 (2^19=524288, 必须与 peripheral_main.c MEASUREMENT_BASE 同步) */
|
||||||
#define LOOP_MEASURE_BASE 524288L
|
#define LOOP_MEASURE_BASE 524288L
|
||||||
|
|||||||
@@ -39,8 +39,9 @@
|
|||||||
#define MB_FULL_DATA_FRAME_LEN 43
|
#define MB_FULL_DATA_FRAME_LEN 43
|
||||||
|
|
||||||
/* FC 0x03/0x04 读寄存器缓冲 (Modbus 标准: max qty = 0x007D = 125) */
|
/* FC 0x03/0x04 读寄存器缓冲 (Modbus 标准: max qty = 0x007D = 125) */
|
||||||
#define MB_MAX_READ_REGS 125 /* 单次读取最大寄存器数 */
|
/* ⚠ 40/80 匹配: 40 寄存器 × 2B = 80B 缓冲 (2026-08-27 省 Flash 减配, 原 60 会越界 40B) */
|
||||||
#define MB_MAX_DATA_BYTES 250 /* 125 × 2 字节 */
|
#define MB_MAX_READ_REGS 40 //125 /* 单次读取最大寄存器数 */
|
||||||
|
#define MB_MAX_DATA_BYTES 80 //250 /* 40 × 2 字节 */
|
||||||
#define MB_RESP_BUF_SIZE (5 + MB_MAX_DATA_BYTES) /* addr+fc+bc+data+crc */
|
#define MB_RESP_BUF_SIZE (5 + MB_MAX_DATA_BYTES) /* addr+fc+bc+data+crc */
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
|
|||||||
@@ -730,7 +730,7 @@ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len
|
|||||||
// 0x4F, 0x54, 0x41
|
// 0x4F, 0x54, 0x41
|
||||||
// PRINT("jump OTA \n");
|
// PRINT("jump OTA \n");
|
||||||
WWDG_ResetCfg(DISABLE);
|
WWDG_ResetCfg(DISABLE);
|
||||||
mDelaymS(5);
|
// mDelaymS(5);
|
||||||
Jump_OTA();
|
Jump_OTA();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ uint8_t g_rs485_id = 0;
|
|||||||
#define BREATH_HOLD_LOW 3
|
#define BREATH_HOLD_LOW 3
|
||||||
|
|
||||||
/* 光耦有信号时加速参数 (周期 ~1s) */
|
/* 光耦有信号时加速参数 (周期 ~1s) */
|
||||||
#define BREATH_OPTO_DUTY_STEP 32 // 步长 4x → 渐亮/渐灭各 4 步 (~0.5s 周期)
|
#define BREATH_OPTO_DUTY_STEP 64 // 步长 4x → 渐亮/渐灭各 4 步 (~0.5s 周期)
|
||||||
#define BREATH_OPTO_HOLD_TICKS 1 // 保持 50ms
|
#define BREATH_OPTO_HOLD_TICKS 1 // 保持 50ms
|
||||||
|
|
||||||
/* 看门狗超时: Fsys=60MHz, WDOG_CLK=Fsys/131072≈458Hz, 0xFF≈558ms */
|
/* 看门狗超时: Fsys=60MHz, WDOG_CLK=Fsys/131072≈458Hz, 0xFF≈558ms */
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ void rs485_init(void)
|
|||||||
|
|
||||||
RS485_RE_RX(); // 默认接收模式
|
RS485_RE_RX(); // 默认接收模式
|
||||||
_hb_last_ms = mstick(); // 对齐心跳起始时刻,避免首次立即触发
|
_hb_last_ms = mstick(); // 对齐心跳起始时刻,避免首次立即触发
|
||||||
PRINT("RS485: init ok, addr=%d, baud=%d\n", g_rs485_id, RS485_BAUD);
|
// PRINT("RS485: init ok, addr=%d, baud=%d\n", g_rs485_id, RS485_BAUD);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
@@ -126,7 +126,7 @@ static void handle_query_freq(uint8_t addr)
|
|||||||
static void handle_reset_init(uint8_t addr)
|
static void handle_reset_init(uint8_t addr)
|
||||||
{
|
{
|
||||||
SYS_ResetExecute();
|
SYS_ResetExecute();
|
||||||
PRINT("RS485: coil reset init\n");
|
// PRINT("RS485: coil reset init\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0x3D — 查询拨码 DIP1-5 (DLD154Pro 无物理拨码, 从 BLE 配置映射) */
|
/* 0x3D — 查询拨码 DIP1-5 (DLD154Pro 无物理拨码, 从 BLE 配置映射) */
|
||||||
@@ -222,7 +222,7 @@ static void rs485_process_frame(void)
|
|||||||
uint8_t xorr = _rx_buf[2];
|
uint8_t xorr = _rx_buf[2];
|
||||||
|
|
||||||
if ((stx ^ addr) != xorr) {
|
if ((stx ^ addr) != xorr) {
|
||||||
PRINT("RS485: XOR fail %02X %02X %02X\n", stx, addr, xorr);
|
// PRINT("RS485: XOR fail %02X %02X %02X\n", stx, addr, xorr);
|
||||||
_rx_len = 0;
|
_rx_len = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -237,9 +237,9 @@ static void rs485_process_frame(void)
|
|||||||
case CMD_QUERY_STATUS: handle_query_status(addr); break;
|
case CMD_QUERY_STATUS: handle_query_status(addr); break;
|
||||||
case CMD_QUERY_FREQ: handle_query_freq(addr); break;
|
case CMD_QUERY_FREQ: handle_query_freq(addr); break;
|
||||||
case CMD_RESET_INIT: handle_reset_init(addr); break;
|
case CMD_RESET_INIT: handle_reset_init(addr); break;
|
||||||
case CMD_QUERY_DIP: handle_query_dip(addr); break;
|
// case CMD_QUERY_DIP: handle_query_dip(addr); break;
|
||||||
default:
|
default:
|
||||||
PRINT("RS485: unknown cmd 0x%02X\n", stx);
|
// PRINT("RS485: unknown cmd 0x%02X\n", stx);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -439,24 +439,24 @@ static uint8_t read_ir_register(uint16_t addr, uint8_t *hi, uint8_t *lo)
|
|||||||
*hi = (uint8_t)(loop1_Origin >> 24); *lo = (uint8_t)(loop1_Origin >> 16); return 1;
|
*hi = (uint8_t)(loop1_Origin >> 24); *lo = (uint8_t)(loop1_Origin >> 16); return 1;
|
||||||
case 0x0005: /* Origin Lo */
|
case 0x0005: /* Origin Lo */
|
||||||
*hi = (uint8_t)(loop1_Origin >> 8); *lo = (uint8_t)(loop1_Origin); return 1;
|
*hi = (uint8_t)(loop1_Origin >> 8); *lo = (uint8_t)(loop1_Origin); return 1;
|
||||||
case 0x0006: /* Variation Hi */
|
// case 0x0006: /* Variation Hi */
|
||||||
var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
// var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
||||||
val32 = (uint32_t)var;
|
// val32 = (uint32_t)var;
|
||||||
*hi = (uint8_t)(val32 >> 24); *lo = (uint8_t)(val32 >> 16); return 1;
|
// *hi = (uint8_t)(val32 >> 24); *lo = (uint8_t)(val32 >> 16); return 1;
|
||||||
case 0x0007: /* Variation Lo */
|
// case 0x0007: /* Variation Lo */
|
||||||
var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
// var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
||||||
val32 = (uint32_t)var;
|
// val32 = (uint32_t)var;
|
||||||
*hi = (uint8_t)(val32 >> 8); *lo = (uint8_t)(val32); return 1;
|
// *hi = (uint8_t)(val32 >> 8); *lo = (uint8_t)(val32); return 1;
|
||||||
case 0x0008: /* FW Version (BCD: v3.01 → 0x0301) */
|
case 0x0008: /* FW Version (BCD: v3.01 → 0x0301) */
|
||||||
*hi = FIRMWARE_VER_MAIN; *lo = FIRMWARE_VER_SUB; return 1;
|
*hi = FIRMWARE_VER_MAIN; *lo = FIRMWARE_VER_SUB; return 1;
|
||||||
case 0x0009: /* HW Version */
|
case 0x0009: /* HW Version */
|
||||||
*hi = HARDWARE_VER_MAIN; *lo = HARDWARE_VER_SUB; return 1;
|
*hi = HARDWARE_VER_MAIN; *lo = HARDWARE_VER_SUB; return 1;
|
||||||
case 0x000A: /* Freq Sens */
|
// case 0x000A: /* Freq Sens */
|
||||||
*hi = 0; *lo = g_loop_cng_unit.sensitvity & 0x0F; return 1;
|
// *hi = 0; *lo = g_loop_cng_unit.sensitvity & 0x0F; return 1;
|
||||||
case 0x000B: /* Condition */
|
// case 0x000B: /* Condition */
|
||||||
*hi = 0; *lo = g_loop_acs_info.condition; return 1;
|
// *hi = 0; *lo = g_loop_acs_info.condition; return 1;
|
||||||
case 0x000C: /* DIP Virtual: bit[7:4]=function_mode, bit[3:0]=fusion_mode */
|
// case 0x000C: /* DIP Virtual: bit[7:4]=function_mode, bit[3:0]=fusion_mode */
|
||||||
*hi = 0; *lo = (g_function_mode << 4) | (g_output_radar_mode & 0x0F); return 1;
|
// *hi = 0; *lo = (g_function_mode << 4) | (g_output_radar_mode & 0x0F); return 1;
|
||||||
|
|
||||||
/* 全数据块 0x0100–0x0112 — 热路径, 直接计算 */
|
/* 全数据块 0x0100–0x0112 — 热路径, 直接计算 */
|
||||||
default:
|
default:
|
||||||
@@ -615,34 +615,34 @@ static void handle_write_single_reg(const uint8_t *rx, uint8_t rx_len)
|
|||||||
|
|
||||||
/* 值校验 & 写入 */
|
/* 值校验 & 写入 */
|
||||||
switch (reg_addr) {
|
switch (reg_addr) {
|
||||||
case 0x0000: /* Sensitivity: 0-3 */
|
// case 0x0000: /* Sensitivity: 0-3 */
|
||||||
if (reg_val > 3) { send_exception(0x06, 0x03); return; }
|
// if (reg_val > 3) { send_exception(0x06, 0x03); return; }
|
||||||
g_loop_cng_unit.sensitvity = (uint8_t)reg_val;
|
// g_loop_cng_unit.sensitvity = (uint8_t)reg_val;
|
||||||
break;
|
// break;
|
||||||
case 0x0001: /* Fusion Mode: 0-6 */
|
// case 0x0001: /* Fusion Mode: 0-6 */
|
||||||
if (reg_val > 6) { send_exception(0x06, 0x03); return; }
|
// if (reg_val > 6) { send_exception(0x06, 0x03); return; }
|
||||||
g_output_radar_mode = (uint8_t)reg_val;
|
// g_output_radar_mode = (uint8_t)reg_val;
|
||||||
g_loop_cng_unit.direction_mode = (g_function_mode << 4) | (g_output_radar_mode & 0x0F);
|
// g_loop_cng_unit.direction_mode = (g_function_mode << 4) | (g_output_radar_mode & 0x0F);
|
||||||
break;
|
// break;
|
||||||
case 0x0002: /* Hold Time: 0-255 */
|
// case 0x0002: /* Hold Time: 0-255 */
|
||||||
g_loop_cng_unit.exist_mode = (uint8_t)reg_val;
|
// g_loop_cng_unit.exist_mode = (uint8_t)reg_val;
|
||||||
g_hold_time = (uint16_t)reg_val * 20 * 5;
|
// g_hold_time = (uint16_t)reg_val * 20 * 5;
|
||||||
break;
|
// break;
|
||||||
case 0x0003: /* Output Delay: 0-255 */
|
// case 0x0003: /* Output Delay: 0-255 */
|
||||||
g_loop_cng_unit.delay_time = (uint8_t)reg_val;
|
// g_loop_cng_unit.delay_time = (uint8_t)reg_val;
|
||||||
break;
|
// break;
|
||||||
case 0x0004: /* Freq Level: 0-1 */
|
// case 0x0004: /* Freq Level: 0-1 */
|
||||||
if (reg_val > 1) { send_exception(0x06, 0x03); return; }
|
// if (reg_val > 1) { send_exception(0x06, 0x03); return; }
|
||||||
g_freq_level = (uint8_t)reg_val;
|
// g_freq_level = (uint8_t)reg_val;
|
||||||
g_loop_cng_unit.loopFreq_Level = g_freq_level + 1;
|
// g_loop_cng_unit.loopFreq_Level = g_freq_level + 1;
|
||||||
break;
|
// break;
|
||||||
case 0x0009: /* BT Timeout: 0-255 */
|
// case 0x0009: /* BT Timeout: 0-255 */
|
||||||
g_max_counter_bt_min = (uint8_t)reg_val;
|
// g_max_counter_bt_min = (uint8_t)reg_val;
|
||||||
g_max_counter_bt_timeout = (uint32_t)reg_val * 60 * 1000;
|
// g_max_counter_bt_timeout = (uint32_t)reg_val * 60 * 1000;
|
||||||
break;
|
// break;
|
||||||
case 0x000A: /* Safe Timeout: 0-255 */
|
// case 0x000A: /* Safe Timeout: 0-255 */
|
||||||
g_loop_cng_unit.loopSafe_Timeout = (uint8_t)reg_val;
|
// g_loop_cng_unit.loopSafe_Timeout = (uint8_t)reg_val;
|
||||||
break;
|
// break;
|
||||||
case 0x0010: /* Auto Rpt Enable: 0-1 */
|
case 0x0010: /* Auto Rpt Enable: 0-1 */
|
||||||
if (reg_val > 1) { send_exception(0x06, 0x03); return; }
|
if (reg_val > 1) { send_exception(0x06, 0x03); return; }
|
||||||
_auto_rpt_enable = (uint8_t)reg_val;
|
_auto_rpt_enable = (uint8_t)reg_val;
|
||||||
@@ -833,11 +833,11 @@ void modbus_poll(void)
|
|||||||
if (crc_rx == crc_calc) {
|
if (crc_rx == crc_calc) {
|
||||||
switch (fc) {
|
switch (fc) {
|
||||||
case 0x02: handle_read_discrete_inputs(rx, len); break;
|
case 0x02: handle_read_discrete_inputs(rx, len); break;
|
||||||
case 0x03: handle_read_holding_regs(rx, len); break;
|
// case 0x03: handle_read_holding_regs(rx, len); break;
|
||||||
case 0x04: handle_read_input_regs(rx, len); break;
|
case 0x04: handle_read_input_regs(rx, len); break;
|
||||||
case 0x06: handle_write_single_reg(rx, len); break;
|
case 0x06: handle_write_single_reg(rx, len); break;
|
||||||
case 0x10: handle_write_multiple_regs(rx, len); break;
|
// case 0x10: handle_write_multiple_regs(rx, len); break;
|
||||||
case 0x11: handle_report_slave_id(rx, len); break;
|
// case 0x11: handle_report_slave_id(rx, len); break;
|
||||||
default: send_exception(fc, 0x01); break;
|
default: send_exception(fc, 0x01); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# DLD154Pro 蓝牙小程序接口协议
|
# DLD154Pro 蓝牙小程序接口协议
|
||||||
|
|
||||||
> 依据源码整理:`BLE/DLD154Pro_Peripheral_28K/APP/dbn_ble_srv.c`(主逻辑)、`peripheral.c`/`Profile/gattprofile.c`(BLE 服务)、`include/storage.h`(配置结构)、`include/cmcng.h`(常量)
|
> 依据源码整理:`BLE/DLD154Pro_Peripheral_28K/APP/dbn_ble_srv.c`(主逻辑)、`peripheral.c`/`Profile/gattprofile.c`(BLE 服务)、`include/storage.h`(配置结构)、`include/cmcng.h`(常量)
|
||||||
> 固件版本:V3.04(cmcng.h `FIRMWARE_VER`)| 硬件版本:V3.01 | 产品型号:DLD154Pro
|
> 固件版本:V3.05(cmcng.h `FIRMWARE_VER`)| 硬件版本:V3.01 | 产品型号:DLD154Pro
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ dsum = Header + Len + CMD + Data[0] + ... + Data[N-1]; // 取低 8 位
|
|||||||
|------|------|------|
|
|------|------|------|
|
||||||
| 0-5 | 6 | MAC 地址(MACAddr[6]) |
|
| 0-5 | 6 | MAC 地址(MACAddr[6]) |
|
||||||
| 6-7 | 2 | 硬件版本 MAIN/SUB(V3.01 → 03 01) |
|
| 6-7 | 2 | 硬件版本 MAIN/SUB(V3.01 → 03 01) |
|
||||||
| 8-9 | 2 | 固件版本 MAIN/SUB(V3.04 → 03 04) |
|
| 8-9 | 2 | 固件版本 MAIN/SUB(V3.05 → 03 05) |
|
||||||
| 10 | 1 | 产品型号长度 |
|
| 10 | 1 | 产品型号长度 |
|
||||||
| 11.. | N | 产品型号 ASCII("DLD154Pro") |
|
| 11.. | N | 产品型号 ASCII("DLD154Pro") |
|
||||||
| .. | 6 | 设备编号(g_dev_number[6]) |
|
| .. | 6 | 设备编号(g_dev_number[6]) |
|
||||||
|
|||||||
@@ -4,6 +4,44 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 2026-08-27 — RS485 协议省 Flash 减配(文档如实标注未实现,V3.05 固件 + 协议 V1.8)
|
||||||
|
|
||||||
|
### 背景
|
||||||
|
|
||||||
|
本地调整 RS485 侧代码减少 Flash 占用:注释掉一批低频/非核心协议分支与调试打印。**原则:代码未实现的功能,协议文档在相应指令旁如实标注"未实现"**,避免文档承诺 ≠ 固件实现。
|
||||||
|
|
||||||
|
### 固件改动(本地,未提交)
|
||||||
|
|
||||||
|
| 文件 | 改动 |
|
||||||
|
|------|------|
|
||||||
|
| `APP/include/cmcng.h` | 版本 **V3.04 → V3.05**(FIRMWARE_VER 字符串 + SUB 宏同步) |
|
||||||
|
| `APP/rs485_modbus.c` | FC 0x03(读保持寄存器)/0x10(批量写)/0x11(Report Slave ID)分发注释;IR 0x0006/0x0007(Variation)/0x000A(Freq Sens)/0x000B(Condition)/0x000C(DIP Virtual)注释;HR 0x0000–0x0004/0x0009/0x000A 写 case 注释(FC 0x06 仅剩 0x0010/0x0011/0x0012) |
|
||||||
|
| `APP/include/rs485_modbus.h` | `MB_MAX_READ_REGS 125→60→40`、`MB_MAX_DATA_BYTES 250→80`(40×2=80 匹配,原 60 会越界 40B,同日修正) |
|
||||||
|
| `APP/rs485_700bs.c` | 0x3D DIP 查询分支注释 + 4 处调试 PRINT 注释 |
|
||||||
|
| `APP/peripheral_main.c` | `BREATH_OPTO_DUTY_STEP 32→64`(注释"~0.5s 周期"未同步,实际 2 步≈0.25s) |
|
||||||
|
| `APP/peripheral.c` | OTA 跳转前 `mDelaymS(5)` 注释 |
|
||||||
|
|
||||||
|
### 文档同步(本次落地)
|
||||||
|
|
||||||
|
| 文件 | 标注 |
|
||||||
|
|------|------|
|
||||||
|
| `docs/rs485-modbus-protocol.md` V1.7→**V1.8** | §3.1 DI 0x0008 Init Flag 未实现(恒 0);§3.2 IR 0x0006/0x0007/0x000A/0x000B/0x000C 未实现(Variation 改读全数据块 0x010A/0x010B);§3.3 HR 全部标注(FC 0x06 仅 0x0010/0x0011/0x0012 可写);§4.3/4.5/4.8 未实现横幅;§5 功能码矩阵 0x03/0x10/0x11 → ✗;§6.3 仅 0x06;§7 0x3D/Init_B 对照标注;§8 版本历史 V1.8 |
|
||||||
|
| `docs/rs485-700bs-protocol.md` | §4.4 0x3D 未实现注记(V3.05 起减配不响应);§5 速查表 + §6 兼容对照同步 |
|
||||||
|
|
||||||
|
### 保留能力(减配后仍可用)
|
||||||
|
|
||||||
|
- FC 0x02 读离散输入(车辆/故障/继电器/光耦)✅
|
||||||
|
- FC 0x04 读输入寄存器 + **全数据块 0x0100–0x0112**(含 Variation 0x010A/0x010B)✅
|
||||||
|
- FC 0x06 写:0x0010 主动上报使能 / 0x0011 活动阈值 / 0x0012 复位(0x2C2C)✅
|
||||||
|
- 700BS 0xFA / 0x1B / 0x2C / 0xAA 心跳 ✅
|
||||||
|
|
||||||
|
### ⚠ 遗留提醒
|
||||||
|
|
||||||
|
1. ~~**宏越界**:`MB_MAX_READ_REGS=60` 但 `MB_MAX_DATA_BYTES=80` → 主机查 60 寄存器时 `data_buf` 越界 40B。~~ ✅ **已修(同日)**:`MB_MAX_READ_REGS 60→40`,40 寄存器 × 2B = 80B 缓冲匹配;全数据块 19 寄存器不受影响
|
||||||
|
2. 协议文档 V1.8 已标注;`DLD154Tool` GUI 若暴露 FC 0x03/0x10/0x11 按钮需同步禁用(三层一致性)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 2026-08-26 — V3.04:0x24 追加 LOOP_MEASURE_BASE 归一化基数(与 DLD110S 对齐)
|
## 2026-08-26 — V3.04:0x24 追加 LOOP_MEASURE_BASE 归一化基数(与 DLD110S 对齐)
|
||||||
|
|
||||||
### 背景
|
### 背景
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# DLD154Pro 产品说明书
|
# DLD154Pro 产品说明书
|
||||||
|
|
||||||
> 单路线圈蓝牙车辆检测器 | 型号: DLD154Pro | 版本: V3.04
|
> 单路线圈蓝牙车辆检测器 | 型号: DLD154Pro | 版本: V3.05
|
||||||
> 适用于停车场、收费站、交通卡口等场景的车辆到达/离开检测
|
> 适用于停车场、收费站、交通卡口等场景的车辆到达/离开检测
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -284,6 +284,7 @@ DLD154Pro 支持两种 RS485 协议,通过 BLE 小程序切换:
|
|||||||
|
|
||||||
| 版本 | 日期 | 说明 |
|
| 版本 | 日期 | 说明 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
|
| V3.05 | 2026-08-27 | **RS485 省 Flash 减配**:Modbus FC 0x03/0x10/0x11 与部分寄存器未实现(协议文档 V1.8 如实标注);700BS 0x3D 不响应;呼吸灯光耦加速步长 32→64;OTA 跳转前延时移除。⚠ 配置类参数写入走 BLE 小程序 |
|
||||||
| V3.04 | 2026-08-26 | 0x24 追加 LOOP_MEASURE_BASE 归一化基数(3B LE=524288);断开次数语义明确为上电持续累计 |
|
| V3.04 | 2026-08-26 | 0x24 追加 LOOP_MEASURE_BASE 归一化基数(3B LE=524288);断开次数语义明确为上电持续累计 |
|
||||||
| V3.03 | 2026-07-31 | 硬件看门狗 (WWDG ~558ms 超时);OTA 安全关闭看门狗 |
|
| V3.03 | 2026-07-31 | 硬件看门狗 (WWDG ~558ms 超时);OTA 安全关闭看门狗 |
|
||||||
| V3.01 | 2026-07-28 | 光耦输出融合模式(6 种);LEDA 同步继电器状态 |
|
| V3.01 | 2026-07-28 | 光耦输出融合模式(6 种);LEDA 同步继电器状态 |
|
||||||
|
|||||||
@@ -134,6 +134,8 @@
|
|||||||
|
|
||||||
### 4.4 查询拨码开关 DIP1–5 设置
|
### 4.4 查询拨码开关 DIP1–5 设置
|
||||||
|
|
||||||
|
> ⚠ **DLD154Pro 实现状态(V3.05 起)**:此命令固件**未实现**(省 Flash 减配,`CMD_QUERY_DIP` 分支已注释),从机不响应。DLD154Pro 无物理拨码,拨码语义由 BLE 配置映射,如需查询请走 BLE 或 Modbus 全数据块。
|
||||||
|
|
||||||
**主机发送:**
|
**主机发送:**
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -194,7 +196,7 @@
|
|||||||
| 0xFA | 主→从 | 查询有车 + 线圈状态 | F5 DATA XOR |
|
| 0xFA | 主→从 | 查询有车 + 线圈状态 | F5 DATA XOR |
|
||||||
| 0x1B | 主→从 | 查询线圈频率 | 14 Fre1-3 ADDR XOR |
|
| 0x1B | 主→从 | 查询线圈频率 | 14 Fre1-3 ADDR XOR |
|
||||||
| 0x2C | 主→从 | 复位初始化线圈 | 无回复 |
|
| 0x2C | 主→从 | 复位初始化线圈 | 无回复 |
|
||||||
| 0x3D | 主→从 | 查询 DIP1-5 | 32 DATA ADDR XOR |
|
| 0x3D | 主→从 | 查询 DIP1-5 | 32 DATA ADDR XOR | ⚠ DLD154Pro 未实现(V3.05 起减配,不响应) |
|
||||||
| 0xAA | 从→主 | 主动心跳上报 | 不回复 |
|
| 0xAA | 从→主 | 主动心跳上报 | 不回复 |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -206,5 +208,5 @@
|
|||||||
| 0xFA 查询状态 | Modbus → DI 0x0000–01 | 等价覆盖 |
|
| 0xFA 查询状态 | Modbus → DI 0x0000–01 | 等价覆盖 |
|
||||||
| 0x1B 查询频率 | Modbus → IR 0x0000–01 | 等价覆盖(32-bit) |
|
| 0x1B 查询频率 | Modbus → IR 0x0000–01 | 等价覆盖(32-bit) |
|
||||||
| 0x2C 复位 | Modbus → HR 0x00FF | 新增命令寄存器 |
|
| 0x2C 复位 | Modbus → HR 0x00FF | 新增命令寄存器 |
|
||||||
| 0x3D 查拨码 | Modbus → IR 0x000C (DIP Virtual) | DLD154Pro 无物理拨码,虚拟映射 |
|
| 0x3D 查拨码 | Modbus → IR 0x000C (DIP Virtual) | ⚠ 未实现(V3.05 起减配,IR 0x000C 与 700BS 0x3D 均不响应) |
|
||||||
| 0xAA 心跳 | Modbus 无等价 | 主从架构限制,靠轮询 DI+IR 补偿 |
|
| 0xAA 心跳 | Modbus 无等价 | 主从架构限制,靠轮询 DI+IR 补偿 |
|
||||||
|
|||||||
@@ -64,9 +64,10 @@
|
|||||||
| 0x0005 | Relay Output | 继电器当前输出状态 | 0=释放, 1=吸合 |
|
| 0x0005 | Relay Output | 继电器当前输出状态 | 0=释放, 1=吸合 |
|
||||||
| 0x0006 | Freq Low Fault | 频率下限异常 (Fre_Err bit0) | 0=正常, 1=频率过低 |
|
| 0x0006 | Freq Low Fault | 频率下限异常 (Fre_Err bit0) | 0=正常, 1=频率过低 |
|
||||||
| 0x0007 | Freq High Fault | 频率上限异常 (Fre_Err bit4) | 0=正常, 1=频率过高 |
|
| 0x0007 | Freq High Fault | 频率上限异常 (Fre_Err bit4) | 0=正常, 1=频率过高 |
|
||||||
| 0x0008 | Init Flag | 复位后首次指示 (Init_B) | 0=正常, 1=复位后首次—上位机读后清零* |
|
| 0x0008 | Init Flag | 复位后首次指示 (Init_B) | 0=正常, 1=复位后首次—上位机读后清零* | ⚠ **未实现**(固件恒为 0) |
|
||||||
|
|
||||||
> **Init Flag 清除机制**:上位机读到 1 后,应发送 **写 HR 0x00FE=0x0001** 清零。参见 §4.7。
|
> **Init Flag 清除机制**:上位机读到 1 后,应发送 **写 HR 0x00FE=0x0001** 清零。参见 §4.7。
|
||||||
|
> ⚠ **实现状态(V1.8 起标注)**:`DI 0x0008` 与 `HR 0x00FE` 固件均**未实现**(DI 恒为 0,HR 无处理分支),此机制仅文档保留。
|
||||||
|
|
||||||
### 3.2 输入寄存器 (Input Registers) — 功能码 0x04
|
### 3.2 输入寄存器 (Input Registers) — 功能码 0x04
|
||||||
|
|
||||||
@@ -78,13 +79,15 @@
|
|||||||
| 0x0003 | CAPVD Lo | uint16 | | 归一化周期值,低 16 位 |
|
| 0x0003 | CAPVD Lo | uint16 | | 归一化周期值,低 16 位 |
|
||||||
| 0x0004 | Origin Hi | uint16 | **2 寄存器** | 基线值 (32-bit),高 16 位 |
|
| 0x0004 | Origin Hi | uint16 | **2 寄存器** | 基线值 (32-bit),高 16 位 |
|
||||||
| 0x0005 | Origin Lo | uint16 | | 基线值,低 16 位 |
|
| 0x0005 | Origin Lo | uint16 | | 基线值,低 16 位 |
|
||||||
| 0x0006 | Variation Hi | int16 | **2 寄存器** | 变化量 = CAPVD − Origin (32-bit 有符号),高 16 位 |
|
| 0x0006 | Variation Hi | int16 | **2 寄存器** | 变化量 = CAPVD − Origin (32-bit 有符号),高 16 位 | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||||
| 0x0007 | Variation Lo | int16 | | 变化量,低 16 位 |
|
| 0x0007 | Variation Lo | int16 | | 变化量,低 16 位 | ⚠ **未实现** |
|
||||||
| 0x0008 | FW Version | uint16 | 1 寄存器 | 固件版本,高字节=主版本,低字节=子版本。例 `0x0300` = v3.00 |
|
| 0x0008 | FW Version | uint16 | 1 寄存器 | 固件版本,高字节=主版本,低字节=子版本。例 `0x0300` = v3.00 | |
|
||||||
| 0x0009 | HW Version | uint16 | 1 寄存器 | 硬件版本。例 `0x0301` = v3.01 |
|
| 0x0009 | HW Version | uint16 | 1 寄存器 | 硬件版本。例 `0x0301` = v3.01 | |
|
||||||
| 0x000A | Freq Sens | uint16 | 1 寄存器 | 当前灵敏度等级 (0=低, 1=中低, 2=中高, 3=高) |
|
| 0x000A | Freq Sens | uint16 | 1 寄存器 | 当前灵敏度等级 (0=低, 1=中低, 2=中高, 3=高) | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||||
| 0x000B | Condition | uint16 | 1 寄存器 | 环境活跃度 (0=安静, 1–100=嘈杂) |
|
| 0x000B | Condition | uint16 | 1 寄存器 | 环境活跃度 (0=安静, 1–100=嘈杂) | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||||
| 0x000C | DIP Virtual | uint16 | 1 寄存器 | 虚拟拨码(700BS 兼容): bit[7:4]=function_mode, bit[3:0]=fusion_mode |
|
| 0x000C | DIP Virtual | uint16 | 1 寄存器 | 虚拟拨码(700BS 兼容): bit[7:4]=function_mode, bit[3:0]=fusion_mode | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||||
|
|
||||||
|
> ⚠ **输入寄存器实现状态(V1.8 起标注)**:`0x0006/0x0007`(Variation)、`0x000A`(Freq Sens)、`0x000B`(Condition)、`0x000C`(DIP Virtual)固件**未实现**(读返回异常 0x02 Illegal Data Address)。读取变化量请用全数据块 `0x010A/0x010B`(见 §3.2.1,仍可用)。
|
||||||
|
|
||||||
### 3.2.1 全数据块 (Input Registers 0x0100+) — 功能码 0x04
|
### 3.2.1 全数据块 (Input Registers 0x0100+) — 功能码 0x04
|
||||||
|
|
||||||
@@ -127,25 +130,27 @@
|
|||||||
|
|
||||||
### 3.3 保持寄存器 (Holding Registers) — 功能码 0x03 / 0x06 / 0x10
|
### 3.3 保持寄存器 (Holding Registers) — 功能码 0x03 / 0x06 / 0x10
|
||||||
|
|
||||||
|
> ⚠ **实现状态(V1.8 起标注)**:功能码 **0x03(读保持寄存器)与 0x10(批量写)固件未实现**(返回异常 0x01 Illegal Function)。保持寄存器**只支持 FC 0x06 写单寄存器**,且仅 `0x0010/0x0011/0x0012` 可写;其余 R/W 寄存器(0x0000–0x0004, 0x0009, 0x000A)因省 Flash 减配**读写均未实现**,只读寄存器(0x0005–0x0008, 0x000B)因 FC 0x03 未实现**读不到**。
|
||||||
|
|
||||||
| 地址 | 名称 | 范围 | 默认 | R/W | 说明 |
|
| 地址 | 名称 | 范围 | 默认 | R/W | 说明 |
|
||||||
|------|------|------|------|-----|------|
|
|------|------|------|------|-----|------|
|
||||||
| 0x0000 | Sensitivity | 0–3 | 1 | R/W | 灵敏度等级 (0=低, 1=中低, 2=中高, 3=高) |
|
| 0x0000 | Sensitivity | 0–3 | 1 | R/W | 灵敏度等级 (0=低, 1=中低, 2=中高, 3=高) | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||||
| 0x0001 | Fusion Mode | 0–6 | 0 | R/W | 输出组合模式(见 §6.5) |
|
| 0x0001 | Fusion Mode | 0–6 | 0 | R/W | 输出组合模式(见 §6.5) | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||||
| 0x0002 | Hold Time | 0–255 | 0 | R/W | 有限存在时间 (×5s), 0=永久存在 |
|
| 0x0002 | Hold Time | 0–255 | 0 | R/W | 有限存在时间 (×5s), 0=永久存在 | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||||
| 0x0003 | Output Delay | 0–255 | 10 | R/W | 离开延时 (×50ms), 例 10=500ms |
|
| 0x0003 | Output Delay | 0–255 | 10 | R/W | 离开延时 (×50ms), 例 10=500ms | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||||
| 0x0004 | Freq Level | 0–1 | 0 | R/W | 线圈频率档: 0=高频, 1=低频 |
|
| 0x0004 | Freq Level | 0–1 | 0 | R/W | 线圈频率档: 0=高频, 1=低频 | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||||
| 0x0005 | RS485 Baud Hi | — | — | **R** | RS485 波特率高 16 位(只读) |
|
| 0x0005 | RS485 Baud Hi | — | — | **R** | RS485 波特率高 16 位(只读) | ⚠ FC 0x03 未实现,读不到 |
|
||||||
| 0x0006 | RS485 Baud Lo | — | — | **R** | RS485 波特率低 16 位(只读) |
|
| 0x0006 | RS485 Baud Lo | — | — | **R** | RS485 波特率低 16 位(只读) | ⚠ FC 0x03 未实现,读不到 |
|
||||||
| 0x0007 | RS485 Addr | 1–247 | 1 | **R** | RS485 从机地址(只读) |
|
| 0x0007 | RS485 Addr | 1–247 | 1 | **R** | RS485 从机地址(只读) | ⚠ FC 0x03 未实现,读不到 |
|
||||||
| 0x0008 | Protocol | 0–1 | 0 | **R** | 当前 RS485 协议: 0=700BS, 1=Modbus |
|
| 0x0008 | Protocol | 0–1 | 0 | **R** | 当前 RS485 协议: 0=700BS, 1=Modbus | ⚠ FC 0x03 未实现,读不到 |
|
||||||
| 0x0009 | BT Timeout | 0–255 | 0 | R/W | 蓝牙空闲关闭超时 (分钟), 0=不关闭 |
|
| 0x0009 | BT Timeout | 0–255 | 0 | R/W | 蓝牙空闲关闭超时 (分钟), 0=不关闭 | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||||
| 0x000A | Safe Timeout | 0–255 | 0 | R/W | 安全模式超时 (×10s), 0=关闭 |
|
| 0x000A | Safe Timeout | 0–255 | 0 | R/W | 安全模式超时 (×10s), 0=关闭 | ⚠ **未实现**(省 Flash 减配,V1.8) |
|
||||||
| 0x000B | Opto Func | 0–1 | 0 | **R** | 光耦功能: 0=雷达输入, 1=复位 |
|
| 0x000B | Opto Func | 0–1 | 0 | **R** | 光耦功能: 0=雷达输入, 1=复位 | ⚠ FC 0x03 未实现,读不到 |
|
||||||
| 0x0010 | Auto Rpt Enable | 0–1 | 0 | R/W | 全数据主动上报: 0=关闭, 1=使能(见 §4.9) |
|
| 0x0010 | Auto Rpt Enable | 0–1 | 0 | R/W | 全数据主动上报: 0=关闭, 1=使能(见 §4.9) | ✅ FC 0x06 可写 |
|
||||||
| 0x0011 | Active Thr | 0–65535 | 10 | R/W | 活动状态阈值: |Variation| ≥ 该值时进入活动上报速率 (150ms) |
|
| 0x0011 | Active Thr | 0–65535 | 10 | R/W | 活动状态阈值: \|Variation\| ≥ 该值时进入活动上报速率 (150ms) | ✅ FC 0x06 可写 |
|
||||||
| 0x0012 | System Cmd | — | — | **W** | 系统指令: 写 `0x2C2C` 触发 MCU 全复位 (等效 700BS 0x2C, 见 §4.7) |
|
| 0x0012 | System Cmd | — | — | **W** | 系统指令: 写 `0x2C2C` 触发 MCU 全复位 (等效 700BS 0x2C, 见 §4.7);读恒 0 | ✅ FC 0x06 可写 |
|
||||||
| 0x00FE | Init Flag Clear | 0–1 | — | **W** | 写 1 清零 Init Flag (DI 0x0008) |
|
| 0x00FE | Init Flag Clear | 0–1 | — | **W** | 写 1 清零 Init Flag (DI 0x0008) | ⚠ **未实现**(固件无此分支) |
|
||||||
| 0x00FF | Device Reset (已废弃) | — | — | **W** | ⚠ V1.7 废弃, 请使用 HR 0x0012=0x2C2C |
|
| 0x00FF | Device Reset (已废弃) | — | — | **W** | ⚠ V1.7 废弃, 请使用 HR 0x0012=0x2C2C | ⚠ 废弃(未实现) |
|
||||||
|
|
||||||
> **只读寄存器 (0x0005–0x0008, 0x000B)**:写操作返回异常 0x02(Illegal Data Address)。
|
> **只读寄存器 (0x0005–0x0008, 0x000B)**:写操作返回异常 0x02(Illegal Data Address)。
|
||||||
> **写入寄存器 (0x00FE, 0x00FF)**:只写不读。读返回 0x0000。写入非魔数值返回异常 0x03。
|
> **写入寄存器 (0x00FE, 0x00FF)**:只写不读。读返回 0x0000。写入非魔数值返回异常 0x03。
|
||||||
@@ -179,6 +184,8 @@
|
|||||||
|
|
||||||
### 4.3 读保持寄存器 — 功能码 0x03
|
### 4.3 读保持寄存器 — 功能码 0x03
|
||||||
|
|
||||||
|
> ⚠ **V1.8 未实现**:固件已禁用 FC 0x03(省 Flash 减配),请求返回异常 `0x83 0x01`(Illegal Function)。保持寄存器只支持 FC 0x06 写(仅 0x0010/0x0011/0x0012),请勿依赖此功能码读取参数。
|
||||||
|
|
||||||
读取全部可读写参数:
|
读取全部可读写参数:
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -205,6 +212,8 @@
|
|||||||
|
|
||||||
### 4.5 批量写寄存器 — 功能码 0x10
|
### 4.5 批量写寄存器 — 功能码 0x10
|
||||||
|
|
||||||
|
> ⚠ **V1.8 未实现**:固件已禁用 FC 0x10(省 Flash 减配),请求返回异常 `0x90 0x01`(Illegal Function)。批量写请改用 FC 0x06 逐条写,或走 BLE 小程序配置。
|
||||||
|
|
||||||
一次写入灵敏度和存在时间(60s):
|
一次写入灵敏度和存在时间(60s):
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -234,6 +243,8 @@
|
|||||||
|
|
||||||
### 4.8 清除 Init Flag — 写 HR 0x00FE
|
### 4.8 清除 Init Flag — 写 HR 0x00FE
|
||||||
|
|
||||||
|
> ⚠ **V1.8 未实现**:固件无 HR 0x00FE 处理分支(且 DI 0x0008 Init Flag 恒为 0),此命令无实际效果,仅文档保留。
|
||||||
|
|
||||||
```
|
```
|
||||||
>>> 01 06 00 FE 00 01 xx xx (写 0x00FE=1)
|
>>> 01 06 00 FE 00 01 xx xx (写 0x00FE=1)
|
||||||
<<< 01 06 00 FE 00 01 xx xx (Init Flag → 0)
|
<<< 01 06 00 FE 00 01 xx xx (Init Flag → 0)
|
||||||
@@ -302,13 +313,13 @@
|
|||||||
|--------|------|------|------|
|
|--------|------|------|------|
|
||||||
| 0x01 | Read Coils | ✗ | 不使用 |
|
| 0x01 | Read Coils | ✗ | 不使用 |
|
||||||
| 0x02 | Read Discrete Inputs | ✓ | 车辆状态、故障、继电器、光耦 |
|
| 0x02 | Read Discrete Inputs | ✓ | 车辆状态、故障、继电器、光耦 |
|
||||||
| 0x03 | Read Holding Registers | ✓ | 读所有配置参数 |
|
| 0x03 | Read Holding Registers | ✗ | ⚠ **V1.8 未实现**(省 Flash 减配,返回异常 0x01) |
|
||||||
| 0x04 | Read Input Registers | ✓ | 读传感器数据 (32-bit 跨双寄存器) |
|
| 0x04 | Read Input Registers | ✓ | 读传感器数据 (32-bit 跨双寄存器);⚠ 0x0006/0x0007/0x000A/0x000B/0x000C 未实现,用 0x0100+ 全数据块 |
|
||||||
| 0x05 | Write Single Coil | ✗ | 不使用 |
|
| 0x05 | Write Single Coil | ✗ | 不使用 |
|
||||||
| 0x06 | Write Single Register | ✓ | 写单个参数 |
|
| 0x06 | Write Single Register | ✓ | 写单个参数;⚠ 仅 0x0010/0x0011/0x0012 有效(V1.8 减配) |
|
||||||
| 0x0F | Write Multiple Coils | ✗ | 不使用 |
|
| 0x0F | Write Multiple Coils | ✗ | 不使用 |
|
||||||
| 0x10 | Write Multiple Registers | ✓ | 批量写参数 |
|
| 0x10 | Write Multiple Registers | ✗ | ⚠ **V1.8 未实现**(省 Flash 减配,返回异常 0x01) |
|
||||||
| 0x11 | Report Slave ID | ✓ | 返回设备型号 + 运行状态 |
|
| 0x11 | Report Slave ID | ✗ | ⚠ **V1.8 未实现**(省 Flash 减配,返回异常 0x01) |
|
||||||
| N/A | **Active Push** | ✓ | 主动上报全数据块(格式同 FC 0x04 响应),需 HR 0x0010=1 使能 |
|
| N/A | **Active Push** | ✓ | 主动上报全数据块(格式同 FC 0x04 响应),需 HR 0x0010=1 使能 |
|
||||||
|
|
||||||
> **主动上报**:非标准 Modbus 功能。设备在 `Auto Rpt Enable=1` 时根据变化量阈值自动调速发送数据帧,帧格式与 FC 0x04 读 0x0100 起 19 个寄存器的响应一致。总线上的其他从机在上报期间保持静默,主机需在接收逻辑中处理非请求响应。
|
> **主动上报**:非标准 Modbus 功能。设备在 `Auto Rpt Enable=1` 时根据变化量阈值自动调速发送数据帧,帧格式与 FC 0x04 读 0x0100 起 19 个寄存器的响应一致。总线上的其他从机在上报期间保持静默,主机需在接收逻辑中处理非请求响应。
|
||||||
@@ -329,9 +340,10 @@ DLD154Pro 算法移植后,`MEASUREMENT_BASE = 524288 (2^19)`(CH591R@60MHz
|
|||||||
|
|
||||||
### 6.3 参数持久化
|
### 6.3 参数持久化
|
||||||
|
|
||||||
- `0x06` 或 `0x10` 写入 Holding Register → 立即更新 RAM → 写入 DataFlash → 返回响应
|
- `0x06`(或 `0x10`,⚠ V1.8 起 0x10 未实现)写入 Holding Register → 立即更新 RAM → 写入 DataFlash → 返回响应
|
||||||
- Flash 写入失败 → 返回异常码 `0x04` (Slave Device Failure)
|
- Flash 写入失败 → 返回异常码 `0x04` (Slave Device Failure)
|
||||||
- 值超出范围(如灵敏度写 5)→ 返回异常码 `0x03` (Illegal Data Value)
|
- 值超出范围(如灵敏度写 5)→ 返回异常码 `0x03` (Illegal Data Value)
|
||||||
|
- ⚠ **V1.8 减配**:写寄存器仅剩 `0x0010`(主动上报使能)/`0x0011`(活动阈值)/`0x0012`(复位)三条有效;灵敏度/融合模式等配置请走 BLE 小程序
|
||||||
|
|
||||||
### 6.4 灵敏度与 ΔL/L 对应关系
|
### 6.4 灵敏度与 ΔL/L 对应关系
|
||||||
|
|
||||||
@@ -456,8 +468,8 @@ DLD154Pro RS485 同时支持 700BS 协议(`g_fm_700bs_disable=0`)和 Modbus
|
|||||||
| | bit5=线圈故障 | DI 0x0001 Loop Fault | ✅ |
|
| | bit5=线圈故障 | DI 0x0001 Loop Fault | ✅ |
|
||||||
| 0x1B 查询频率 | 3 字节 Freq | IR 0x0000–01 Freq (32bit) | ✅ |
|
| 0x1B 查询频率 | 3 字节 Freq | IR 0x0000–01 Freq (32bit) | ✅ |
|
||||||
| 0x2C 复位 | — | **HR 0x0012** 写 0x2C2C | ✅ V1.7: MCU 全复位 (SYS_ResetExecute)
|
| 0x2C 复位 | — | **HR 0x0012** 写 0x2C2C | ✅ V1.7: MCU 全复位 (SYS_ResetExecute)
|
||||||
| 0x3D 查拨码 | DIP1-5 | **IR 0x000C DIP Virtual** | ✅ V1.2 新增 (DLD154Pro 无物理拨码,虚拟映射) |
|
| 0x3D 查拨码 | DIP1-5 | **IR 0x000C DIP Virtual** | ⚠ V1.8 起未实现(IR 0x000C 减配,读返回异常 0x02) |
|
||||||
| 0xAA 心跳 Init_B | A1=首次 | **DI 0x0008 Init Flag** | ✅ V1.2 新增 |
|
| 0xAA 心跳 Init_B | A1=首次 | **DI 0x0008 Init Flag** | ⚠ V1.8 标注:固件恒为 0(未实现) |
|
||||||
| 0xAA 心跳 Fre_Err | bit0=下限异常 | **DI 0x0006 Freq Low Fault** | ✅ V1.2 新增 |
|
| 0xAA 心跳 Fre_Err | bit0=下限异常 | **DI 0x0006 Freq Low Fault** | ✅ V1.2 新增 |
|
||||||
| | bit4=上限异常 | **DI 0x0007 Freq High Fault** | ✅ V1.2 新增 |
|
| | bit4=上限异常 | **DI 0x0007 Freq High Fault** | ✅ V1.2 新增 |
|
||||||
| 0xAA 心跳 主动上报 | 5s/1s/事件 | — | ✅ V1.6: Modbus 新增主动上报 (FC 0x04 响应格式, 800ms/150ms/事件立即) |
|
| 0xAA 心跳 主动上报 | 5s/1s/事件 | — | ✅ V1.6: Modbus 新增主动上报 (FC 0x04 响应格式, 800ms/150ms/事件立即) |
|
||||||
@@ -472,6 +484,7 @@ DLD154Pro RS485 同时支持 700BS 协议(`g_fm_700bs_disable=0`)和 Modbus
|
|||||||
|
|
||||||
| 版本 | 日期 | 作者 | 变更 |
|
| 版本 | 日期 | 作者 | 变更 |
|
||||||
|------|------|------|------|
|
|------|------|------|------|
|
||||||
|
| V1.8 | 2026-08-27 | wangfq | **省 Flash 减配(实现状态如实标注)**:FC 0x03(读保持寄存器)/0x10(批量写)/0x11(Report Slave ID)未实现;IR 0x0006/0x0007(Variation)/0x000A(Freq Sens)/0x000B(Condition)/0x000C(DIP Virtual)未实现(改读全数据块 0x010A/0x010B);HR 0x0000–0x0004/0x0009/0x000A 读写未实现(灵敏度等配置走 BLE);FC 0x06 仅剩 0x0010/0x0011/0x0012 可写;DI 0x0008 Init Flag 与 HR 0x00FE 标注未实现(固件恒 0/无分支) |
|
||||||
| V1.7 | 2026-07-31 | wangfq | 复位指令重构: HR 0x00FF 废弃, 新增 HR 0x0012 (System Cmd); 写 0x2C2C 触发 `SYS_ResetExecute()` MCU 全复位 (对齐 700BS 0x2C 行为); 0x2C2C 对应 700BS CMD_RESET_INIT 的 0x2C; +§4.7 示例更新 |
|
| V1.7 | 2026-07-31 | wangfq | 复位指令重构: HR 0x00FF 废弃, 新增 HR 0x0012 (System Cmd); 写 0x2C2C 触发 `SYS_ResetExecute()` MCU 全复位 (对齐 700BS 0x2C 行为); 0x2C2C 对应 700BS CMD_RESET_INIT 的 0x2C; +§4.7 示例更新 |
|
||||||
| V1.6 | 2026-07-30 | wangfq | 新增主动上报 & 全数据块: +IR 0x0100–0x0112 全数据块(19 reg, 含灵敏度/频率/融合模式/car_state/线圈/光耦/频率/CAPVD/Variation/断开计数/继电器计数/通过时间); +HR 0x0010 上报使能, +HR 0x0011 活动阈值; +§4.9–4.12 命令示例; +§6.7 主动上报机制(3 级速率: 空闲800ms/活动150ms/事件立即); 车间距/通过时间(10ms单位); 700BS 对照表更新 |
|
| V1.6 | 2026-07-30 | wangfq | 新增主动上报 & 全数据块: +IR 0x0100–0x0112 全数据块(19 reg, 含灵敏度/频率/融合模式/car_state/线圈/光耦/频率/CAPVD/Variation/断开计数/继电器计数/通过时间); +HR 0x0010 上报使能, +HR 0x0011 活动阈值; +§4.9–4.12 命令示例; +§6.7 主动上报机制(3 级速率: 空闲800ms/活动150ms/事件立即); 车间距/通过时间(10ms单位); 700BS 对照表更新 |
|
||||||
| V1.5 | 2026-07-30 | wangfq | 枚举再次重排: 且后移 (0=或,1=混行,2=ETC,3=且,4=仅地感,5=仅光耦,6=复位); 模式号引用同步更新 |
|
| V1.5 | 2026-07-30 | wangfq | 枚举再次重排: 且后移 (0=或,1=混行,2=ETC,3=且,4=仅地感,5=仅光耦,6=复位); 模式号引用同步更新 |
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# DLD154Pro 技术规格书
|
# DLD154Pro 技术规格书
|
||||||
|
|
||||||
> 单路线圈蓝牙车辆检测器 | 固件版本: V3.04 | 硬件版本: V3.01
|
> 单路线圈蓝牙车辆检测器 | 固件版本: V3.05 | 硬件版本: V3.01
|
||||||
> 本文档面向工程开发、系统集成及故障深度分析
|
> 本文档面向工程开发、系统集成及故障深度分析
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -555,6 +555,7 @@ Magic | Addr/Sub | Len | CMD | Data | XOR | SUM
|
|||||||
|
|
||||||
| 版本 | 日期 | 说明 |
|
| 版本 | 日期 | 说明 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
|
| V3.05 | 2026-08-27 | **RS485 省 Flash 减配**:Modbus FC 0x03(读保持寄存器)/0x10(批量写)/0x11(Report Slave ID)未实现;IR 0x0006/0x0007/0x000A/0x000B/0x000C 未实现(Variation 走全数据块 0x010A/0x010B);HR 0x0000–0x0004/0x0009/0x000A 读写未实现;FC 0x06 仅 0x0010/0x0011/0x0012 有效;700BS 0x3D 不响应。协议文档 rs485-modbus V1.8 / 700BS 同步标注。呼吸灯光耦加速步长 32→64;OTA 跳转前延时移除 |
|
||||||
| V3.04 | 2026-08-26 | 0x24 响应追加 LOOP_MEASURE_BASE 归一化基数(3B LE=524288,variation 换算 ΔL/L 用);断开次数语义明确为上电持续累计 |
|
| V3.04 | 2026-08-26 | 0x24 响应追加 LOOP_MEASURE_BASE 归一化基数(3B LE=524288,variation 换算 ΔL/L 用);断开次数语义明确为上电持续累计 |
|
||||||
| V3.03 | 2026-07-31 | 硬件看门狗 WWDG (~558ms 超时, 5ms tick + 500ms 喂狗);OTA 安全关闭看门狗 |
|
| V3.03 | 2026-07-31 | 硬件看门狗 WWDG (~558ms 超时, 5ms tick + 500ms 喂狗);OTA 安全关闭看门狗 |
|
||||||
| V3.02 | 2026-07-31 | Modbus RTU 协议 + 主动上报;0x2C/HR 0x0012 复位改为 `SYS_ResetExecute()`;`g_loop_cut_amount` 累加修复;RS485 初始化时序调整 |
|
| V3.02 | 2026-07-31 | Modbus RTU 协议 + 主动上报;0x2C/HR 0x0012 复位改为 `SYS_ResetExecute()`;`g_loop_cut_amount` 累加修复;RS485 初始化时序调整 |
|
||||||
|
|||||||
Reference in New Issue
Block a user