hero-image

New Version: Current Monitor v1.0.0


Current Monitor 发布了 v1.0.0。这次更新有两条主线:让程序真正融入实验现场——与 DAQ 获取系统自动联动,启停、命名、保存全程免手动;以及一次不留死角的代码体检——从 Modbus 帧校验到电荷积分,把几个潜伏已久的正确性问题连根拔掉。

Current Monitor 是配合”創鴻 DM4D-An-Rs”高精度盘面表的双通道电流实时监控软件:Modbus RTU 读取、电荷积分、双轴绘图、CSV 记录。如果你在做束流实验、辐照测试,它是数据质量的最后防线。

v1.0 带来了什么

20260205(上一版)v1.0.0
DAQ 联动单一 “Connect to DAQ (beta)” 入口DAQ_Master + GDDAQ 互斥子菜单
GDDAQ 支持run.log 状态机 + pgrep 崩溃检测 + 失败自动重试
联动的启停边界DAQ 信号可停任何运行联动只能停自己启动的运行,手动运行不被打断
Modbus 响应盲信(无任何校验)地址 / 功能码 / 字节数 / CRC 全校验
TCP 接收单次 recv,可能错位循环凑满整帧 + 请求前排空残留
电荷积分断线期间虚增断线 / 过滤期间零贡献
电流过滤单向、双通道耦合、0 = 全滤双向独立、拒绝 NaN/Inf、0 = 禁用
监控阈值随显示单位漂移内部统一 mA,切单位语义不变
ZERO 恢复指示灯可能卡红自动转回 RUN
状态监控仅直流突变检测新增 Pulse ModeZERO 报警音
事件日志底栏 + 100 条彩色日志窗口
代码规模2,424 行3,738 行

DAQ 联动体系:从 beta 入口到双子菜单

原来的 “Connect to DAQ (beta)” 只对接自家的 DAQ_Master。v1.1 把它升级为互斥子菜单:DAQ_MasterGDDAQ 二选一,启用一方自动关闭另一方,也可以都不启用纯手动跑。

一个容易被忽视但很关键的语义:联动只能停止它自己启动的运行。手动点 Start 跑起来的监控,不会被 DAQ 的停止信号误杀;启停日志也会标注来源((manual) / (daq_master) / (gddaq)),事后追溯一目了然。

DAQ_Master 的对接契约完全不变:程序照旧监视 /tmp/daq_status.txt,START 时按轮次名和编号自动命名,把电流数据存到 ROOT 文件旁边的 current_data/ 里——已有采集流程零改动。

GDDAQ:一个读 run.log 的状态机

GDDAQ 联动是全新实现的。它每秒轮询目标轮次目录下的 run.log,解析 Start: / Stop 行驱动状态机:检测到 Start 且进程存活 → 自动开始监控;检测到 Stop → 自动停止;进程消失且无 Stop 行 → 判定 CRASHED,立即停止采集并在状态栏标红。

几个为”无人值守”准备的细节:

  • 进程存活pgrep -x 检测(带 2 秒超时,绝不卡 UI)
  • 自动启动失败(比如串口被占用)不放弃:状态回退,下一秒自动重试,状态栏橙色提示
  • run.log 只在 mtime 变化时重新解析,长 run 不产生无谓 IO
  • 目标轮次留空则自动跟随最大编号的轮次文件夹
  • 所有电流数据统一写进 <数据根目录>/CurrentData/,不污染各轮次目录

配置通过独立的 Settings 对话框完成:数据根目录(带浏览与路径补全)、进程名、轮次号,必填项实时校验,不合法时 Apply 按钮禁用并红字给出原因。

状态监控:认识脉冲信号

直流模式下,PEAK/DROP 突变检测工作得很好;但面对脉冲束流,脉冲 low 期的零电流本身就是正常信号。新增的 Pulse Mode 跳过突变检测,只盯信号丢失:电流持续低于零阈值超过 Zero Timeout(默认 3 秒)才报 ZERO,脉冲间隙不再误报。

配套的 ZERO 报警音:任一通道进入 ZERO 立即响一声,之后每 3 秒重复,恢复或停止监控自动静音。是否开启由设置对话框顶部的全局开关决定。

事件日志:现场发生了什么,有据可查

主窗口底部新增一行日志栏,显示最近一条事件,点击展开完整的日志窗口:保留最近 100 条、按 INFO/WARNING/ERROR 三级着色、非模态不挡主界面。

日志会回答那些事后最难还原的问题:这次运行是谁启动的?串口什么时候开始没数据?是断流还是坏帧?通道断流约 5 秒、持续收到 CRC/格式错误帧,都会产生去抖后的 WARNING——坏帧日志还会提示”检查波特率和接线”,与普通断流相区分。不刷屏,也不缺席。

一次不留死角的代码体检

v1.1 的另一半工作量藏在地下:对整个采集核心做了一遍系统性审查,修复了几个潜伏很久的问题。三个最有代表性的:

1. 曾经”盲信”每一个响应帧。 旧代码收到串口数据直接解析——没有 CRC 校验,没有长度检查。一次噪声、一个错位字节,就可能被重解释成一个”看起来很合理”的假电流值,混进积分和 CSV。现在每一帧都要过五关:从站地址、功能码、异常位、字节数、CRC,不过关就丢弃并重新同步字节流。

2. 幽灵电荷。 梯形积分依赖上一帧的值。通信断开 60 秒后恢复,旧代码会用”断线前 × 恢复后”的均值乘以整个 60 秒——凭空造出 60 秒从未流过的电荷。现在任何丢帧(超时或被过滤)都会重置积分基线,缺口贡献严格为零。对以 mC 计量的实验数据来说,这是最要紧的一处修复。

3. 一条命令注入通道。 “Open Data Folder” 用 os.system 拼接路径,而路径可能源自外部可写的 /tmp/daq_status.txt——构造的目录名可以执行任意命令。已改为不经 shell 的 subprocess 调用。

同批修复还有一批”一行式”问题:TCP 分片半包、请求-响应错位配对、单向过滤放过负值和 NaN、阈值随显示单位漂移、ZERO 恢复误报 PEAK、文件名 9999 回绕覆盖旧文件、双通道误配同一端口、启动失败资源泄漏、快照同秒互相覆盖……完整清单见仓库的 Release Notes

细节打磨

  • 路径输入框(保存文件名 / GDDAQ 目录)支持自动补全
  • About / Tutorial 改为非模态单实例,可开着教程操作主程序
  • 脉冲提醒改为非模态——弹窗期间采集照常进行,且关闭即销毁不累积
  • 监控运行时锁定端口、文件名等全部配置控件,停止后恢复
  • 绘图改用 draw_idle 合并重绘,悬停查值向量化,长跑更流畅
  • 启动中途失败自动回滚已打开的串口与 socket;快照同秒去重;单实例锁按用户隔离
  • GDDAQ 轮询回调不再弹出任何模态框——错误走状态栏与日志,绝不卡住采集循环

打包与兼容性

运行依赖不变(numpy / matplotlib / PyQt5 / pyserial),Windows 7 兼容版本钉不变;manylinux2014 + Miniconda 的 Docker 打包流程经实测照常可用;/tmp/daq_status.txt 对接契约不变,DAQ_Master 侧零改动。平台支持仍是 Linux(≥ glibc 2.17)与 Windows(≥ 7),GDDAQ 联动仅限 Linux。

获取与参与

Releases 页提供 Linux x86-64 单文件可执行程序,兼容 CentOS 7、Ubuntu 18+ 等主流发行版。

本文由AI生成。