基于 PyQt5 的 PID 参数调节上位机软件,通过串口与下位机通信,支持实时图表显示、在线参数调节、模拟控制、自动调参、数据记录与导出等功能。界面采用 iOS/macOS 设计风格,遵循 Apple Human Interface Guidelines。
- 自动检测系统可用串口,支持热插拔刷新
- 支持波特率:9600 / 19200 / 38400 / 57600 / 115200 / 230400 / 460800 / 921600(可自定义)
- 数据位:5 / 6 / 7 / 8,停止位:1 / 1.5 / 2,校验位:无 / 奇 / 偶
- 自动重连机制,断线后按设定间隔自动尝试恢复连接
- 串口收发字节计数、帧计数实时统计
- 基于 pyqtgraph 的高性能实时曲线绘制,支持 60fps 流畅刷新
- 同时显示设定值、实际值、输出值三条曲线,颜色可自定义
- 可调时间窗口(1~3600 秒),支持自动滚动
- 支持图表截图保存、数据清除
- 实时显示最大值、最小值、平均值、标准差等统计数据
- 在线调节 Kp / Ki / Kd 参数,支持微调按钮(+/-)快速调整
- 可调目标值和输出范围限制
- 积分限幅防止积分饱和
- 支持参数预设管理:保存、加载、删除、列出预设
- 参数预设存储在
~/.pid_tuner/presets/目录
- 内置一阶加滞后过程模型(FOPDT),无需实际硬件即可测试
- 可调参数:增益、时间常数、死区时间、噪声水平、扰动
- 10ms 采样周期,模拟真实控制回路
- 线程安全的信号槽机制,后台模拟 + 主线程 UI 更新
支持四种经典调参算法,独立线程运行,可随时中断:
| 方法 | 置信度 | 原理 |
|---|---|---|
| Ziegler-Nichols | 70% | 临界比例法:逐步增大 Kp 直到产生等幅振荡,记录临界增益 Ku 和周期 Tu |
| Cohen-Coon | 80% | 阶跃响应法:施加阶跃输入,识别一阶加滞后模型参数后计算 |
| 继电反馈法 | 85% | Astrom-Hagglund 方法:bang-bang 继电控制产生极限环振荡,峰值分析提取参数 |
| AMIGO | 85% | 近似 M 约束积分增益优化:基于阶跃响应,鲁棒性更好 |
- 自动记录运行数据(设定值、实际值、输出值、误差、P/I/D 各项)
- 最大记录 100,000 个数据点,超出自动裁剪
- 支持 CSV 和 JSON 格式导入导出
- 支持数据统计:超调量、上升时间、稳定时间、误差均方根
- 数据表格支持搜索过滤、右键菜单、全选(Ctrl+A)
四级报警,带防抖机制(默认 1 秒内不重复触发):
| 级别 | 颜色 | 说明 |
|---|---|---|
| 信息 INFO | 蓝色 #007AFF | 一般提示 |
| 警告 WARNING | 橙色 #FF9500 | 值过高/过低、误差过大、参数异常 |
| 错误 ERROR | 红色 #FF3B30 | 通信异常 |
| 严重 CRITICAL | 粉红 #FF2D55 | 系统错误 |
- 可配置阈值:值上限、值下限、误差上限
- 支持声音报警和弹窗报警开关
- 报警表格支持按级别过滤、关键词搜索
- 最大 1000 条报警记录,支持单条确认、全部确认、全部清除
- 加载 CSV/JSON 数据文件进行回放
- 可调回放速度:0.5x / 1x / 2x / 5x / 10x
- 进度条实时显示回放进度和时间
自定义二进制串口通信协议,小端字节序。
┌──────┬──────┬──────┬──────┬──────────┬──────┬──────┐
│ 帧头 │ 帧头 │ 命令码 │ 数据长度 │ 数据域 │ 校验和 │ 帧尾 │
│ 0x55 │ 0xAA │ 1字节 │ 2字节 │ N字节 │ 1字节 │ 0x0D │
│ │ │ │ │ │ │ 0x0A │
└──────┴──────┴──────┴──────┴──────────┴──────┴──────┘
- 帧头:固定
0x55 0xAA - 命令码:1 字节,见下表
- 数据长度:2 字节,大端序
- 校验和:命令码 + 数据长度 + 数据域各字节累加,取低 8 位
- 帧尾:固定
0x0D 0x0A - 最小帧长度:8 字节
| 命令码 | 值 | 功能 |
|---|---|---|
| READ_PID_PARAMS | 0x01 | 读取 PID 参数 |
| WRITE_PID_PARAMS | 0x02 | 写入 PID 参数 |
| READ_REALTIME_DATA | 0x03 | 读取实时数据 |
| REALTIME_DATA_RESP | 0x04 | 实时数据响应 |
| START_STOP_CONTROL | 0x05 | 启动/停止控制 |
| SET_TARGET_VALUE | 0x06 | 设置目标值 |
| READ_STATUS | 0x07 | 读取状态 |
| STATUS_RESPONSE | 0x08 | 状态响应 |
| AUTO_TUNE_START | 0x09 | 开始自动调参 |
| AUTO_TUNE_STOP | 0x0A | 停止自动调参 |
| AUTO_TUNE_RESULT | 0x0B | 自动调参结果 |
- PIDParams:3 个 float (Kp, Ki, Kd),共 12 字节,小端序
- RealtimeData:3 个 float (setpoint, actual, output),共 12 字节,小端序
- StatusData:2 个 unsigned byte (status_flags, error_code),共 2 字节
| 标志 | 值 | 说明 |
|---|---|---|
| RUNNING | 0x01 | 控制运行中 |
| AUTO_TUNING | 0x02 | 自动调参中 |
| ERROR | 0x04 | 错误状态 |
| PARAMS_LOADED | 0x08 | 参数已加载 |
设置对话框包含 4 个标签页:
- 主题:浅色 / 深色 / 跟随系统
- 语言:简体中文 / English
- 字体大小:10~24(默认 12)
- 自动保存:开关 + 间隔 1~60 分钟(默认 5 分钟)
- 默认波特率、数据位、停止位、校验位
- 自动重连:开关 + 重连间隔 1~30 秒(默认 3 秒)
- 默认时间窗口:1~3600 秒(默认 10 秒)
- 最大数据点数:100~10000(默认 1000)
- 自动滚动、抗锯齿开关
- 曲线颜色自定义(设定值/实际值/输出值)
- 值上限 / 值下限 / 误差上限
- 报警延迟:0~60 秒(默认 1 秒)
- 声音报警 / 弹窗报警开关
- 配置文件:
~/.pid_tuner/config.json - 参数预设:
~/.pid_tuner/presets/<预设名>.json - 支持最近文件列表(最多 10 个)
pid-upper-computer/
├── main.py # 程序入口,Fusion 风格 + 调色板配置
├── requirements.txt # 依赖清单
├── build.bat # Windows 打包脚本
│
├── core/ # 核心功能模块
│ ├── serial_manager.py # 串口通信管理(连接/断开/收发/统计)
│ ├── protocol.py # 通信协议(帧解析/打包/命令码定义)
│ ├── pid_controller.py # PID 控制器(比例/积分/微分/限幅)
│ ├── simulator.py # 模拟器(一阶加滞后模型 + 模拟串口管理器)
│ ├── auto_tuner.py # 自动调参(Z-N/Cohen-Coon/Relay/AMIGO)
│ ├── data_recorder.py # 数据记录器(记录/统计/CSV/JSON 导入导出)
│ ├── data_player.py # 数据回放(加载/播放/暂停/停止/变速)
│ └── alarm.py # 报警管理(阈值检测/分级/防抖/确认/清除)
│
├── ui/ # 界面模块
│ ├── main_window.py # 主窗口(布局/样式/信号连接/所有交互逻辑)
│ ├── chart_widget.py # 实时图表组件(pyqtgraph 封装)
│ ├── settings_dialog.py # 设置对话框(通用/串口/图表/报警 四标签页)
│ ├── stats_dialog.py # 统计对话框(数据统计信息展示)
│ ├── export_dialog.py # 导出对话框(CSV/JSON/Excel 格式选择)
│ ├── import_dialog.py # 导入对话框(文件选择/格式识别)
│ ├── compare_dialog.py # 对比对话框(多组数据对比分析)
│ ├── help_dialog.py # 帮助对话框(使用说明/快捷键/关于)
│ ├── app_icon.svg # 应用图标(蓝色 PID 曲线)
│ └── arrow_down.svg # ComboBox 下拉箭头图标
│
└── utils/ # 工具模块
├── config.py # 配置管理(单例/JSON/预设/最近文件)
├── logger.py # 日志模块(文件 + 控制台输出)
└── helpers.py # 辅助函数
- Python >= 3.8
- Windows 10/11(推荐)
pip install -r requirements.txt| 包名 | 最低版本 | 用途 |
|---|---|---|
| PyQt5 | >=5.15.9 | GUI 框架 |
| pyserial | >=3.5 | 串口通信 |
| pyqtgraph | >=0.13.3 | 实时数据绘图 |
| numpy | >=1.24.3 | 数值计算 |
| psutil | >=5.9.0 | 系统资源监控 |
| openpyxl | >=3.1.0 | Excel 数据导出 |
| PyInstaller | >=5.13.0 | 打包为可执行文件(可选) |
python main.pypyinstaller --noconfirm --onefile --windowed ^
--icon=ui/app_icon.ico ^
--name=PID上位机 ^
--add-data="ui/app_icon.ico;ui" ^
--add-data="ui/arrow_down.svg;ui" ^
main.py打包后的可执行文件在 dist/PID上位机.exe。
注意:打包后的 exe 会嵌入应用图标,任务管理器和 Alt+Tab 切换器中均可正确显示。
| 快捷键 | 功能 |
|---|---|
Ctrl+E |
导出数据 |
Ctrl+I |
导入数据 |
Ctrl+T |
自动调参 |
Ctrl+S |
保存参数 |
Ctrl+, |
打开设置 |
Ctrl+A |
数据表格全选 |
F1 |
帮助 |
- 勾选「模拟控制」可使用内置模拟器,无需硬件
- 选择串口 → 设置波特率等参数 → 点击「连接」
- 设置目标值 → 点击「启动控制」
- 实时图表开始绘制设定值、实际值、输出值曲线
- 左侧面板可在线调节 Kp / Ki / Kd 参数
- 点击「自动调参」→ 选择调参方法
- 等待调参完成,结果自动填入 PID 参数
- 运行过程中数据自动记录
- 可导出为 CSV / JSON / Excel 格式
- 支持导入历史数据进行回放分析
MIT License