fix(V4B): V4.36.14 — 重连确认窗漏网路径修复 (主循环拍级上升沿)

现场 21µH: 三段重连仅无窗段跳 (无 reconnect/blank 打印直接 Car_In)
根因: 上升沿用 ISR LOOP_OK0(5ms), 断开时主循环 150ms 慢 tick,
插头抖动可致 LOOP_OK0 卡 1 → 恢复漏触发确认窗 → CAPVD 不重置直接判定
→ 插回瞬态假有车. 干净断开重连走窗则被抑制(验证 2/3 段无跳)
改动: loop_task while 顶部 g_prev_ok 主循环拍级(10ms)上升沿检测,
任何 0→1 恢复强制进确认窗+blank; 抖动免疫保留; LOOP_OK0 仅供安全复位
语法0 error, 4测试全绿; spec V2.30 / devlog V2.48
This commit is contained in:
wangfq
2026-09-04 14:00:32 +08:00
parent 66f4aaffc6
commit 75b1ee8acb
4 changed files with 57 additions and 9 deletions
+38
View File
@@ -4,6 +4,43 @@
--- ---
## 2026-09-03 — 重连确认窗漏网路径修复(固件 V4.36.14)
> **固件版本:V4.36.14**cmcng.hFIRMWARE_VER="4.36.14"REV=14)。devlog 修订 V2.48。
### 现场复现(用户 21µH/164kHz 线圈, 临时改 LO 抑制 3000ms 测试)
日志三段重连仅第一段跳:disconnect(cnt=1) → 4s 后 enter_try/Car_In/Car_OFF(1.96s)
**前后无 reconnect confirmed / reconn_blank 打印** → 假车没走抑制窗。
### 根因:确认窗漏网路径(LOOP_OK0 拍级竞态)
重连上升沿用 ISR(5ms) 维护的 `loop1_LOOP_OK0`,而主循环断开时 150ms 慢 tick
插头抖动(断开↔恢复数拍)可使 LOOP_OK0 停在 1 → 恢复时 `!LOOP_OK0` 不触发
→ 跳过 candidate/确认窗/blank → CAPVD 不重置、直接正常判定 → 插回瞬态
(CAPVD 大跌 700+ counts) 判假车跳输出。干净断开→干净重连则走窗被抑制(②③无跳)。
### 改动
loop_task while 顶部**主循环拍级(10ms)自身上升沿检测**:
```c
if (loop1_LOOP_OK && !g_prev_ok) { g_prev_ok = 1; candidate=1; cnt=0; }
else if (!loop1_LOOP_OK) g_prev_ok = 0;
```
任何 0→1 恢复(无论 LOOP_OK0 状态)都强制进确认窗 + blank 抑制;
确认窗内掉线仍取消候选(抖动免疫保留)。ISR LOOP_OK0 维护保留(供安全复位路径,不再驱动候选)。
### 验证
- 语法 0 error;4 组单测全 PASS(重连在主循环,无单测耦合;待板级验证)
### 待板级验证
1. 21µH(或 46µH) 快速抖动拔插:每次恢复都应看到 `loop_reconnect confirmed` + `reconn_blank`
无直接 Car_In 跳输出(尤其"断开几拍又恢复"的抖动场景)
2. 正常拔插重连:行为同 V4.36.13(100ms 确认 + 分档抑制)
3. 抑制窗值:git 基线 LO=1500ms(用户临时 3000 是否转正待定)
## 2026-09-03 — 一长一短 灭 100→300ms(固件 V4.36.13 ## 2026-09-03 — 一长一短 灭 100→300ms(固件 V4.36.13
> **固件版本:V4.36.13**cmcng.hFIRMWARE_VER="4.36.13"REV=13)。devlog 修订 V2.47。 > **固件版本:V4.36.13**cmcng.hFIRMWARE_VER="4.36.13"REV=13)。devlog 修订 V2.47。
@@ -1747,6 +1784,7 @@ if (dev >= dlt_ORG × 4) {
| 版本 | 时间 | 说明 | | 版本 | 时间 | 说明 |
|------|------|------| |------|------|------|
| V2.48 | 2026-09-03 | V4.36.14 重连确认窗漏网路径修复: 主循环拍级上升沿检测替代 ISR LOOP_OK0 |
| V2.47 | 2026-09-03 | V4.36.13 一长一短 灭 100→300ms (dur 180/60/20/140, 周期2.0s) | | V2.47 | 2026-09-03 | V4.36.13 一长一短 灭 100→300ms (dur 180/60/20/140, 周期2.0s) |
| V2.46 | 2026-09-03 | V4.36.12 一长一短长亮 300→900ms (dur 180/20/20/140, 周期1.8s) | | V2.46 | 2026-09-03 | V4.36.12 一长一短长亮 300→900ms (dur 180/20/20/140, 周期1.8s) |
| V2.45 | 2026-09-03 | V4.36.11 低Q 重连抑制窗 400→1500ms (分档 200/300/1500ms) | | V2.45 | 2026-09-03 | V4.36.11 低Q 重连抑制窗 400→1500ms (分档 200/300/1500ms) |
+2 -1
View File
@@ -1,6 +1,6 @@
# DLD154V4B 技术规格书 # DLD154V4B 技术规格书
> 单路线圈车辆检测器 | 固件版本: V4.36.13 | 文档版本: V2.29 > 单路线圈车辆检测器 | 固件版本: V4.36.14 | 文档版本: V2.30
> 本文档面向工程开发、系统集成及故障深度分析 > 本文档面向工程开发、系统集成及故障深度分析
--- ---
@@ -795,3 +795,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的
| V2.27 | 2026-09-03 | **V4.36.11 低Q 重连抑制窗 400→1500ms**Q 分档抑制 高200/中300/**低1500**ms | | V2.27 | 2026-09-03 | **V4.36.11 低Q 重连抑制窗 400→1500ms**Q 分档抑制 高200/中300/**低1500**ms |
| V2.28 | 2026-09-03 | **V4.36.12 黄灯一长一短 长亮 300→900ms**dur {60,20,20,140}→{180,20,20,140}(总周期 1.8s),灭100/短亮100/灭700 不变 | | V2.28 | 2026-09-03 | **V4.36.12 黄灯一长一短 长亮 300→900ms**dur {60,20,20,140}→{180,20,20,140}(总周期 1.8s),灭100/短亮100/灭700 不变 |
| V2.29 | 2026-09-03 | **V4.36.13 一长一短 灭 100→300ms**dur {180,20,20,140}→{180,60,20,140}=900/300/100/700ms(总周期 2.0s | | V2.29 | 2026-09-03 | **V4.36.13 一长一短 灭 100→300ms**dur {180,20,20,140}→{180,60,20,140}=900/300/100/700ms(总周期 2.0s |
| V2.30 | 2026-09-03 | **V4.36.14 重连确认窗漏网路径修复**:主循环拍级自身上升沿检测(g_prev_ok)替代 ISR LOOP_OK0——插头抖动致 LOOP_OK0 卡 1 时恢复不再漏触发确认窗(现场 21µH 无窗直接 Car_In 复现);LO 抑制窗仍 1500ms(用户临时 3000 未入库) |
+2 -2
View File
@@ -14,11 +14,11 @@
#define __CMCNG_H__ #define __CMCNG_H__
#define PRODUCT_MODEL "DLD154" #define PRODUCT_MODEL "DLD154"
#define FIRMWARE_VER "4.36.13" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定) #define FIRMWARE_VER "4.36.14" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
#define HARDWARE_VER "3.00" #define HARDWARE_VER "3.00"
#define FIRMWARE_VER_MAIN 4 #define FIRMWARE_VER_MAIN 4
#define FIRMWARE_VER_SUB 36 #define FIRMWARE_VER_SUB 36
#define FIRMWARE_VER_REV 13 #define FIRMWARE_VER_REV 14
#define HARDWARE_VER_MAIN 3 #define HARDWARE_VER_MAIN 3
#define HARDWARE_VER_SUB 0 #define HARDWARE_VER_SUB 0
@@ -161,6 +161,7 @@ uint16_t g_relay_hold_cnt = 0; // V4.36.3: 有车断开继电器保持
uint8_t g_relay_hold_done = 0; // V4.36.3: 本次有车断开已兜底释放(防重复OFF) uint8_t g_relay_hold_done = 0; // V4.36.3: 本次有车断开已兜底释放(防重复OFF)
uint16_t g_reconn_blank_ms = 0; // V4.36.5: 重连起振抑制倒计时(ms, 按Q分档, vd1_task 每样本-10) uint16_t g_reconn_blank_ms = 0; // V4.36.5: 重连起振抑制倒计时(ms, 按Q分档, vd1_task 每样本-10)
uint8_t g_entry_need = 3; // V4.36.8: 进入确认样本数 (按Q档, 高3/中4/低5) uint8_t g_entry_need = 3; // V4.36.8: 进入确认样本数 (按Q档, 高3/中4/低5)
uint8_t g_prev_ok = 0; // V4.36.14: loop_task 主循环拍级上一拍 LOOP_OK (自身上升沿检测)
uint8_t g_release_need = 3; // V4.36.8: 释放确认样本数 (按Q档, 高3/中4/低5) uint8_t g_release_need = 3; // V4.36.8: 释放确认样本数 (按Q档, 高3/中4/低5)
uint8_t g_fault_phase = 0; uint8_t g_fault_phase = 0;
uint16_t g_fault_tick = 0; uint16_t g_fault_tick = 0;
@@ -1354,16 +1355,24 @@ void loop_task_function(void *pvParameters)
INIT_VD(); INIT_VD();
while (1) { while (1) {
/*--- V4.36.14: 主循环拍级 RF 上升沿检测 (不依赖 ISR LOOP_OK0) ---
* !LOOP_OK0 ISR 5ms 150ms tick :
* ()使 LOOP_OK0 1
* CAPVD "有车" ( 21µH )
* 10ms LOOP_OK: 01 */
if (loop1_LOOP_OK && !g_prev_ok) {
g_prev_ok = 1;
g_reconn_candidate = 1;
g_reconn_cnt = 0;
} else if (!loop1_LOOP_OK) {
g_prev_ok = 0;
}
if (loop1_LOOP_OK) { if (loop1_LOOP_OK) {
/*--- 线圈重连: V4.36.2 确认窗 (载波连续恢复 ~100ms 才确认重置) --- /*--- 线圈重连: V4.36.2 确认窗 (载波连续恢复 ~100ms 才确认重置) ---
* RF 沿; g_disconnect_active=1 , * RF 沿(); g_disconnect_active=1 ,
* ; ()线 . * ; ()线 .
* : / CAPVD (, ) */ * : / CAPVD (, ) */
if (!loop1_LOOP_OK0) {
loop1_LOOP_OK0 = 1;
g_reconn_candidate = 1;
g_reconn_cnt = 0;
}
if (g_reconn_candidate) { if (g_reconn_candidate) {
g_reconn_cnt++; g_reconn_cnt++;
if (g_reconn_cnt >= RECONNECT_CONFIRM_TICKS) { if (g_reconn_cnt >= RECONNECT_CONFIRM_TICKS) {