陆工调整关机流程第一版、优化排气提示

This commit is contained in:
2026-09-07 15:51:08 +08:00
parent 0fa8ce4b51
commit fbdd064adb
12 changed files with 7025 additions and 7001 deletions
+43 -20
View File
@@ -799,6 +799,27 @@ float PID_realize2(float speed, float act){
void InkJetPrinter::pressureAdj() void InkJetPrinter::pressureAdj()
{ {
// 关机压力控制首次进入时从停泵状态重新开始,禁止继承正常运行或手动控制转速
if(sysPara->status.powerOffAppending && !m_powerOffPressureControlActive)
{
u = 0.0f;
sysPara->para.gearPumpValue = 0;
m_pumpState = DPUMP_STOPPED;
m_stateChangeCount = 0;
m_adjSkip = 0;
m_lastActualPressure = 0;
m_startingStepCount = 0;
m_bufValidCount = 0;
for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0;
m_bufIdx = 0;
sysPara->devOp->WriteMoterPump();
m_powerOffPressureControlActive = true;
}
else if(!sysPara->status.powerOffAppending)
{
m_powerOffPressureControlActive = false;
}
// 故障停机处理 // 故障停机处理
if(sysPara->status.gearPumpRunStopFlag || sysPara->status.flagOfSpeedAlarm) if(sysPara->status.gearPumpRunStopFlag || sysPara->status.flagOfSpeedAlarm)
{ {
@@ -834,6 +855,8 @@ void InkJetPrinter::pressureAdj()
int actual = sysPara->status.PRESSURE; int actual = sysPara->status.PRESSURE;
int target = (int)sysPara->para.pressure; int target = (int)sysPara->para.pressure;
if(sysPara->status.powerOffAppending && target > 650)
target = 650; // 关机压力目标不超过650,不修改用户设定值
int err = target - actual; // 正值=压力偏低,负值=压力偏高 int err = target - actual; // 正值=压力偏低,负值=压力偏高
// 更新滑动平均缓冲 // 更新滑动平均缓冲
@@ -849,8 +872,9 @@ void InkJetPrinter::pressureAdj()
// 检查是否允许状态切换(距上次切换>=800ms) // 检查是否允许状态切换(距上次切换>=800ms)
bool canSwitch = (m_stateChangeCount >= MIN_STATE_INTERVAL); bool canSwitch = (m_stateChangeCount >= MIN_STATE_INTERVAL);
// 硬保护:压力严重超标,立即强制停泵(不受800ms限制) // 关机压力上限:超过关机目标10立即停泵,不受状态和800ms切换间隔限制
if(actual > target + 80) int hardStopThreshold = sysPara->status.powerOffAppending ? 10 : 80;
if(actual > target + hardStopThreshold)
{ {
if(m_pumpState != DPUMP_STOPPED) { if(m_pumpState != DPUMP_STOPPED) {
u = 0.0f; u = 0.0f;
@@ -1331,20 +1355,18 @@ void InkJetPrinter::timerHandler(void){
ControledSwitchFlag = false; ControledSwitchFlag = false;
pulse_3s = 0; pulse_3s = 0;
} }
// 检测手动→自动边沿,直接恢复压力控制,不走 gearPumpStartFlag 的 3s 等待 // 检测手动→自动边沿,恢复压力控制时从停止状态安全重启
if(m_lastByHand && !sysPara->status.isPumpValveControledByHand) if(m_lastByHand && !sysPara->status.isPumpValveControledByHand)
{ {
ControledSwitchFlag = true; ControledSwitchFlag = true;
u = (float)sysPara->para.gearPumpValue; // 同步当前转速,避免突变 u = 0.0f;
// 重置隔膜泵状态机,从当前转速状态开始 sysPara->para.gearPumpValue = 0;
if(u > 40.0f) { sysPara->devOp->WriteMoterPump();
m_pumpState = DPUMP_RUNNING; // 如果当前有转速,进入运行状态 m_pumpState = DPUMP_STOPPED;
} else {
m_pumpState = DPUMP_STOPPED; // 否则从停止状态开始
}
m_stateChangeCount = 0; m_stateChangeCount = 0;
m_adjSkip = 0; m_adjSkip = 0;
m_lastActualPressure = 0; m_lastActualPressure = 0;
m_startingStepCount = 0;
m_bufValidCount = 0; m_bufValidCount = 0;
for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0;
m_bufIdx = 0; m_bufIdx = 0;
@@ -1567,7 +1589,7 @@ void InkJetPrinter::timerHandler(void){
} }
} }
if(gearPumpRunFlag || sysPara->para.gearPumpEnable == 0) if(gearPumpRunFlag || sysPara->para.gearPumpEnable == 0 || sysPara->status.powerOffAppending)
{ {
if(!sysPara->status.selfCheckDone && sysPara->status.isPrinting){ if(!sysPara->status.selfCheckDone && sysPara->status.isPrinting){
sysPara->status.selfCheckDone = true; sysPara->status.selfCheckDone = true;
@@ -1615,14 +1637,13 @@ void InkJetPrinter::timerHandler(void){
if(sysPara->status.selfCheckCnt >= MAX_SELF_CHECK_CNT) if(sysPara->status.selfCheckCnt >= MAX_SELF_CHECK_CNT)
{ {
sysPara->status.selfCheckDone = 1; sysPara->status.selfCheckDone = 1;
u = (float)sysPara->para.gearPumpValue; // 自检完成后管道恢复正常阻力,必须重新从STOPPED状态开始
// 自检完成后管道恢复正常阻力,重置状态机让压力重新平稳收敛 // 清零 u 和状态机,让系统根据实际压力重新启动
// 不清零 u,从当前控制字开始,避免突变 u = 0.0f; // 关键:清零控制量,避免继承自检期间的大转速
if(u > 40.0f) { sysPara->para.gearPumpValue = 0;
m_pumpState = DPUMP_RUNNING; // 如果当前有转速,进入运行状态 sysPara->devOp->WriteMoterPump(); // 立即停泵
} else {
m_pumpState = DPUMP_STOPPED; // 否则从停止状态开始 m_pumpState = DPUMP_STOPPED; // 强制进入STOPPED状态
}
m_stateChangeCount = 0; m_stateChangeCount = 0;
m_adjSkip = 0; m_adjSkip = 0;
m_lastActualPressure = 0; m_lastActualPressure = 0;
@@ -1667,7 +1688,9 @@ void InkJetPrinter::timerHandler(void){
for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0;
m_bufIdx = 0; m_bufIdx = 0;
} }
if(pulse_100ms && sysPara->para.gearPumpEnable && !sysPara->status.isPumpValveControledByHand && ControledSwitchFlag ) { if(pulse_100ms && sysPara->para.gearPumpEnable &&
(sysPara->status.powerOffAppending ||
(!sysPara->status.isPumpValveControledByHand && ControledSwitchFlag))) {
pressureAdj(); pressureAdj();
} }
+1
View File
@@ -120,6 +120,7 @@ private:
int m_bufValidCount = 0; // 缓冲区有效点数(用于启动阶段判断) int m_bufValidCount = 0; // 缓冲区有效点数(用于启动阶段判断)
bool m_lastReclaimMode = false; // 上次回收泵使能状态 bool m_lastReclaimMode = false; // 上次回收泵使能状态
bool m_lastByHand = false; // 上次手动控制状态 bool m_lastByHand = false; // 上次手动控制状态
bool m_powerOffPressureControlActive = false; // 关机压力控制已初始化
// 隔膜泵控制函数 // 隔膜泵控制函数
float calculateTargetSpeed(int err); float calculateTargetSpeed(int err);
+19 -20
View File
@@ -2079,7 +2079,11 @@ void MainWindow::airPushingProcess()
} }
if(sysPara->status.airPushingOnTime >= sysPara->para.airPushDurationSec * 1000){ if(sysPara->status.airPushingOnTime >= sysPara->para.airPushDurationSec * 1000){
if(sysPara->devOp->isViscosityPumpOpen())
sysPara->devOp->controlViscosityPump(false); sysPara->devOp->controlViscosityPump(false);
if(sysPara->devOp->isCycleValveOpen())
sysPara->devOp->controlCycleValve(false); sysPara->devOp->controlCycleValve(false);
if(!sysPara->devOp->isReclaimPumpOpen()) if(!sysPara->devOp->isReclaimPumpOpen())
@@ -2225,13 +2229,16 @@ void MySleep(unsigned int msec);
* 关机前务必保存参数 * 关机前务必保存参数
* */ * */
void MainWindow::checkForPowerOff(){ void MainWindow::checkForPowerOff(){
if(m_powerOffInProgress)
return;
if(sysPara->status.powerOffAppending){ if(sysPara->status.powerOffAppending){
m_powerOffInProgress = true;
if(!sysPara->status.selfCheckDone) if(!sysPara->status.selfCheckDone)
sysPara->status.selfCheckDone = true; sysPara->status.selfCheckDone = true;
this->setDisabled(true); this->setDisabled(true);
emit setDisableAll(); emit setDisableAll();
////////关机时提高转速和回收泵压力,粘度泵和循环阀///// ////////关机时通过闭环控制维持压力,控制目标不超过650/////
quint16 gearPumpValue_backup = sysPara->para.gearPumpValue;
int reclaimPumpPWMWidth_backup = sysPara->para.reclaimPumpPWMWidth;; int reclaimPumpPWMWidth_backup = sysPara->para.reclaimPumpPWMWidth;;
if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN)) if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN))
{ {
@@ -2257,17 +2264,11 @@ void MainWindow::checkForPowerOff(){
} }
} }
sysPara->devOp->controlReclaimTankOpen(true); sysPara->devOp->controlReclaimTankOpen(true);
sysPara->status.isPumpValveControledByHand = true; //停止自动 sysPara->status.isPumpValveControledByHand = true; // 阀门保持手动,隔膜泵由关机闭环控制
if(sysPara->para.gearPumpEnable ){ if(sysPara->para.gearPumpEnable ){
if(!sysPara->para.flagOfReclaimPumEnable){ if(sysPara->para.flagOfReclaimPumEnable)
sysPara->para.gearPumpValue = 360;
sysPara->devOp->WriteMoterPump();
}
else{
sysPara->devOp->controlReclaimPump(true,false); sysPara->devOp->controlReclaimPump(true,false);
sysPara->para.gearPumpValue = 0; // 不再固定输出360,隔膜泵由pressureAdj按关机目标压力闭环调节
sysPara->devOp->WriteMoterPump();
}
} }
else{ else{
sysPara->para.reclaimPumpPWMWidth = 95; sysPara->para.reclaimPumpPWMWidth = 95;
@@ -2298,7 +2299,10 @@ void MainWindow::checkForPowerOff(){
updateTotalCnt(0); updateTotalCnt(0);
sysPara->saveParaToFile(); // 关机前将相关配置保存 sysPara->saveParaToFile(); // 关机前将相关配置保存
} }
// 退出关机压力维持阶段,后续关闭泵阀时禁止隔膜泵再次启动
sysPara->status.powerOffAppending = false; sysPara->status.powerOffAppending = false;
sysPara->para.gearPumpValue = 0;
sysPara->devOp->WriteMoterPump();
if(!TEST_MODE){ if(!TEST_MODE){
for(int i=7;i>0;i--) for(int i=7;i>0;i--)
{ {
@@ -2317,7 +2321,8 @@ void MainWindow::checkForPowerOff(){
} }
} }
emit CloseJd(); emit CloseJd();
sysPara->para.gearPumpValue=gearPumpValue_backup; sysPara->para.gearPumpValue = 0;
sysPara->devOp->WriteMoterPump();
sysPara->para.reclaimPumpPWMWidth = reclaimPumpPWMWidth_backup; sysPara->para.reclaimPumpPWMWidth = reclaimPumpPWMWidth_backup;
sysPara->devOp->controlCompressPump(false); sysPara->devOp->controlCompressPump(false);
setRunStatus(tr("准备关机......")); setRunStatus(tr("准备关机......"));
@@ -4435,15 +4440,9 @@ void MainWindow::on_pushButton_Reboot_clicked()
sysPara->devOp->controlReclaimTankOpen(true); sysPara->devOp->controlReclaimTankOpen(true);
sysPara->status.isPumpValveControledByHand = true; //停止自动 sysPara->status.isPumpValveControledByHand = true; //停止自动
if(sysPara->para.gearPumpEnable ){ if(sysPara->para.gearPumpEnable ){
if(!sysPara->para.flagOfReclaimPumEnable){ if(sysPara->para.flagOfReclaimPumEnable)
sysPara->para.gearPumpValue = 360;
sysPara->devOp->WriteMoterPump();
}
else{
sysPara->devOp->controlReclaimPump(true,false); sysPara->devOp->controlReclaimPump(true,false);
sysPara->para.gearPumpValue = 0; // 不再固定输出360,由闭环控制维持压力
sysPara->devOp->WriteMoterPump();
}
} }
else{ else{
sysPara->para.reclaimPumpPWMWidth = 95; sysPara->para.reclaimPumpPWMWidth = 95;
+1
View File
@@ -243,6 +243,7 @@ private:
bool printingFlag; //判断当前是否在打印 bool printingFlag; //判断当前是否在打印
bool startPrintingFlag; bool startPrintingFlag;
bool previewFlag; bool previewFlag;
bool m_powerOffInProgress = false; // 防止MySleep处理事件时重复进入关机流程
int searchExpiryVar(QString html = "");//检索有效期变量 int searchExpiryVar(QString html = "");//检索有效期变量
void ExpiryDotUpdate(char Mode); void ExpiryDotUpdate(char Mode);