131 lines
8.6 KiB
Markdown
131 lines
8.6 KiB
Markdown
# 喷嘴逆清洗(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` 层对应函数的实现说明。
|