From 844de7001790727568fb27a1e6d5c4491864da9d Mon Sep 17 00:00:00 2001 From: wangfq Date: Fri, 5 Jun 2026 17:56:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20relay=5Fcode=20=E5=AD=98=E5=82=A8+?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=20=E2=80=94=20B2/B4=20=E4=BB=A5=E5=8E=9F?= =?UTF-8?q?=E5=A7=8B=20int=20=E5=80=BC=E5=86=99=E5=85=A5=20tb=5Fstate=5Fts?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - insert_test_result 增加 relay_code 参数 - insert_wave_data: relay_out 改为 relay_code (int) - handlers.py: B2/B4 解析传递 status.relay_out 原始值 - relay_out VARCHAR 列保留兼容 --- src/handlers.py | 16 +++++++++++ src/models.py | 74 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 86 insertions(+), 4 deletions(-) diff --git a/src/handlers.py b/src/handlers.py index dd07bcb..66533bf 100644 --- a/src/handlers.py +++ b/src/handlers.py @@ -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 " diff --git a/src/models.py b/src/models.py index 5fc1fe3..e7464a1 100644 --- a/src/models.py +++ b/src/models.py @@ -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,15 +391,47 @@ 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" + ) + + async def set_device_offline(serial: str): """标记设备离线""" pool = await get_pool()