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