Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PID上位机

基于 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 秒),支持自动滚动
  • 支持图表截图保存、数据清除
  • 实时显示最大值、最小值、平均值、标准差等统计数据

PID 参数调节

  • 在线调节 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.py

打包为 exe

pyinstaller --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 帮助

使用流程

1. 连接设备

  • 勾选「模拟控制」可使用内置模拟器,无需硬件
  • 选择串口 → 设置波特率等参数 → 点击「连接」

2. 启动控制

  • 设置目标值 → 点击「启动控制」
  • 实时图表开始绘制设定值、实际值、输出值曲线
  • 左侧面板可在线调节 Kp / Ki / Kd 参数

3. 自动调参

  • 点击「自动调参」→ 选择调参方法
  • 等待调参完成,结果自动填入 PID 参数

4. 数据管理

  • 运行过程中数据自动记录
  • 可导出为 CSV / JSON / Excel 格式
  • 支持导入历史数据进行回放分析

许可证

MIT License

About

PID上位机 - PyQt5 PID参数调节工具,串口通信、实时图表、模拟控制、自动调参

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages