Compare commits

...

4 Commits

Author SHA1 Message Date
wangfq
3580f89552 feat: role COMMENT 增加 analyst 角色 2026-06-11 17:21:42 +08:00
wangfq
25aafd57c8 feat: V2.3.0 role COMMENT 增加 manager 角色,DDL + ALTER TABLE 迁移 2026-06-11 09:00:27 +08:00
wangfq
cdddfac609 fix: 0xB4 继电器 relay_out 字段与 0xB2 使用相同格式
之前 insert_wave_data 的 relay_out 被硬编码为空字符串,
decode_relay_info 的计算结果未写入。现在增加参数 relay_out
并传入格式化后的继电器状态字符串。
2026-06-10 17:27:38 +08:00
wangfq
944870496a fix: 继电器输出状态解析改为完整的 有/无 描述格式
旧格式: '存在信号; 脉冲信号' (仅显示置位的 bit)
新格式: '存在继电器有输出,脉冲继电器有输出' (始终显示两个 bit 的状态)

bit 0 (x & 0x01): 存在继电器有/无输出
bit 1 (x & 0x02): 脉冲继电器有/无输出
2026-06-10 16:25:31 +08:00
3 changed files with 24 additions and 9 deletions

View File

@@ -280,12 +280,16 @@ def decode_fault_info(fault: int) -> str:
def decode_relay_info(relay: int) -> str:
"""解码继电器 bitmask"""
items = []
for bit, desc in RELAY_BITS.items():
if relay & (1 << bit):
items.append(desc)
return "; ".join(items) if items else "输出"
"""解码继电器输出状态为可读字符串
0xB2 继电器输出状态原始值 x 的解析规则:
- x & 0x01 为真 → "存在继电器有输出",否则 "存在继电器无输出"
- x & 0x02 为真 → "脉冲继电器有输出",否则 "脉冲继电器无输出"
汇总格式: "存在继电器有输出,脉冲继电器有输出"
"""
exist = "存在继电器有输出" if (relay & 0x01) else "存在继电器无输出"
pulse = "脉冲继电器有输出" if (relay & 0x02) else "脉冲继电器无输出"
return f"{exist}{pulse}"
# ─── 0x4A 获取设备版本号响应 ──────────────────────────────────────

View File

@@ -387,6 +387,7 @@ async def parse_loop():
dpg430_addr=wave.addr,
remain_count=wave.remain_count,
relay_code=wave.relay_out,
relay_out=relay_info,
work_freq=wave.work_freq,
curr_dist=wave.curr_dist,
speed=wave.speed,

View File

@@ -152,7 +152,7 @@ async def _create_tables(pool: aiomysql.Pool):
`id` INT AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(45) UNIQUE NOT NULL,
`password_hash` VARCHAR(256) NOT NULL,
`role` VARCHAR(20) DEFAULT 'operator' COMMENT 'admin/operator',
`role` VARCHAR(20) DEFAULT 'operator' COMMENT 'admin/manager/operator/analyst',
`is_active` TINYINT DEFAULT 1,
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
@@ -344,6 +344,15 @@ async def _create_tables(pool: aiomysql.Pool):
except Exception:
pass
# V2.3.0 迁移tb_user 角色增加 manager
try:
await cur.execute(
"ALTER TABLE tb_user MODIFY COLUMN `role` VARCHAR(20) DEFAULT 'operator' "
"COMMENT 'admin/manager/operator/analyst'"
)
except Exception:
pass
logger.info("数据库表初始化完成")
@@ -522,7 +531,8 @@ 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):
enter_dist: int, leave_dist: int,
relay_out: str = ""):
"""插入 0xB4 波动测试上报数据到 tb_state_tst"""
coil_id, simulate_car_id = await get_fixture_coil_car_ids(dnt_id)
dev_type = await get_fixture_dev_type(dnt_id)
@@ -542,7 +552,7 @@ async def insert_wave_data(dnt_id: int, dpg430_addr: int,
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""",
(dnt_id, dpg430_addr, dev_type, str_type,
1, "B4",
"", relay_code,
relay_out, relay_code,
remain_count, work_freq, curr_dist, speed,
near_dist, far_dist, enter_dist, leave_dist,
coil_id, simulate_car_id),