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

8.5 KiB
Raw Permalink Blame History

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