完善流量控制 GUI 的开环扫点与手动操作流程

新增可配置开环扫点、多 CSV 前馈表拟合及结果文件生成;补充闭环停止、手动开度安全互锁和 PID 未启用状态显示,并同步更新自动化测试、使用文档、打包配置与 Windows 可执行程序。
This commit is contained in:
2026-09-04 16:47:16 +08:00
parent ead625bf2d
commit c1a4a2a229
23 changed files with 36300 additions and 7959 deletions
+15 -1
View File
@@ -80,7 +80,7 @@ python -m pip install pymodbus matplotlib pyinstaller
- `valve_model_004.json`:内置模型的外置备份和自定义模型格式参考,删除该外置副本不会影响内置模型;
- `使用说明.txt`:现场操作、安全策略和故障说明。
双击 `FlowControl.exe` 后,核对 PLC 地址、端口和站号,再点击“连接设备”。连接成功后程序保持 `100%` 开度并以 `0.25 s` 周期监测阀后流量、阀前压力和阀后压力;首次设置 `0~300 SLM` 目标时启动 10 Hz 闭环,运行中可继续修改目标。界面显示的“下发总开度”为最终命令:
双击 `FlowControl.exe` 后,核对 PLC 地址、端口和站号,再点击“连接设备”。连接成功后程序保持 `100%` 开度并以 `0.25 s` 周期监测阀后流量、阀前压力和阀后压力;输入 `0~300 SLM` 目标并点击“设置目标流量”时启动 10 Hz 闭环。闭环运行中该输入框和按钮保持可用,可直接输入新目标并再次点击以切换目标;其右侧的独立“停止流量控制”按钮只在闭环运行时可用,点击后程序停止闭环、立即下发 `100%` 总开度并返回监测状态。界面显示的“下发总开度”为最终命令:
```text
总开度 = clamp(前馈开度 + PI 修正量, 0, 100)
@@ -90,6 +90,14 @@ GUI 的 Modbus 读写与控制周期全部在单一后台线程中串行执行
默认模型只能在未连接状态下切换。点击“选择 JSON…”可加载其他模型,程序会在连接前检查 JSON 结构、有限数值、标定点数量、`800~1000` 行程范围以及 `motor_open` / `motor_closed` 与当前配置是否一致;无效模型不会进入控制。点击“使用内置”可恢复 `valve_model_004.json`
连接设备后可点击模型选择按钮左侧的“开环扫点”。弹窗可设置起止开度、开度间隔、随机种子、采样周期、稳态窗口、相对/绝对标准差阈值、单点最长等待时间,以及是否追加闭阀端精细行程扫描。程序按随机顺序直接下发各开度,每个点在阀后流量稳定或达到最长等待时间后切换;扫点期间继续显示流量、压力、总开度和电机行程。若当前正在闭环控制,开始前会确认并停止闭环;扫点启动后按钮变为“停止扫点”,点击即可提前停止并生成已有数据的结果图。正常完成、用户停止、断开、退出或故障时都会保留已经采集的数据,并尝试把阀门恢复到 `100%` 开度。
开环数据写到程序所在目录的 `open_loop_data/`:采样过程中逐行落盘 CSV,结束时生成一张包含压力、流量和绝对压力比三组子图的 PNG。扫点结束后设备保持连接并回到监测状态;安全越限或通信故障仍会执行安全断开。
“目标流量”区域下方提供手动开度输入和“设置开度”按钮,允许范围为 `0~100%`。手动开度只允许在设备已连接、闭环和开环扫点均停止时下发;闭环运行中点击该按钮只会提示先点击“停止流量控制”,关闭提示后不会停止闭环,也不会发送任何开度命令。监测卡片会显示手动总开度和换算后的电机行程;因为 PID 没有参与手动下发,PID 模式显示为“未启用”。刚连接、停止闭环后以及其他仅监测状态也统一显示“未启用”。
“拟合前馈表”是离线工具,不会在每次扫点结束时自动生成 JSON:点击后可一次选择多份开环 CSV,再指定输出 JSON。程序以每个扫描步末尾 `20` 个样本求稳态均值,将多次实验中相同行程的数据合并平均,按 `A_eff = Q / (P1_abs × F(r))` 反解并生成可由“选择 JSON…”直接加载的阀模型;同时在同目录生成一张同名诊断 PNG。拟合在独立线程运行,只能在未连接、故障已断开或已连接监测状态启动,闭环及扫点过程中禁用。
源码运行与重新打包命令为:
```powershell
@@ -101,6 +109,12 @@ Copy-Item valve_model/valve_model_004.json 可执行程序/valve_model_004.json
`--smoke-test` 只检查内置模型和关键依赖,不打开界面,也不会连接真实设备。
`gui_main.py` 是 GUI 入口而不是单文件源码:直接运行时仍会导入本工程的 `control_runtime.py``config.py``controllers.py``flow_control.py``PcControl.py``open_loop.py``valve_model.py`,并需要 `pymodbus``matplotlib` 和系统可用的 `tkinter`。PyInstaller 会分析这些导入,把 Python 解释器、项目模块、第三方库、Tcl/Tk 运行文件和内置 JSON 收集进单文件 EXE。双击 EXE 时,PyInstaller 先把内部文件释放到临时目录,再启动程序,所以交付后的 `FlowControl.exe` 不依赖工作区源码或现场安装 Python;它仍然依赖 Windows、可写的程序/临时目录、正常网络以及可访问的 PLC。
打包使用的 `build/flow_control_gui/` 是 PyInstaller 的中间工作目录,包含模块分析、归档、链接缓存和缺失模块告警,不是交付文件,也不是 EXE 的运行依赖;删除后可由上面的打包命令重新生成。`可执行程序/` 才是最终交付目录。
窗口版 EXE 的 `--smoke-test` 正常通过时不会显示窗口或输出文本,应通过进程退出码判断。PowerShell 中可执行 `$p = Start-Process .\可执行程序\FlowControl.exe -ArgumentList '--smoke-test' -Wait -PassThru; $p.ExitCode``0` 为通过,非 `0` 为失败。当前检查范围包括配置、内置模型、Modbus 类,以及实际创建一张临时 PNG 来验证开环绘图库;它不连接真实设备,因此不能替代 PLC 联机测试。
## 闭环控制
### 运行