feat: DG430 V2.0.3 — 波动测试模式 前端+后端同步

edc_server:
  - dg430.py: 新增0xB4解析; 0x4C扩展6字段(向后兼容)
  - models.py: tb_fixture_param DDL + upsert 新增6字段
  - handlers.py: parse_loop 添加0xB4处理; 0x4C传参扩展

edc-web:
  - fixture.py: build_4b_packet() 新增6个波动参数
  - models.py: upsert_fixture_param 字段列表扩展
  - fixture.html: 新增波动测试参数输入区(6字段)
  - fixture.js: getFormParams/fillForm/saveToDb/sendConfig 全部扩展
This commit is contained in:
wangfq
2026-06-02 18:06:14 +08:00
parent e7607481e1
commit ef796f6213
5 changed files with 71 additions and 7 deletions

View File

@@ -417,6 +417,7 @@ def upsert_fixture_param(dnt_id: int, **kwargs):
fields = [
"Addr", "DevType", "TestMode", "RestDis", "MinusDis",
"SensMin", "SensMax", "FreMin", "FreMax", "PeakMin", "PeakMax",
"FarTol", "NearTol", "StepTol", "BackForth", "NearStay", "FarStay",
]
if existing:
sets = ", ".join(f"`{f}`=%s" for f in fields)

View File

