Compare commits

...

1 Commits

Author SHA1 Message Date
wangfq
844de70017 feat: relay_code 存储+解析 — B2/B4 以原始 int 值写入 tb_state_tst
- insert_test_result 增加 relay_code 参数
- insert_wave_data: relay_out 改为 relay_code (int)
- handlers.py: B2/B4 解析传递 status.relay_out 原始值
- relay_out VARCHAR 列保留兼容
2026-06-05 17:56:52 +08:00
2 changed files with 86 additions and 4 deletions

View File

@@ -22,6 +22,7 @@ from src.models import (
fetch_unparsed_serial,
mark_record_state,
insert_test_result,
insert_wave_data,
get_dnt_by_serial,
get_pending_serialnet,
mark_serialnet_sent,
@@ -285,6 +286,8 @@ async def parse_loop():
exit_dist=status.exit_dist,
enter_speed=status.enter_speed,
exit_speed=status.exit_speed,
test_mode=status.test_mode,
relay_code=status.relay_out,
)
# 匹配 tb_serialnet 中的待确认记录
@@ -351,6 +354,19 @@ async def parse_loop():
continue
relay_info = decode_relay_info(wave.relay_out)
await insert_wave_data(
dnt_id=dnt_id,
dpg430_addr=wave.addr,
remain_count=wave.remain_count,
relay_code=wave.relay_out,
work_freq=wave.work_freq,
curr_dist=wave.curr_dist,
speed=wave.speed,
near_dist=wave.near_dist,
far_dist=wave.far_dist,
enter_dist=wave.enter_dist,
leave_dist=wave.leave_dist,
)
logger.info(
f"B4波动上报: {device_id} 剩余={wave.remain_count} "
f"当前距离={wave.curr_dist}mm 速度={wave.speed}dm/s "

View File

@@ -105,6 +105,8 @@ async def _create_tables(pool: aiomysql.Pool):
`serialnum` INT DEFAULT 0 COMMENT '流水号',
`sub_type` TINYINT DEFAULT 0 COMMENT '1 DLD110, 2 PD132',
`str_type` VARCHAR(30) DEFAULT '',
`test_mode` TINYINT DEFAULT 0 COMMENT '0 灵敏度测试, 1 波动测试',
`data_source` CHAR(2) DEFAULT 'B2' COMMENT '数据来源 B2/B4',
`iffinish` VARCHAR(5) DEFAULT '' COMMENT '是否完成',
`fault_info` VARCHAR(100) DEFAULT '',
`relay_out` VARCHAR(24) DEFAULT '',
@@ -116,6 +118,15 @@ async def _create_tables(pool: aiomysql.Pool):
`exit_dist` INT DEFAULT 0,
`enter_speed` INT DEFAULT 0,
`exit_speed` INT DEFAULT 0,
`remain_count` INT DEFAULT 0 COMMENT '剩余波动次数 (B4)',
`work_freq` FLOAT DEFAULT 0 COMMENT '工作频率 Hz (B4)',
`curr_dist` INT DEFAULT 0 COMMENT '当前距离 mm (B4)',
`speed` INT DEFAULT 0 COMMENT '当前速度 dm/s (B4)',
`near_dist` INT DEFAULT 0 COMMENT '波动最近距离 mm (B4)',
`far_dist` INT DEFAULT 0 COMMENT '波动最远距离 mm (B4)',
`b4_enter_dist` INT DEFAULT 0 COMMENT 'B4 进入高度 mm',
`b4_leave_dist` INT DEFAULT 0 COMMENT 'B4 离开高度 mm',
`relay_code` TINYINT DEFAULT 0 COMMENT '继电器原始值 (0x00-0x03)',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX `idx_dnt_id` (`dnt_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
@@ -191,6 +202,27 @@ async def _create_tables(pool: aiomysql.Pool):
except Exception:
pass # 列已存在,忽略
# V2.0.4 迁移tb_state_tst 增加波动测试字段
for col, col_def in [
("test_mode", "TINYINT DEFAULT 0 COMMENT '0 灵敏度, 1 波动测试'"),
("data_source", "CHAR(2) DEFAULT 'B2' COMMENT 'B2/B4'"),
("remain_count", "INT DEFAULT 0 COMMENT '剩余波动次数'"),
("work_freq", "FLOAT DEFAULT 0 COMMENT '工作频率 Hz'"),
("curr_dist", "INT DEFAULT 0 COMMENT '当前距离 mm'"),
("speed", "INT DEFAULT 0 COMMENT '当前速度 dm/s'"),
("near_dist", "INT DEFAULT 0 COMMENT '波动最近距离 mm'"),
("far_dist", "INT DEFAULT 0 COMMENT '波动最远距离 mm'"),
("b4_enter_dist", "INT DEFAULT 0 COMMENT 'B4 进入高度 mm'"),
("b4_leave_dist", "INT DEFAULT 0 COMMENT 'B4 离开高度 mm'"),
("relay_code", "TINYINT DEFAULT 0 COMMENT '继电器原始值 0x00-0x03'"),
]:
try:
await cur.execute(
f"ALTER TABLE `tb_state_tst` ADD COLUMN `{col}` {col_def}"
)
except Exception:
pass
# 7. 车检器测试基准参数表
await cur.execute("""
CREATE TABLE IF NOT EXISTS `tb_vechicle_base_test` (
@@ -349,7 +381,9 @@ async def insert_test_result(dnt_id: int, dpg430_addr: int, pcnum: str,
iffinish: str, fault_info: str, relay_out: str,
ppvalue: float, idle_freq: float, enter_freq: float,
exit_freq: float, enter_dist: int, exit_dist: int,
enter_speed: int, exit_speed: int):
enter_speed: int, exit_speed: int,
test_mode: int = 0, data_source: str = "B2",
relay_code: int = 0):
"""插入测试结果到 tb_state_tst"""
pool = await get_pool()
async with pool.acquire() as conn:
@@ -357,12 +391,44 @@ async def insert_test_result(dnt_id: int, dpg430_addr: int, pcnum: str,
await cur.execute(
"""INSERT INTO tb_state_tst
(dnt_id, dpg430_addr, pcnum, serialnum, sub_type, str_type,
test_mode, data_source,
iffinish, fault_info, relay_out, ppvalue, idle_freq,
enter_freq, exit_freq, enter_dist, exit_dist, enter_speed, exit_speed)
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""",
enter_freq, exit_freq, enter_dist, exit_dist, enter_speed, exit_speed,
relay_code)
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""",
(dnt_id, dpg430_addr, pcnum, serialnum, sub_type, str_type,
test_mode, data_source,
iffinish, fault_info, relay_out, ppvalue, idle_freq,
enter_freq, exit_freq, enter_dist, exit_dist, enter_speed, exit_speed),
enter_freq, exit_freq, enter_dist, exit_dist, enter_speed, exit_speed,
relay_code),
)
async def insert_wave_data(dnt_id: int, dpg430_addr: int,
remain_count: int, relay_code: int,
work_freq: float, curr_dist: int, speed: int,
near_dist: int, far_dist: int,
enter_dist: int, leave_dist: int):
"""插入 0xB4 波动测试上报数据到 tb_state_tst"""
pool = await get_pool()
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(
"""INSERT INTO tb_state_tst
(dnt_id, dpg430_addr, test_mode, data_source,
relay_out, relay_code,
remain_count, work_freq, curr_dist, speed,
near_dist, far_dist, b4_enter_dist, b4_leave_dist)
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""",
(dnt_id, dpg430_addr, 1, "B4",
"", relay_code,
remain_count, work_freq, curr_dist, speed,
near_dist, far_dist, enter_dist, leave_dist),
)
logger.info(
f"B4波动数据已存储 dnt_id={dnt_id} relay=0x{relay_code:02X} "
f"剩余={remain_count} 当前距离={curr_dist}mm 速度={speed}dm/s"
f" 最近={near_dist}mm 最远={far_dist}mm"
)