Files
VX5-DiaphragmPump/docs/NozzleReverseClean.md
T
2026-10-19 17:03:47 +08:00

131 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 喷嘴逆清洗(Nozzle Reverse Cleaning)流程分析
本文档基于 `SystemSetting::on_pushButtonCleanUP_pressed()` 及相关函数(`onCleanUPNow()`、`timerHandler2()`)的源码,梳理“喷嘴逆清洗”的完整流程,说明在各个阶段哪些泵/阀被打开或关闭、状态标志及定时器行为。
## 总体说明
- 入口:`on_pushButtonCleanUP_pressed()`(由用户按下“清洗”按钮触发)。
- 流程依赖三个成员:`enCleanUpAppendFlag`(状态机标志),`timer2`(阶段定时器),`timerAuto`(用于齿轮泵自动控制的定时器)。
- 清洗可由用户启动或停止(对话框确认)。
## 主要状态与定时器
- `enCleanUpAppendFlag` 含义(函数中使用的值):
- 0:空闲
- 1:进入手动模式并开始准备(短时等待)
- 2:正在开启回收槽(等待位置到位)
- 3:真正开始清洗(清洗中)
- 4:清洗完成,开始关闭回收槽并恢复
- 5:停止清洗/强制收尾
- 6:特殊停止/恢复
- `timer2`:用于阶段切换的定时器(不同阶段设置不同延时)。
- `timerAuto`:在齿轮泵(gearPump)情形下,用于短周期自动控制(间隔 100 ms)。
## 按下按钮后的流程(`on_pushButtonCleanUP_pressed()`)
1. 弹出对话框,提示“自动清洗时间约为一分钟,然后自动停止”,并显示“开始清洗 / 取消 / 停止清洗”选项。
2. 若用户选择“开始清洗”执行以下动作:
- 保存当前 `isPumpValveControledByHand` 状态到 `r_PumpValveControledByHand` 并将 `sysPara->status.isPumpValveControledByHand` 设为 `true`(进入手动控制状态)。
- 将一系列泵与阀置为“清洗安全/准备”状态:
- `controlCompressPump(false);` (关闭压缩泵)
- `controlCycleValve(true);` (开启循环阀)
- `controlInkValve(false);` (关闭墨阀)
- `controlInkValvePWM(false);` (禁用墨阀 PWM)
- `controlMainInkPump(false);` (关闭主墨泵)
- `controlMixValve(false);` (关闭混合阀)
- `controlReclaimPump(true, true);` (打开回收泵,第二参数 `true` 表示带某种模式/快速起动——与实现相关)
- `controlViscosityPump(false);` (关闭粘度泵)
- `controlReleaseValve(false);` (关闭释放阀)
- 如果启用了 `gearPumpEnable` 且 `flagOfReclaimPumEnable` 为真(齿轮泵版本):
- `controlCycleValve(true);`
- `controlViscosityPump(true);`
- `controlReclaimPump(true, false);`(打开回收泵,第二参数 `false`)
- 将 `para.gearPumpValue = 0;` 并调用 `WriteMoterPump()` 更新电机/泵设置
- `controlInkValvePWM(false);`
- 将 `enCleanUpAppendFlag = 1`(进入准备阶段)。
- 调用 `mainInkCtrl()`(主控恢复/切换函数,进入手动控制后的一些主流程)。
- 启动 `timer2->start(2000);`(等待约 2 秒以便进入下一个阶段)。
3. 若用户选择“停止清洗”(对话框中为取消清洗按钮),会执行:
- `enCleanUpAppendFlag = 3;`(直接跳转到完成/结束阶段处理)
- 调用 `timerHandler2()` 立刻处理结束逻辑并返回。
## 清洗的执行阶段(由 `timer2` 驱动,见 `timerHandler2()`)
流程按 `enCleanUpAppendFlag` 值推进:
- 当 `enCleanUpAppendFlag == 1`(准备完成):
- 停止 `timer2`。
- 将状态置为 `2`(准备开启回收槽并监测位置)。
- 根据回收槽当前位置 `sysPara->status.currReclaimTankPos` 决定动作:
- 若位置 < 45:调用 `controlReclaimTankOpen(1);`(开始打开回收槽,参数 1 表示动作/使能)。
- 若位置 > 55:调用 `controlReclaimTankClose(1);`(开始关闭回收槽)。
- 启动 `timer2->start(5500);`(等待 ~5.5 秒让回收槽动作完成)。
- 当 `enCleanUpAppendFlag == 2`(等待回收槽到位):
- 停止 `timer2`。
- 将 `enCleanUpAppendFlag = 3`(准备开始真正的清洗)。
- 调用 `controlReclaimTankOpen(0);`(停止回收槽驱动/微调参数 0,表示结束开启命令)。
- 触发 `onCleanUPNow()`:进入清洗动作。
- `onCleanUPNow()`(真正开始清洗):
- 发出状态文本 `正在喷嘴逆清洗......`。
- 若非齿轮泵特例(即 `!(gearPumpEnable && flagOfReclaimPumEnable)`)则执行:
- `controlCycleValve(true);`(确保循环阀打开)
- `controlViscosityPump(true);`(打开粘度泵)
- `controlReclaimPump(true, false);`(以普通模式打开回收泵)
- 启动 `timer2->start(60000);`(清洗计时约 60 秒,之后进入下一阶段)。
- 当 `enCleanUpAppendFlag == 3`(清洗结束进入收尾):
- 将 `enCleanUpAppendFlag = 4`。
- 执行收尾动作:
- `controlCycleValve(false);`(关闭循环阀)
- `controlViscosityPump(false);`(关闭粘度泵)
- `controlReclaimTankClose(1);`(开始关闭回收槽)
- 设置 `sysPara->status.reclaimCloseCnt = 10;`(用于稍后延迟/重试逻辑)
- 停止 `timer2`,并 `timer2->start(8300);`(等待约 8.3 秒以完成回收槽关闭)。
- 若为齿轮泵情形,启动 `timerAuto->start(100);`(开始短周期自动泵控制,用于慢速回退/调节)。
- 当 `enCleanUpAppendFlag == 4`(最终完成/恢复):
- 发出 `清洗完成` 状态;若 `currReclaimTankPos == 0` 则:
- 将 `enCleanUpAppendFlag = 0`(恢复空闲)
- 停止 `timer2`,并调用 `controlReclaimTankClose(0);`(结束回收槽关闭动作)
- 将 `sysPara->status.isPumpValveControledByHand = false;`(恢复手动控制标志)
- 若 `timerAuto` 活动则停止它。
- 调用 `mainInkCtrl()` 恢复主控模式(回到自动/正常喷印控制)。
- 当 `enCleanUpAppendFlag == 5`(用户中止或异常收尾):
- 停止 `timer2`,将 `enCleanUpAppendFlag = 0`,调用 `controlReclaimTankClose(0);`,恢复 `isPumpValveControledByHand=false`,并调用 `mainInkCtrl()`。
- 当 `enCleanUpAppendFlag == 6`(另一种强制结束):
- 停止 `timer2`,将 `enCleanUpAppendFlag = 0`,并将 `isPumpValveControledByHand=false`。通常不触发 `mainInkCtrl()` 但恢复手动标志。
## 其他相关逻辑
- 在 `updateSysStatusToUI()` 中也会检测当前位置:如果回收槽位置在 45~55 且 `enCleanUpAppendFlag==2`,会直接把 `enCleanUpAppendFlag` 置为 3 并调用 `onCleanUPNow()`(避免超时等待)。
- 清洗过程会通过 `emit setRunStatus(...)` 与 `LogInfo::setRunStatusText(...)` 报告当前步骤进度。
## 时序概览(近似)
1. 用户点击“开始清洗” -> 进入手动(isPumpValveControledByHand = true),立即设置各泵阀为清洗准备状态,`enCleanUpAppendFlag=1`。
2. 等待 ~2s(`timer2`)-> 切换到 `enCleanUpAppendFlag=2` 并根据位置 `controlReclaimTankOpen/Close(1)` -> 等待 ~5.5s。
3. `enCleanUpAppendFlag=2` 到位后 -> `enCleanUpAppendFlag=3`,停止回收槽驱动(`controlReclaimTankOpen(0)`),调用 `onCleanUPNow()`。
4. 真正清洗阶段:打开循环阀/粘度泵/回收泵(齿轮泵情形会略有不同),计时 ~60s(`timer2`)。
5. 清洗结束 -> 关闭循环阀/粘度泵,关闭回收槽(`controlReclaimTankClose(1)`),等待 ~8.3s。
6. 最终恢复:复位手动控制标志,停止 `timerAuto`(如有),调用 `mainInkCtrl()` 恢复正常打印控制。
## 关键函数调用清单(按先后出现)
- `controlCompressPump(false)`
- `controlCycleValve(true/false)`
- `controlInkValve(false)`
- `controlInkValvePWM(false)`
- `controlMainInkPump(false)`
- `controlMixValve(false)`
- `controlReclaimPump(true, true/false)`
- `controlViscosityPump(true/false)`
- `controlReleaseValve(false)`
- `controlReclaimTankOpen(1/0)` / `controlReclaimTankClose(1/0)`
- `mainInkCtrl()`(用于进入/退出手动控制后的主控恢复)
## 注意事项与可能的改进点
- `controlReclaimPump(true, true)` 与 `controlReclaimPump(true, false)` 两种调用方式的差异需参考 `devOp` 实现说明(表示不同启动模式或参数)。
- 若存在异常中断(`enCleanUpAppendFlag` 被置为 5/6),代码会尽量关闭回收槽并恢复 `isPumpValveControledByHand`,但是否彻底恢复所有阀泵需在 `DevOp` 层确认。
- 时间参数(2s、5.5s、60s、8.3s)为源码中硬编码值,若需更稳健的流程,建议改用位置/传感器反馈替代固定延时以提高鲁棒性。
---
文档基于 `SystemSetting.cpp` 中相关函数分析整理,若需要我可以把上述时序画成流程图或补充 `DevOp` 层对应函数的实现说明。