@@ -59,13 +59,18 @@ def build_4b_packet(addr: int, dev_type: int, test_mode: int,
reset_dis: int, minus_dis: int,
sens_min: int, sens_max: int,
fre_min: int, fre_max: int,
peak_min: int, peak_max: int) -> str:
"""构造 0x4B 配置指令 hex 字符串
peak_min: int, peak_max: int,
far_tol: int = 0, near_tol: int = 0,
step_tol: int = 0, back_forth: int = 0,
near_stay: int = 0, far_stay: int = 0) -> str:
"""构造 0x4B 配置指令 hex 字符串 (V2.0.3 扩展)
格式: 7F | 81 | 12 | 4B | Addr(1) | DevType(1) | TestMode(1) |
格式: 7F | 81 | 17 | 4B | Addr(1) | DevType(1) | TestMode(1) |
ResetDis(1) | MinusDis(1) |
SensMin(2 LE) | SensMax(2 LE) | FreMin(2 LE) | FreMax(2 LE) |
PeakMin(2 LE) | PeakMax(2 LE) | XOR | SUM
PeakMin(2 LE) | PeakMax(2 LE) |
FarTol(1) | NearTol(1) | StepTol(1) | BackForth(1) |
NearStay(2 LE) | FarStay(2 LE) | XOR | SUM
"""
payload = bytes([
0x4B, # CMD
@@ -78,6 +83,14 @@ def build_4b_packet(addr: int, dev_type: int, test_mode: int,
payload += (_le16(sens_min) + _le16(sens_max) +
_le16(fre_min) + _le16(fre_max) +
_le16(peak_min) + _le16(peak_max))
# V2.0.3 波动参数
payload += bytes([
far_tol & 0xFF,
near_tol & 0xFF,
step_tol & 0xFF,
back_forth & 0xFF,
])
payload += _le16(near_stay) + _le16(far_stay)
pkt = bytes([0x7F, 0x81, len(payload)]) + payload
xor, total = _xor_sum(pkt[1:])
@@ -118,7 +131,7 @@ def api_fixture_command():
target = f"{device['serial']}" if device else f"dnt_id={dnt_id}"
if cmd == "4B":
# 动态构造 0x4B 指令
# 动态构造 0x4B 指令 (V2.0.3)
params = data.get("params", {})
send_pkg = build_4b_packet(
addr=params.get("addr", 1),
@@ -132,6 +145,12 @@ def api_fixture_command():
fre_max=params.get("fre_max", 0),
peak_min=params.get("peak_min", 0),
peak_max=params.get("peak_max", 0),
far_tol=params.get("far_tol", 0),
near_tol=params.get("near_tol", 0),
step_tol=params.get("step_tol", 0),
back_forth=params.get("back_forth", 0),
near_stay=params.get("near_stay", 0),
far_stay=params.get("far_stay", 0),
)
elif cmd in FIXTURE_COMMANDS:
send_pkg = FIXTURE_COMMANDS[cmd]

View File

@@ -144,6 +144,12 @@ function fillFormFromParam(param) {
document.getElementById("param-fre-max").value = param.FreMax || 0;
document.getElementById("param-peak-min").value = param.PeakMin || 0;
document.getElementById("param-peak-max").value = param.PeakMax || 0;
document.getElementById("param-far-tol").value = param.FarTol || 0;
document.getElementById("param-near-tol").value = param.NearTol || 0;
document.getElementById("param-step-tol").value = param.StepTol || 0;
document.getElementById("param-back-forth").value = param.BackForth || 0;
document.getElementById("param-near-stay").value = param.NearStay || 0;
document.getElementById("param-far-stay").value = param.FarStay || 0;
const matched = baseTests.find(t => t.type_num === param.DevType);
if (matched) { selectedBaseTest = matched; renderBaseTestTable(); }
}
@@ -172,6 +178,9 @@ async function saveToDb() {
SensMin: data.sens_min, SensMax: data.sens_max,
FreMin: data.fre_min, FreMax: data.fre_max,
PeakMin: data.peak_min, PeakMax: data.peak_max,
FarTol: data.far_tol, NearTol: data.near_tol,
StepTol: data.step_tol, BackForth: data.back_forth,
NearStay: data.near_stay, FarStay: data.far_stay,
}),
});
const result = await resp.json();
@@ -197,6 +206,12 @@ function getFormParams() {
fre_max: parseInt(document.getElementById("param-fre-max").value) || 0,
peak_min: parseInt(document.getElementById("param-peak-min").value) || 0,
peak_max: parseInt(document.getElementById("param-peak-max").value) || 0,
far_tol: parseInt(document.getElementById("param-far-tol").value) || 0,
near_tol: parseInt(document.getElementById("param-near-tol").value) || 0,
step_tol: parseInt(document.getElementById("param-step-tol").value) || 0,
back_forth: parseInt(document.getElementById("param-back-forth").value) || 0,
near_stay: parseInt(document.getElementById("param-near-stay").value) || 0,
far_stay: parseInt(document.getElementById("param-far-stay").value) || 0,
};
}
@@ -318,6 +333,9 @@ async function sendConfig() {
SensMin: params.sens_min, SensMax: params.sens_max,
FreMin: params.fre_min, FreMax: params.fre_max,
PeakMin: params.peak_min, PeakMax: params.peak_max,
FarTol: params.far_tol, NearTol: params.near_tol,
StepTol: params.step_tol, BackForth: params.back_forth,
NearStay: params.near_stay, FarStay: params.far_stay,
}),
});
} else {

View File

@@ -27,7 +27,7 @@
<label>测试模式</label>
<select id="param-test-mode">
<option value="0">0 - 灵敏度测试模式</option>
<option value="1">1 - 模拟过车模式</option>
<option value="1">1 - 波动测试模式</option>
</select>
</div>
<div class="form-group">
@@ -68,6 +68,32 @@
<label>峰峰值最大值</label>
<input type="number" id="param-peak-max" value="0">
</div>
<div class="form-group"><hr style="border-color:#eee; margin:2px 0;"></div>
<h4 style="margin:8px 0 4px 0; color:#e67e22; font-size:13px;">⚡ 波动测试参数 (TestMode=1 时生效)</h4>
<div class="form-group">
<label>最远容差 (cm)</label>
<input type="number" id="param-far-tol" value="0" min="0" max="255">
</div>
<div class="form-group">
<label>最近容差 (cm)</label>
<input type="number" id="param-near-tol" value="0" min="0" max="255">
</div>
<div class="form-group">
<label>步进容差 (cm)</label>
<input type="number" id="param-step-tol" value="0" min="0" max="255">
</div>
<div class="form-group">
<label>来回次数</label>
<input type="number" id="param-back-forth" value="0" min="0" max="255">
</div>
<div class="form-group">
<label>最近停留时间 (ms)</label>
<input type="number" id="param-near-stay" value="0" min="0" max="65535">
</div>
<div class="form-group">
<label>最远停留时间 (ms)</label>
<input type="number" id="param-far-stay" value="0" min="0" max="65535">
</div>
</div>
<div class="fixture-actions">