项目背景
某精密仪器科技有限公司主要生产工业传感器模组及执行机构,其产品出厂前需经过严格的电气性能检测,包括模拟量输出精度、数字量逻辑状态、继电器 IO 吸合特性及 Modbus 寄存器数值等多项指标。
原有检测方式依赖工人手持万用表逐点测量,用纸质表格手工记录,不仅效率低下,且极易因疲劳产生误判。随着订单量增长,质量管控压力显著上升,亟需一套覆盖多信号类型、可自动判定合格并留存数据的上位机检测系统。
业务痛点与挑战
\\挑战一:多种信号协议并存\**
设备同时对外暴露模拟量(4–20 mA 电流环、0–10 V 电压)、数字量(24 V 高低电平)、继电器触点 IO 和 Modbus RTU 寄存器四类信号,需要在单一界面内统一管理,且各通道采样频率和容差要求不同。
\\挑战二:实时性与稳定性要求高\\
生产线节拍为每台设备检测不超过 15 分钟,系统需在保证全通道实时刷新(≥10 Hz)的同时维持 GUI 响应流畅,不得出现界面卡顿或采集丢帧。
\\挑战三:判定规则灵活可配\**
不同型号产品的合格阈值差异显著,判定规则需支持工艺工程师在界面中自定义,无需修改代码,且规则变更后立即生效。
\\挑战四:报告合规性与可追溯性\**
质检报告须包含设备序列号、检测时间戳、操作员工号、每项指标实测值与合格范围,并支持激光打印机直接打印,同时存档至本地数据库备查。
系统总体架构
系统分为四层:硬件接口层、通信驱动层、业务逻辑层和展示层,各层职责独立、接口清晰。
核心功能模块
多通道信号采集模块
采集模块采用生产者-消费者模型,每类信号协议对应一个独立的采集线程(Producer),采集到的原始数据写入各自的 \queue.Queue\;信号处理线程(Consumer)从队列取数并进行滤波、量程换算和时间戳对齐,最终汇聚到统一的 \SignalFrame\ 数据结构。
\\模拟量采集(Analog)\\
- 支持 4–20 mA 和 0–10 V 双模式,自动量程识别
- 采样率最高 1 kHz,GUI 刷新频率 50 Hz(消抖聚合)
- 每通道独立配置工程量换算公式(线性/非线性查表)
- 移动均值滤波(窗口可配 5–50 点)消除工频干扰
\\数字量采集(Digital I/O)\\
- DI 通道检测 24 V 高/低电平,带去抖时间配置(默认 5 ms)
- DO 通道支持点动脉冲(持续时间、频率可配)
- 继电器 IO 通过电流检测电路判断触点吸合,阈值可调
\\Modbus 通信\\
| 参数 | RTU 配置 | TCP 配置 |
|------|----------|----------|
| 速率 / 地址 | 9600–115200 bps,1–247 站号 | IP + Port 自由配置 |
| 功能码支持 | FC01/02/03/04/05/06/15/16 | 同左 |
| 轮询间隔 | 50–5000 ms 可配 | 同左 |
| 超时重试 | 3 次,超时 500 ms | 同左 |
| 数据类型 | INT16/UINT16/INT32/FLOAT32/BIT | 同左 |
规则引擎(合格判定)
规则引擎将每条判定规则抽象为 \Rule\ 对象,支持以下判定类型:
- \\范围判定\\:\
min ≤ value ≤ max\,支持绝对值和百分比容差
- \\逻辑判定\\:数字量应为 HIGH / LOW / PULSE
- \\顺序判定\\:多个信号必须按照预定时序先后触发
- \\关联判定\\:信号 A 触发后,信号 B 必须在 T 毫秒内响应
- \\统计判定\\:连续 N 帧均值 / 标准差需在范围内
规则以 JSON 格式持久化,工艺工程师通过图形界面(无需代码)增删改,变更即时写入数据库并热加载到运行中的引擎。
实时监控面板(QML UI)
实时监控面板是操作人员日常使用最频繁的界面,包含以下区域:
- \\波形区\\:基于 \
Matplotlib FigureCanvas\内嵌,各通道波形独立子图,支持暂停/恢复滚动、截图保存
- \\数值区\\:每通道当前值大字显示,颜色随状态变化(绿色=正常、黄色=接近限值、红色=超限)
- \\状态栏\\:通信连接状态、采样计数、当前帧率实时刷新
- \\控制区\\:启动/停止检测、紧急停止、型号切换、操作员登录
检测任务控制台
检测任务遵循严格的状态机流程,防止操作员跳过关键步骤。
报告生成与打印
报告由 \ReportLab\ 生成标准 A4 PDF,内容包括:
- 企业 LOGO、报告编号(UUID 前 8 位)、生成时间戳
- 被测设备型号、序列号、批次号
- 检测结论(醒目大字 \\合格 / 不合格\\)
- 全部通道实测值、合格范围、偏差、单项结论(表格形式)
- 波形截图(PNG 内嵌,采集结束时自动截取)
- 操作员工号、审核员(如配置)
- 底部二维码(编码报告编号,可追溯)
报告通过系统默认打印机直接输出,同时自动归档至 \reports/YYYYMM/\ 目录。
统计分析模块
统计面板提供以下分析维度:
- \\日/周/月良率趋势折线图\\(按型号过滤)
- \\各型号合格率对比柱状图\\
- \\失败原因 Pareto 图\\(自动计算累计占比)
- \\通道偏差分布直方图\\(正态分布拟合叠加)
- \\班组绩效看板\\(操作员检测数量与良率)
- 支持时间范围、型号、操作员三维度交叉筛选
技术实现亮点
\\1. 多线程与 Qt 信号槽解耦\\
采集线程不直接操作 GUI,所有数据更新通过 Qt 信号(\pyqtSignal\)传递到主线程,彻底避免线程安全问题。自定义 \WorkerThread\ 基类封装了启停逻辑与异常捕获,子类只需实现 \run\_loop()\ 方法。
\\2. 动态插件架构\\
每种信号驱动实现 \IDriver\ 抽象接口,通过 Python 动态导入机制(\importlib\)按需加载。新增一种采集卡只需新建一个驱动文件并在配置 JSON 中注册,无需修改主程序。
\\3. 波形渲染性能优化\\
Matplotlib 渲染千点以上时容易卡顿,方案采用 \blit=True\ 动画模式,只重绘变化的数据线而非整个图形区,刷新耗时从 80 ms 降至 8 ms,保证 50 Hz 刷新帧率不丢帧。
\\4. 规则热加载\\
规则引擎使用 \watchdog\ 监听规则文件变化,触发后在后台线程重新编译规则集,通过读写锁(\threading.RLock\)无缝切换,运行中修改规则无需重启程序。
\\5. 异常自恢复\\
通信驱动层内置指数退避重连机制,Modbus 从站离线后最多尝试 5 次重连(间隔 1/2/4/8/16 秒),重连成功后自动恢复采集,期间 GUI 显示离线警告但不中断检测任务,待重连后补采。
项目成效与总结
本项目历经 12 周从需求到上线,为某精密仪器科技有限公司交付了一套高可靠、易扩展的设备质量检测上位机系统。系统在正式投产后首月即实现单台检测时间缩短至 14 分钟,日检测产能突破 300 台,不合格品漏检率下降至 0.02% 以下,质检数据全部电子化留存,彻底告别纸质台账。
从技术角度,本项目验证了 PySide6 在工业上位机场景的成熟度:Qt 的多线程安全信号槽机制有效解决了采集-展示解耦难题,pymodbus 的异步接口保证了 Modbus 通信不阻塞 GUI,ReportLab 的 PDF 生成能力满足了报告合规性要求。插件化驱动架构也为后续扩展 EtherCAT、PROFIBUS 等协议预留了扩展点。
