diff --git a/DevOp.cpp b/DevOp.cpp index bb2eed3..db804db 100644 --- a/DevOp.cpp +++ b/DevOp.cpp @@ -2700,23 +2700,30 @@ int DevOp::writeFpgaPrintPara(bool ignoreWarn){ QMessageBox::critical(NULL,tr("错误"),tr("在同步计米的情况下无打印串或显示区域为零")); } else { - if(currPrintCol && type == 2){ - int synNumPerCol = displayAreaTotalSynNum*(1<<8)/(currPrintCol*(1 + sysPara->para.charBold)); - //加宽的时候,相当于列数翻倍 - if(displayAreaTotalSynNum >= (1<<24)){ - if(!ignoreWarn) - QMessageBox::critical(NULL,tr("错误"),tr("在同步计米的情况下喷印同步脉冲数过多,请检查你的配置")); - } - if(synNumPerCol >= (1<< 16)){ - if(!ignoreWarn) - QMessageBox::critical(NULL,tr("警告"),tr("喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度")); - } - if(synNumPerCol < 5){ - if(!ignoreWarn) - QMessageBox::critical(NULL,tr("警告"),tr("喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度")); - } - sysPara->para.synNumPerCol = synNumPerCol; + // if(currPrintCol && type == 2){ + // int synNumPerCol = displayAreaTotalSynNum*(1<<8)/(currPrintCol*(1 + sysPara->para.charBold)); + // //加宽的时候,相当于列数翻倍 + // if(displayAreaTotalSynNum >= (1<<24)){ + // if(!ignoreWarn) + // QMessageBox::critical(NULL,tr("错误"),tr("在同步计米的情况下喷印同步脉冲数过多,请检查你的配置")); + // } + // if(synNumPerCol >= (1<< 16)){ + // if(!ignoreWarn) + // QMessageBox::critical(NULL,tr("警告"),tr("喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度")); + // } + // if(synNumPerCol < 5){ + // if(!ignoreWarn) + // QMessageBox::critical(NULL,tr("警告"),tr("喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度")); + // } + // sysPara->para.synNumPerCol = synNumPerCol; + + // sysPara->para.synNumPerCol = sysPara->para.printColDelay << 8; + // }/ + + if(currPrintCol){ + sysPara->para.synNumPerCol = sysPara->para.printColDelay << 8; } + if(sysPara->para.synPulseNumPerMm<1 || sysPara->para.synPulseNumPerMm>50) { } sysPara->para.synPulsePerMmX8 = (unsigned short)((unsigned int)sysPara->para.synPulseNumPerMm <<8); @@ -3377,6 +3384,8 @@ void DevOp::printCtrl2(int cmd){ } unsigned int DevOp::readFpgaVersionNum(){ + if (sysPara == NULL) return 0; + fpgaRd(0x00EC,&sysPara->status.FPGAChipType,1); fpgaRd(0x00FE,(unsigned char *)&sysPara->status.fpgaVersionNum,2); fpgaRd(READ_BUILD_DAT, (unsigned char *)&sysPara->status.build_dat.builTime, sizeof(sysPara->status.build_dat.builTime)); diff --git a/InkJetPrinter.cpp b/InkJetPrinter.cpp index acce06d..da170db 100644 --- a/InkJetPrinter.cpp +++ b/InkJetPrinter.cpp @@ -26,7 +26,7 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) : ui(new Ui::InkJetPrinter) { // 隐藏系统任务栏,隐藏后,如果需要激活任务栏,则需要呼出QtUI中的任意弹出式、非全屏窗口,然后使用鼠标将光标移动至屏幕最左侧或最顶部则可以呼出任务栏 - int ret = system("xfconf-query -c xfce4-panel -p /panels/panel-1/autohide-behavior -s 2"); + int ret = system("xfconf-query -c xfce4-panel -p /panels/panel-0/autohide-behavior -s 2"); qInfo() << "Hide system panel ret:" << ret; // system("ifconfig eth1 down"); @@ -52,14 +52,13 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) : m_serialThreadFPGA = new QThread; serialFPGA = new Serial("/dev/ttyAS5"); - connect(m_serialThreadFPGA,&QThread::started,serialFPGA,&Serial::startInitSlot); serialFPGA->moveToThread(m_serialThreadFPGA); connect(serialFPGA,SIGNAL(sendQueueData(int,int,unsigned char*,int,int)),sysPara->devOp,SLOT(resendFPGADate(int,int,unsigned char*,int,int))); connect(serialFPGA,SIGNAL(resendFPGAData(int,int,unsigned char*,int,int)),sysPara->devOp,SLOT(resendFPGADate(int,int,unsigned char*,int,int))); connect(sysPara->devOp,SIGNAL(sendSerialDataToFPGA(int,int,unsigned char*,int,int)),serialFPGA,SLOT(sendSerialData(int,int,unsigned char*,int,int)),Qt::QueuedConnection); connect(serialFPGA,SIGNAL(getFPGAVersion(uint)),this,SLOT(saveFPGAVersionNum(uint))); - + connect(m_serialThreadFPGA,&QThread::started,serialFPGA,&Serial::startInitSlot); connect(serialFPGA,SIGNAL(stopSendData(bool)),this,SLOT(stopSendFPGAData(bool))); connect(serialFPGA,SIGNAL(getFPGAPhaseDetectHighTm(unsigned char*)),this,SLOT(saveFPGAPhaseDetectHighTm(unsigned char*))); connect(serialFPGA,SIGNAL(getFPGAStatus(unsigned char*)),this,SLOT(saveFPGAStatus(unsigned char*))); @@ -75,9 +74,6 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) : m_serialThreadSTM32 = new QThread(); serialSTM32 = new Serial("/dev/ttyAS2"); - - connect(m_serialThreadSTM32,&QThread::started,serialSTM32,&Serial::startInitSlot); - serialSTM32->moveToThread(m_serialThreadSTM32); connect(serialSTM32,SIGNAL(sendQueueData(int,int,unsigned char*,int,int)),sysPara->devOp,SLOT(resendSTM32Date(int,int,unsigned char*,int,int))); connect(sysPara->devOp,SIGNAL(sendSerialDataToSTM32(int,int,unsigned char*,int,int)),serialSTM32,SLOT(sendSerialData(int,int,unsigned char*,int,int))); @@ -88,7 +84,7 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) : connect(serialSTM32,SIGNAL(getSTM32Time(unsigned char*)),this,SLOT(saveSTM32Time(unsigned char*))); connect(serialSTM32,SIGNAL(stopSendData(bool)),this,SLOT(stopSendSTM32Data(bool))); connect(serialSTM32,SIGNAL(powerOffReady()),ui->tabMainWindow,SLOT(powerOffConfirmed())); - + connect(m_serialThreadSTM32,&QThread::started,serialSTM32,&Serial::startInitSlot); connect(serialSTM32,SIGNAL(queueSizeSTM32(int)),ui->tabMainWindow,SLOT(showSTM32queuesize(int))); connect(ui->tabSystemManage,SIGNAL(upgradeSTM32(QString)),serialSTM32,SLOT(upgradeSTM32File(QString))); connect(ui->tabSystemManage,SIGNAL(enableClick(bool)),this,SLOT(enableInkJetTabClick(bool))); @@ -187,11 +183,9 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) : connect(ui->tabSystemSetting,SIGNAL(pressureAdjust()),this,SLOT(pressureAdjustForsystemseeting())); #ifdef COUNTER1_BY_GROUP /* 分段计米 */ - connect(this,SIGNAL(updateCnt1GroupDisp(bool)), - ui->tabPrintSetting,SLOT(onUpdateCnt1GroupDisp(bool))); + connect(this,SIGNAL(updateCnt1GroupDisp(bool)),ui->tabPrintSetting,SLOT(onUpdateCnt1GroupDisp(bool))); #endif - initCntGroup(); - +initCntGroup(); msgtest = new QMessageBox(this); connect(msgtest, SIGNAL(finished(int)), this, SLOT(OnFinished(int))); msgBox1 = new QMessageBox(this); @@ -236,11 +230,6 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) : connect(ui->tabPrintSetting,SIGNAL(engineerMode(bool)),ui->tabSystemManage,SLOT(engieerModeAcceptSystemManage(bool))); connect(ui->tabPrintSetting, SIGNAL(engineerMode(bool)), ui->tabSystemSetting, SLOT(setFreqFixVisible(bool))); - // 这段代码是为了解决2026年7月11日 新巴 打印参数异常的问题的,后更换核心板,问题已解决,因此不再启用这段代码 - // connect(ui->tabMainWindow, &MainWindow::printBefore, this, [this](){ - // ui->tabPrintSetting->applyUIPara(false); - // }, Qt::DirectConnection); - sysPara->status.rWarnViscoReady=0; // hlp: 260608: 以授权为标准,不过度开放权限 @@ -264,7 +253,7 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) : sysPara->status.FileChangeRestCntFlag=0; sysPara->status.HVFaultCloseEn=0; sysPara->devOp->printCtrl( PRINT_CTRL_STOP); - sysPara->devOp->writeFpgaCalandar(1); + sysPara->devOp->writeFpgaCalandar(1);// //qDebug()<para.calandar_and_dat.year; sysPara->status.cnt1GroupRunningIndex=0; //sysPara->status.cnt1RepeatCurrent=0; @@ -278,36 +267,38 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) : //JSON data #ifdef MODBUS - modbus = NULL; - memset((uint8_t *)&sysPara->modbusParas, 0, sizeof(sysPara->modbusParas)); - sysPara->modbusStatus.receiveEnbleFlag = 1; - snprintf((char *)sysPara->modbusParas.selectFileName, sizeof(sysPara->modbusParas.selectFileName), "%s",QFileInfo(sysPara->para.lastOpenedFileName).fileName().toLatin1().constData()); - modbus = new ModbusTcp(&sysPara->modbusParas, &sysPara->modbusStatus); - m_thread = new QThread(); - modbus->moveToThread(m_thread); - connect(m_thread, SIGNAL(started()),modbus,SLOT(pvPollingThread())); - connect(modbus, SIGNAL(updateQRcode()), ui->tabMainWindow, SLOT(modbusUpdateQRCode()), Qt::QueuedConnection); - connect(modbus, SIGNAL(openFile(QString,bool)), ui->tabMainWindow->getTexteditOption(), SLOT(onFileOpen(QString,bool)), Qt::QueuedConnection); - connect(modbus, SIGNAL(startPrint()), ui->tabMainWindow, SLOT(on_pushButtonStartPrint_pressed()), Qt::QueuedConnection); - connect(modbus, SIGNAL(pausePrint()), ui->tabMainWindow, SLOT(on_pushButtonPausePrint_pressed()), Qt::QueuedConnection);//暂时屏蔽排除问题 - connect(modbus,SIGNAL(stopPrint()),ui->tabMainWindow,SLOT(on_pushButtonStopPrint_pressed()), Qt::QueuedConnection); - connect(modbus,SIGNAL(writeCalendar()),this,SLOT(onModbusWriteCalendar()), Qt::QueuedConnection); - connect(modbus,SIGNAL(writeCalendar1()),this,SLOT(onModbusWriteCalendar1CurrValue()), Qt::QueuedConnection); - connect(modbus,SIGNAL(writeCalendar1EndValue()),this,SLOT(onModbusWriteCalendar1EndValue()), Qt::QueuedConnection); - connect(modbus,SIGNAL(writeCalendar2EndValue()),this,SLOT(onModbusWriteCalendar2EndValue()), Qt::QueuedConnection); - connect(modbus,SIGNAL(writeCalendar2RepeatValue()),this,SLOT(onModbusWriteCalendar2RepeatValue()), Qt::QueuedConnection); - connect(modbus,SIGNAL(writeCalendar2InitValue()),this,SLOT(onModbusWriteCalendar2InitValue()), Qt::QueuedConnection); - connect(modbus,SIGNAL(CNTResetNow()),ui->tabMainWindow,SLOT(onModbusCNTResetNowPressed()), Qt::QueuedConnection); - connect(modbus,SIGNAL(faultResume()),ui->tabMainWindow,SLOT(onLabelFaultRusumePressed()), Qt::QueuedConnection); - connect(modbus,SIGNAL(mbLineAndCharSpace(int, int)),ui->tabMainWindow->getTexteditOption(),SLOT(onMbSetLineAndChar(int, int)), Qt::QueuedConnection); - connect(this,SIGNAL(updataPara2UI()),ui->tabPrintSetting,SLOT( PrintupdateSysParaToUI() ), Qt::QueuedConnection); - connect(this, SIGNAL(openFile(QString,bool)), ui->tabMainWindow->getTexteditOption(), SLOT(onFileOpen(QString,bool)), Qt::QueuedConnection); - connect(this, SIGNAL(startPrint()), ui->tabMainWindow, SLOT(on_pushButtonStartPrint_pressed()), Qt::QueuedConnection); + modbus = NULL; + memset((uint8_t *)&sysPara->modbusParas, 0, sizeof(sysPara->modbusParas)); + sysPara->modbusStatus.receiveEnbleFlag = 1; + snprintf((char *)sysPara->modbusParas.selectFileName, sizeof(sysPara->modbusParas.selectFileName), "%s",QFileInfo(sysPara->para.lastOpenedFileName).fileName().toLatin1().constData()); + modbus = new ModbusTcp(&sysPara->modbusParas, &sysPara->modbusStatus); + m_thread = new QThread(); + modbus->moveToThread(m_thread); + connect(m_thread, SIGNAL(started()),modbus,SLOT(pvPollingThread())); + connect(modbus, SIGNAL(updateQRcode()), ui->tabMainWindow, SLOT(modbusUpdateQRCode()), Qt::QueuedConnection); + connect(modbus, SIGNAL(openFile(QString,bool)), ui->tabMainWindow->getTexteditOption(), SLOT(onFileOpen(QString,bool)), Qt::QueuedConnection); + connect(modbus, SIGNAL(startPrint()), ui->tabMainWindow, SLOT(on_pushButtonStartPrint_pressed()), Qt::QueuedConnection); + connect(modbus, SIGNAL(pausePrint()), ui->tabMainWindow, SLOT(on_pushButtonPausePrint_pressed()), Qt::QueuedConnection);//暂时屏蔽排除问题 + connect(modbus,SIGNAL(stopPrint()),ui->tabMainWindow,SLOT(on_pushButtonStopPrint_pressed()), Qt::QueuedConnection); + connect(modbus,SIGNAL(writeCalendar()),this,SLOT(onModbusWriteCalendar()), Qt::QueuedConnection); + connect(modbus,SIGNAL(writeCalendar1()),this,SLOT(onModbusWriteCalendar1CurrValue()), Qt::QueuedConnection); + connect(modbus,SIGNAL(writeCalendar1EndValue()),this,SLOT(onModbusWriteCalendar1EndValue()), Qt::QueuedConnection); + connect(modbus,SIGNAL(writeCalendar2EndValue()),this,SLOT(onModbusWriteCalendar2EndValue()), Qt::QueuedConnection); + connect(modbus,SIGNAL(writeCalendar2RepeatValue()),this,SLOT(onModbusWriteCalendar2RepeatValue()), Qt::QueuedConnection); + connect(modbus,SIGNAL(writeCalendar2InitValue()),this,SLOT(onModbusWriteCalendar2InitValue()), Qt::QueuedConnection); + connect(modbus,SIGNAL(CNTResetNow()),ui->tabMainWindow,SLOT(onModbusCNTResetNowPressed()), Qt::QueuedConnection); + connect(modbus,SIGNAL(faultResume()),ui->tabMainWindow,SLOT(onLabelFaultRusumePressed()), Qt::QueuedConnection); + connect(modbus,SIGNAL(mbLineAndCharSpace(int, int)),ui->tabMainWindow->getTexteditOption(),SLOT(onMbSetLineAndChar(int, int)), Qt::QueuedConnection); + connect(this,SIGNAL(updataPara2UI()),ui->tabPrintSetting,SLOT( PrintupdateSysParaToUI() ), Qt::QueuedConnection); + connect(this, SIGNAL(openFile(QString,bool)), ui->tabMainWindow->getTexteditOption(), SLOT(onFileOpen(QString,bool)), Qt::QueuedConnection); + connect(this, SIGNAL(startPrint()), ui->tabMainWindow, SLOT(on_pushButtonStartPrint_pressed()), Qt::QueuedConnection); #endif ui->tabMainWindow->enableReclaimCtrlButton(false); + + //edit@12-14 connect(this,SIGNAL(currentChanged(int)),ui->tabMainWindow,SLOT(onInkJetPrinterCurrentChanged(int)), Qt::QueuedConnection); //pidControllerInit(); @@ -583,7 +574,7 @@ void InkJetPrinter::loadVoltageValue() ui->vol7SpinBox->setValue(sysPara->para.printed_adj_dac[7]); ui->vol8SpinBox->setValue(sysPara->para.printed_adj_dac[8]); ui->vol9SpinBox->setValue(sysPara->para.printed_adj_dac[9]); - + ui->vol10SpinBox->setValue(sysPara->para.printed_adj_dac[10]); ui->vol11SpinBox->setValue(sysPara->para.printed_adj_dac[11]); ui->vol12SpinBox->setValue(sysPara->para.printed_adj_dac[12]); @@ -627,7 +618,7 @@ void InkJetPrinter::loadVoltageValue() ui->cVol7SpinBox->setValue(sysPara->para.printed_continue_col_dac[7]); ui->cVol8SpinBox->setValue(sysPara->para.printed_continue_col_dac[8]); ui->cVol9SpinBox->setValue(sysPara->para.printed_continue_col_dac[9]); - + ui->cVol10SpinBox->setValue(sysPara->para.printed_continue_col_dac[10]); ui->cVol11SpinBox->setValue(sysPara->para.printed_continue_col_dac[11]); ui->cVol12SpinBox->setValue(sysPara->para.printed_continue_col_dac[12]); @@ -671,7 +662,7 @@ void InkJetPrinter::loadVoltageValue() ui->fvol7SpinBox->setValue(sysPara->para.printed_full_col_dac[7]); ui->fvol8SpinBox->setValue(sysPara->para.printed_full_col_dac[8]); ui->fvol9SpinBox->setValue(sysPara->para.printed_full_col_dac[9]); - + ui->fvol10SpinBox->setValue(sysPara->para.printed_full_col_dac[10]); ui->fvol11SpinBox->setValue(sysPara->para.printed_full_col_dac[11]); ui->fvol12SpinBox->setValue(sysPara->para.printed_full_col_dac[12]); @@ -713,7 +704,6 @@ void InkJetPrinter::initCntGroup() connect(this, &InkJetPrinter::sig_updateDisp, SectionalManager::instance(), &SectionalManager::sig_updateCntGroupDisp); } - float PID_realize(float speed); struct _pid{ @@ -767,7 +757,7 @@ float PID_realize2(float speed, float act){ pid.err = pid.SetSpeed - pid.ActualSpeed; float delta_u = pid.Kp * (pid.err - pid.err_last) - + pid.Ki * pid.err; + + pid.Ki * pid.err; // 自适应非对称限幅: // 压力严重偏高(err < -30):允许快速减速,限制慢速加速 @@ -790,20 +780,23 @@ float PID_realize2(float speed, float act){ void InkJetPrinter::pressureAdj() { + // 故障停机处理 if(sysPara->status.gearPumpRunStopFlag || sysPara->status.flagOfSpeedAlarm) { sysPara->para.gearPumpValue = 0; - u = 0.0f; - m_rampDone = false; - m_adjSkip = 0; - m_lastPressure = 0; - m_stableCount = 0; + u = 0.0f; + m_pumpState = DPUMP_STOPPED; + m_stateChangeCount = 0; + m_adjSkip = 0; + m_lastActualPressure = 0; + m_bufValidCount = 0; for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; m_bufIdx = 0; sysPara->devOp->WriteMoterPump(); return; } + // 泵未使能时的PID控制(保持原有逻辑) if(!sysPara->para.gearPumpEnable) { if(u > 0 || ((sysPara->para.pressure - sysPara->status.PRESSURE) > 0)) @@ -815,174 +808,215 @@ void InkJetPrinter::pressureAdj() return; } - int maxValue = sysPara->para.flagOfReclaimPumEnable ? 420 : 800; - if(maxValue < 60) maxValue = 60; - - int maxSpeed = (int)sysPara->para.gearPumpSpeedAlarm; - - auto clampU = [&]() { - if(u < 60.0f) u = 60.0f; - if(u > (float)maxValue) u = (float)maxValue; - }; + // 隔膜泵控制参数 + const int STOP_TO_START_THRESHOLD = 5; // 停止→启动:压力低于目标15(扩大滞环) + const int RUN_TO_STOP_THRESHOLD = 5; // 运行→停止:压力高于目标10(扩大滞环) + const int MIN_STATE_INTERVAL = 8; // 最小状态切换间隔:8个100ms = 800ms int actual = sysPara->status.PRESSURE; int target = (int)sysPara->para.pressure; - int cur; + int err = target - actual; // 正值=压力偏低,负值=压力偏高 - // 每次进入都更新滑动平均缓冲(软启动用瞬时值,闭环用平均值) + // 更新滑动平均缓冲 m_pressureBuf[m_bufIdx] = actual; m_bufIdx = (m_bufIdx + 1) % 10; int avgPressure = 0; for(int i = 0; i < 10; i++) avgPressure += m_pressureBuf[i]; avgPressure /= 10; - // --------------------------------------------------------------- - // 硬保护:压力超过目标+50,立即强制减速,优先级最高 - // 覆盖自检、软启动、闭环所有阶段 - // --------------------------------------------------------------- - if(actual > target + 50) + // 状态切换计数器递增 + m_stateChangeCount++; + + // 检查是否允许状态切换(距上次切换>=800ms) + bool canSwitch = (m_stateChangeCount >= MIN_STATE_INTERVAL); + + // 硬保护:压力严重超标,立即强制停泵(不受800ms限制) + if(actual > target + 80) { - float overErr = (float)(actual - (target + 50)); - float delta = -0.1f * overErr; - if(delta < -15.0f) delta = -15.0f; - u += delta; - clampU(); - m_lastPressure = actual; + if(m_pumpState != DPUMP_STOPPED) { + u = 0.0f; + sysPara->para.gearPumpValue = 0; + sysPara->devOp->WriteMoterPump(); + m_pumpState = DPUMP_STOPPED; + m_stateChangeCount = 0; + m_adjSkip = 0; + } + return; + } + + // 状态机处理 + switch(m_pumpState) { + case DPUMP_STOPPED: + handleStoppedState(err, canSwitch); + break; + + case DPUMP_STARTING: + handleStartingState(err, actual, target); + break; + + case DPUMP_RUNNING: + handleRunningState(err, canSwitch); + break; + } +} + +// 停止状态处理:压力低于目标较多时启动泵 +void InkJetPrinter::handleStoppedState(int err, bool canSwitch) +{ + const int STOP_TO_START_THRESHOLD = 5; // 压力低于目标15启动(扩大滞环) + const float START_INIT_SPEED = 80.0f; // 启动初始转速 + + // 压力低于目标较多,且允许切换(距上次停止>=800ms),启动泵 + if(err > STOP_TO_START_THRESHOLD && canSwitch) { + u = START_INIT_SPEED; + m_startingStepCount = 0; + m_adjSkip = 0; + sysPara->para.gearPumpValue = (unsigned short)(int)u; + sysPara->devOp->WriteMoterPump(); + m_pumpState = DPUMP_STARTING; + m_stateChangeCount = 0; // 重置计数器 + } +} + +// 启动爬升状态处理:从低转速逐步提升到工作转速 +void InkJetPrinter::handleStartingState(int err, int actual, int target) +{ + const int STARTING_TO_RUNNING_RANGE = 30; // 进入目标±50范围转到运行状态 + const float MAX_WORKING_SPEED = 500.0f; // 最大工作转速 + const float START_SPEED_STEP_LARGE = 40.0f; + const float START_SPEED_STEP_MED = 30.0f; + const float START_SPEED_STEP_SMALL = 20.0f; + + m_adjSkip++; + + // 每800ms调整一次(8个100ms周期) + if(m_adjSkip < 8) { + sysPara->para.gearPumpValue = (unsigned short)(int)u; + sysPara->devOp->WriteMoterPump(); + return; + } + m_adjSkip = 0; + + // 判断是否进入运行状态 + int absErr = (err >= 0) ? err : -err; + bool nearTarget = (absErr <= STARTING_TO_RUNNING_RANGE); + bool reachedMaxSpeed = (u >= MAX_WORKING_SPEED - 10); + + if(nearTarget || reachedMaxSpeed) { + // 转到运行微调状态 + m_pumpState = DPUMP_RUNNING; + m_lastActualPressure = actual; + m_stateChangeCount = 0; // 重置计数器 + return; + } + + // 继续爬升:根据误差自适应增速 + float step; + if(err > 100) step = START_SPEED_STEP_LARGE; + else if(err > 50) step = START_SPEED_STEP_MED; + else step = START_SPEED_STEP_SMALL; + + u += step; + if(u > MAX_WORKING_SPEED) u = MAX_WORKING_SPEED; + + sysPara->para.gearPumpValue = (unsigned short)(int)u; + sysPara->devOp->WriteMoterPump(); + m_startingStepCount++; +} + +// 运行微调状态处理:使用增量式控制算法 +void InkJetPrinter::handleRunningState(int err, bool canSwitch) +{ + const int RUN_TO_STOP_THRESHOLD = 5; // 压力高于目标10准备停泵(扩大滞环) + const int EMERGENCY_STOP_THRESHOLD = 10; // 压力高于目标20立即停泵(不受800ms限制) + + // 紧急停泵:压力严重超标,立即停泵(不受800ms限制) + if(err < -EMERGENCY_STOP_THRESHOLD) { + u = 0.0f; + sysPara->para.gearPumpValue = 0; + sysPara->devOp->WriteMoterPump(); + m_pumpState = DPUMP_STOPPED; + m_stateChangeCount = 0; + m_adjSkip = 0; + return; + } + + // 常规停泵:压力略高于目标,等待800ms后停泵 + if(err < -RUN_TO_STOP_THRESHOLD && canSwitch) { + u = 0.0f; + sysPara->para.gearPumpValue = 0; + sysPara->devOp->WriteMoterPump(); + m_pumpState = DPUMP_STOPPED; + m_stateChangeCount = 0; + m_adjSkip = 0; + return; + } + + // === 增量式微调控制(每200ms调整一次)=== + m_adjSkip++; + if(m_adjSkip < 2) { + sysPara->para.gearPumpValue = (unsigned short)(int)u; + sysPara->devOp->WriteMoterPump(); + return; + } + m_adjSkip = 0; + + int actual = sysPara->status.PRESSURE; + float error = (float)err; + float absErr = (error >= 0) ? error : -error; + + // 死区:误差≤0.5不调整 + if(absErr < 0.5f) { + m_lastActualPressure = actual; sysPara->para.gearPumpValue = (unsigned short)(int)u; sysPara->devOp->WriteMoterPump(); return; } - // --------------------------------------------------------------- - // 软启动:自适应步长,每 800ms 一次 - // 自检期间也走此逻辑(硬保护兜底),自检完成后重置重新收敛 - // 软启动阶段不做压力稳定检测,优先快速收敛 - // --------------------------------------------------------------- - if(!m_rampDone) + // 计算压力变化率(微分项) + int pressureChange = actual - m_lastActualPressure; + m_lastActualPressure = actual; + + // 增量式控制公式 + float delta_u; + + // 近目标刹车策略:误差≤5且正在接近目标,只刹车不加速 + if(absErr <= 5.0f && + ((error > 0.0f && pressureChange > 0) || // 压力低且在上升 + (error < 0.0f && pressureChange < 0))) // 压力高且在下降 { - if(++m_adjSkip < 8) - { - sysPara->para.gearPumpValue = (unsigned short)(int)u; - sysPara->devOp->WriteMoterPump(); - return; - } - m_adjSkip = 0; - - int err = target - actual; - - if(err < 0) - { - // 超压:小步减速 - u -= 1.0f; - } - else - { - // 自适应步长:差得远步子大,差得近步子小 - float step; - if (err > 200) step = 5.0f; - else if(err > 100) step = 3.0f; - else if(err > 50) step = 2.0f; - else step = 1.0f; - u += step; - } - - clampU(); - - // 转速上限保护 - if(sysPara->para.flagOfReclaimPumEnable && - sysPara->status.gearPumpRunSpeed >= maxSpeed) - { - u -= 3.0f; - clampU(); - } - - cur = (int)u; - - // 进入闭环条件:压力已稳定在目标±50以内 - if(sysPara->status.selfCheckDone && err >= -50 && err <= 50) - { - m_rampDone = true; - m_adjSkip = 0; - } - - sysPara->para.gearPumpValue = (unsigned short)cur; - sysPara->devOp->WriteMoterPump(); - return; + delta_u = -0.20f * (float)pressureChange; // 只刹车 + } + else { + // 标准增量式控制:比例项 + 微分项 + delta_u = 0.05f * error - 0.20f * (float)pressureChange; } - // --------------------------------------------------------------- - // 闭环:等压力稳定后再调速,自适应管路响应时间 - // - // 每100ms采样一次,连续3次压力变化<15认为稳定,才执行调速 - // 最长等待5s(50次)兜底,防止管路持续抖动导致永远不调 - // - // 调速后立即重置稳定计数,重新等待下一次稳定 - // - // 分区Kp:误差大步子大,误差小步子小 - // |err| > 100 → Kp=0.05,限幅±5 - // |err| 50~100→ Kp=0.04,限幅±4 - // |err| < 50 → Kp=0.03,限幅±3 - // --------------------------------------------------------------- - { - // 稳定检测用平均值,滤掉传感器噪声 - int pressureChange = avgPressure - m_lastPressure; - if(pressureChange < 0) pressureChange = -pressureChange; - m_lastPressure = avgPressure; - m_adjSkip++; // 复用为超时计数 + // 分级限幅(根据误差大小限制调节幅度) + float maxDelta; + if(absErr > 30.0f) maxDelta = 1.0f; + else if(absErr > 10.0f) maxDelta = 0.6f; + else maxDelta = 0.3f; - bool stable = (pressureChange < 10); - bool timeout = (m_adjSkip >= 50); // 5s兜底 + if(delta_u > maxDelta) delta_u = maxDelta; + if(delta_u < -maxDelta) delta_u = -maxDelta; - if(stable) - m_stableCount++; - else - m_stableCount = 0; + // 更新控制量 + u += delta_u; - bool readyToAdj = (m_stableCount >= 15) || timeout; + // 限制范围 + const float MIN_RUNNING_SPEED = 30.0f; // 最低运行转速(低于此值泵不转) + const float MAX_WORKING_SPEED = 500.0f; - if(!readyToAdj) - { - sysPara->para.gearPumpValue = (unsigned short)(int)u; - sysPara->devOp->WriteMoterPump(); - return; - } + if(u < MIN_RUNNING_SPEED) u = MIN_RUNNING_SPEED; + if(u > MAX_WORKING_SPEED) u = MAX_WORKING_SPEED; - // 平均压力已稳定(或超时兜底),执行调速,重置计数 - m_adjSkip = 0; - m_stableCount = 0; - - // 误差用平均值计算,避免瞬时噪声影响调速幅度 - float absErr = (float)(target - avgPressure); - if(absErr < 0.0f) absErr = -absErr; - - float kp, capDelta; - if(absErr > 100.0f) { kp = 0.05f; capDelta = 5.0f; } - else if(absErr > 50.0f) { kp = 0.04f; capDelta = 4.0f; } - else { kp = 0.03f; capDelta = 3.0f; } - - float err = (float)(target - avgPressure); - float delta_u = kp * err; - - if(delta_u > capDelta) delta_u = capDelta; - if(delta_u < -capDelta) delta_u = -capDelta; - - // 转速上限软限制:转速已达上限时禁止继续加速 - if(sysPara->para.flagOfReclaimPumEnable && - sysPara->status.gearPumpRunSpeed >= maxSpeed) - { - if(delta_u > 0.0f) delta_u = 0.0f; - } - - u += delta_u; - clampU(); - cur = (int)u; - - sysPara->para.gearPumpValue = (unsigned short)cur; - sysPara->devOp->WriteMoterPump(); - } + sysPara->para.gearPumpValue = (unsigned short)(int)u; + sysPara->devOp->WriteMoterPump(); } + void InkJetPrinter::DacAdjustStore() { sysPara->para.printed_adj_dac[0] = ui->vol0SpinBox->value(); @@ -1189,6 +1223,10 @@ void InkJetPrinter::timerHandler(void){ static float gearPumpRunNormalValue = 0.0; if(sysPara){ xxxm=1; + if(sysPara->para.flagOfModuleDecimal || sysPara->para.flagOfModuleHide){ + sysPara->para.flagOfModuleDecimal = 0; + sysPara->para.flagOfModuleHide = 0; + } sysPara->para.ReadFileErrorCnt=0; // 正常打开文件 @@ -1234,16 +1272,22 @@ void InkJetPrinter::timerHandler(void){ if(pulse_300ms) tempFlag=1; if((sysPara->status.delay10ms%3) == 0) //读取状态后再检測 { - // 检测是否需要启动泵泵,注意启动条件:1. 无墨水警告 2. 未运行 3. 未手动控制 if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN) && !gearPumpRunFlag && !sysPara->status.isPumpValveControledByHand)//刚启动前3秒 { if(sysPara->para.gearPumpEnable) { - // 确保开机时控制字从 0 开始,让 pressureAdj 软启动从 0 爬坡,避免突变到高转速 + // 隔膜泵初始化:确保从停止状态开始 if(sysPara->para.gearPumpValue != 0) { sysPara->para.gearPumpValue = 0; u = 0.0f; sysPara->devOp->WriteMoterPump(); } + // 初始化隔膜泵状态机 + m_pumpState = DPUMP_STOPPED; + m_stateChangeCount = 0; + m_adjSkip = 0; + m_lastActualPressure = 0; + m_bufValidCount = 0; + m_startingStepCount = 0; gearPumpStartFlag = true; } } @@ -1276,11 +1320,17 @@ void InkJetPrinter::timerHandler(void){ if(m_lastByHand && !sysPara->status.isPumpValveControledByHand) { ControledSwitchFlag = true; - u = (float)sysPara->para.gearPumpValue; // 同步当前转速,避免突变 - m_rampDone = false; // 重新软启动,适应切换后的压力状态 - m_adjSkip = 0; - m_lastPressure = 0; - m_stableCount = 0; + u = (float)sysPara->para.gearPumpValue; // 同步当前转速,避免突变 + // 重置隔膜泵状态机,从当前转速状态开始 + if(u > 40.0f) { + m_pumpState = DPUMP_RUNNING; // 如果当前有转速,进入运行状态 + } else { + m_pumpState = DPUMP_STOPPED; // 否则从停止状态开始 + } + m_stateChangeCount = 0; + m_adjSkip = 0; + m_lastActualPressure = 0; + m_bufValidCount = 0; for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; m_bufIdx = 0; } @@ -1299,25 +1349,29 @@ void InkJetPrinter::timerHandler(void){ } if(gearPumpRunNormalFlag && !sysPara->status.isPumpValveControledByHand && sysPara->para.gearPumpEnable) { - static int count_3s = 0; - if(u > gearPumpRunNormalValue*1.5)//改大一点 + // 隔膜泵泄漏检测:运行状态下,压力持续不上升或下降 + static int leakCheckCount = 0; + static int lastPressureForLeak = 0; + + if(m_pumpState == DPUMP_RUNNING && pulse_1s) { - if(pulse_1s) - { - count_3s++; - if(count_3s == 3) - { - count_3s = 0; - ui->tabMainWindow->setRunStatus(tr("压力泄漏或压力传感器故障!")); + int pressureChange = sysPara->status.PRESSURE - lastPressureForLeak; + + // 泵运行中(转速>40),压力不升反降,或上升太慢(<5/秒) + if(u > 40.0f && pressureChange < 5) { + leakCheckCount++; + if(leakCheckCount >= 5) { // 连续5秒 + leakCheckCount = 0; + ui->tabMainWindow->setRunStatus(tr("压力异常,可能泄漏!")); sysPara->status.gearPumpRunStopFlag = true; gearPumpRunNormalFlag = false; - LogInfo::setRunStatusText(tr("运行中压力泄漏,停齿轮泵!")); + LogInfo::setRunStatusText(tr("运行中压力泄漏,停泵!")); } + } else { + leakCheckCount = 0; } - } - else - { - count_3s = 0; + + lastPressureForLeak = sysPara->status.PRESSURE; } } if(sysPara->para.gearPumpEnable && (sysPara->status.gearPumpRunSpeed < 100) && test_flag){ @@ -1385,16 +1439,12 @@ void InkJetPrinter::timerHandler(void){ if(pulse_1s && flagOfSerialThreadStratEn){ if (!m_serialThreadFPGA->isRunning()) { - #ifndef ARCH_X86 qDebug()<<"start FPGA tread"; m_serialThreadFPGA->start(); - #endif } if (!m_serialThreadSTM32->isRunning()){ - #ifndef ARCH_X86 qDebug()<<"start STM32 tread"; m_serialThreadSTM32->start(); - #endif } flagOfSerialThreadStratEn = false; } @@ -1502,123 +1552,118 @@ void InkJetPrinter::timerHandler(void){ } } - if(gearPumpRunFlag || sysPara->para.gearPumpEnable == 0) - { - if(!sysPara->status.selfCheckDone && sysPara->status.isPrinting){ - - sysPara->status.flagOfAbnormalStatus = true; - - static bool onceLog = true; - if(onceLog) { + if(gearPumpRunFlag || sysPara->para.gearPumpEnable == 0) + { + if(!sysPara->status.selfCheckDone && sysPara->status.isPrinting){ + sysPara->status.selfCheckDone = true; + ui->tabMainWindow->updatePrintDisplayLabel(); + sysPara->status.flagOfAbnormalStatus = true; LogInfo::setRunStatusText(tr("打印过程中死机了!!!")); qDebug()<<"打印过程中死机了!!!"; - onceLog = false; - - ui->tabMainWindow->updatePrintDisplayLabel(); } - - ui->tabMainWindow->on_pushButtonStopPrint_pressed(); - - } - if(!sysPara->status.selfCheckDone) - { - /*开机自检*/ - autoControlValvePump(); - if(pulse_100ms){ - pressureAdj(); - } - /*-----------------------------------------------------*/ - if(!sysPara->status.selfCheckCnt) { - LogInfo::setRunStatusText(tr("开始自检,请等待60秒...............")); - ui->tabMainWindow->enableReclaimCtrlButton(false); - ui->tabMainWindow->enablePrintButton(false); - sysPara->devOp->mainInkCtrl(); - sysPara->para.TrunOnPowerCnt++;// 20151218 开机次数加1 - sysPara->saveParaToFile(); // 保存开机次数值 - - sysPara->status.lastProductCnt = sysPara->status.productCnt ; //这会让产品计数显示出来 - - ui->tabMainWindow->updateTotalCnt(0); - - - } - if((++sysPara->status.selfCheckCnt % 100) == 0){ - ui->tabMainWindow->setRunStatus(tr("开始自检,请等待%1秒...............").arg((MAX_SELF_CHECK_CNT - sysPara->status.selfCheckCnt)/100)); - } - - if(sysPara->status.selfCheckCnt >= MAX_SELF_CHECK_CNT) + if(!sysPara->status.selfCheckDone) { - sysPara->status.selfCheckDone = 1; - u = (float)sysPara->para.gearPumpValue; - // 自检完成后管道恢复正常阻力,重置软启动让压力重新平稳收敛 - // 不清零 u,从当前控制字开始,避免突变 - // m_rampDone = false; - // m_adjSkip = 0; - // m_lastPressure = 0; - // m_stableCount = 0; - + /*开机自检*/ autoControlValvePump(); - - for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; - m_bufIdx = 0; - LogInfo::setRunStatusText(tr("自检完成!!!")); - ui->tabMainWindow->setRunStatus(tr("自检完成!!!")); - qDebug()<<"自检完成!!!"; - ui->tabPrintSetting->PrintSettingLog(); - ui->tabMainWindow->enableReclaimCtrlButton(true); - sysPara->devOp->mainInkCtrl(); - sysPara->status.canRunAirPushing = true; - - if(sysPara->para.Reciclar) - test_flag = 1; - } - else { - if((sysPara->status.selfCheckCnt % 200) == 0) - // sysPara->devOp->controlReclaimTankOpen(false); + if(pulse_100ms){ + pressureAdj(); + } + /*-----------------------------------------------------*/ + if(!sysPara->status.selfCheckCnt) { + LogInfo::setRunStatusText(tr("开始自检,请等待60秒...............")); ui->tabMainWindow->enableReclaimCtrlButton(false); - } + ui->tabMainWindow->enablePrintButton(false); + sysPara->devOp->mainInkCtrl(); + sysPara->para.TrunOnPowerCnt++;// 20151218 开机次数加1 + sysPara->saveParaToFile(); // 保存开机次数值 + sysPara->status.lastProductCnt = sysPara->status.productCnt ; //这会让产品计数显示出来 + + ui->tabMainWindow->updateTotalCnt(0); + + + } + if((++sysPara->status.selfCheckCnt % 100) == 0){ + ui->tabMainWindow->setRunStatus(tr("开始自检,请等待%1秒...............").arg((MAX_SELF_CHECK_CNT - sysPara->status.selfCheckCnt)/100)); + } + + if(sysPara->status.selfCheckCnt >= MAX_SELF_CHECK_CNT) + { + sysPara->status.selfCheckDone = 1; + u = (float)sysPara->para.gearPumpValue; + // 自检完成后管道恢复正常阻力,重置状态机让压力重新平稳收敛 + // 不清零 u,从当前控制字开始,避免突变 + if(u > 40.0f) { + m_pumpState = DPUMP_RUNNING; // 如果当前有转速,进入运行状态 + } else { + m_pumpState = DPUMP_STOPPED; // 否则从停止状态开始 + } + m_stateChangeCount = 0; + m_adjSkip = 0; + m_lastActualPressure = 0; + m_bufValidCount = 0; + for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; + m_bufIdx = 0; + LogInfo::setRunStatusText(tr("自检完成!!!")); + ui->tabMainWindow->setRunStatus(tr("自检完成!!!")); + qDebug()<<"自检完成!!!"; + ui->tabPrintSetting->PrintSettingLog(); + ui->tabMainWindow->enableReclaimCtrlButton(true); + sysPara->devOp->mainInkCtrl(); + sysPara->status.canRunAirPushing = true; + + if(sysPara->para.Reciclar) + test_flag = 1; + } + else { + if((sysPara->status.selfCheckCnt % 200) == 0) + // sysPara->devOp->controlReclaimTankOpen(false); + ui->tabMainWindow->enableReclaimCtrlButton(false); + } + + } + else{ + // 开机自检完成的前提下 + if (!sysPara->status.airPushing || ui->tabMainWindow->m_2sFlag) { + autoControlValvePump(); + } + // 检测回收泵模式切换,切换时重置泄漏保护学习状态和软启动状态 + if(m_lastReclaimMode != sysPara->para.flagOfReclaimPumEnable) + { + m_lastReclaimMode = sysPara->para.flagOfReclaimPumEnable; + gearPumpRunNormalFlag = false; // 泄漏保护重新学习 + gearPumpRunNormalValue = 0.0f; + // 重置隔膜泵状态机,适应新模式 + m_pumpState = DPUMP_STOPPED; + m_stateChangeCount = 0; + m_adjSkip = 0; + m_lastActualPressure = 0; + m_bufValidCount = 0; + for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; + m_bufIdx = 0; + } + if(pulse_100ms && sysPara->para.gearPumpEnable && !sysPara->status.isPumpValveControledByHand && ControledSwitchFlag ) { + pressureAdj(); + + } + } } else{ - // 开机自检完成的前提下 - if (!sysPara->status.airPushing || ui->tabMainWindow->m_2sFlag) { - autoControlValvePump(); - } - // 检测回收泵模式切换,切换时重置泄漏保护学习状态和软启动状态 - if(m_lastReclaimMode != sysPara->para.flagOfReclaimPumEnable) - { - m_lastReclaimMode = sysPara->para.flagOfReclaimPumEnable; - gearPumpRunNormalFlag = false; // 泄漏保护重新学习 - gearPumpRunNormalValue = 0.0f; - m_rampDone = false; // 软启动重新爬坡适应新上限 - m_adjSkip = 0; - m_lastPressure = 0; - m_stableCount = 0; - for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; - m_bufIdx = 0; - } - if(pulse_100ms && sysPara->para.gearPumpEnable && !sysPara->status.isPumpValveControledByHand && ControledSwitchFlag ) { - pressureAdj(); - + static bool flag = 1; + if(delay3s){ + if(flag){ + flag = 0; + LogInfo::setRunStatusText(tr("缺少墨水,喷码机不能正常工作!")); + qDebug()<<"缺少墨水,喷码机不能正常工作!"; + } + ui->tabMainWindow->setRunStatus(tr("缺少墨水,喷码机不能正常工作!")); } } - } - else{ - static bool flag = 1; - if(delay3s){ - if(flag){ - flag = 0; - LogInfo::setRunStatusText(tr("缺少墨水,喷码机不能正常工作!")); - qDebug()<<"缺少墨水,喷码机不能正常工作!"; - } - ui->tabMainWindow->setRunStatus(tr("缺少墨水,喷码机不能正常工作!")); + /*----------------------------控制温度--------------------------------------*/ + if(pulse_300ms){ + autoControlHeater(); + sysPara->devOp->readSyncCounterAtZero(); } - } - /*----------------------------控制温度--------------------------------------*/ - if(pulse_300ms){ - autoControlHeater(); - sysPara->devOp->readSyncCounterAtZero(); - } sysPara->status.lostCommuFlag = lostCommuFlag; //务必放在后面 static unsigned int lastProductCnt =0; @@ -1652,10 +1697,10 @@ void InkJetPrinter::timerHandler(void){ if(pulse_300ms){ if (manager_rfid) manager_rfid->handleCheck(addr); - } + } #endif - if(pulse_300ms){ + if(pulse_300ms){ sysPara->devOp->readCalandarDat(); //务必读一下此数据 if(sysPara->status.RandomNum>0) sysPara->devOp->Read_RanddomFromFpga(); @@ -1729,12 +1774,12 @@ void InkJetPrinter::timerHandler(void){ if(sysPara->para.speedoverPaushPrint) { ui->tabMainWindow->on_pushButtonPausePrint_pressed();// 2014-03-19 - // emit OnSpeedOver(2);//QMessageBox::warning(NULL,tr("警告"),tr("喷印速度过快!无法喷印完全,自动暂停喷印!!!")); +// emit OnSpeedOver(2);//QMessageBox::warning(NULL,tr("警告"),tr("喷印速度过快!无法喷印完全,自动暂停喷印!!!")); ui->tabMainWindow->setRunStatus(tr("喷印速度过快!无法喷印完全,自动暂停喷印!!!")); } else { - // emit OnSpeedOver(1);//QMessageBox::warning(NULL,tr("警告"),tr("喷印速度过快!无法喷印完全!!!")); +// emit OnSpeedOver(1);//QMessageBox::warning(NULL,tr("警告"),tr("喷印速度过快!无法喷印完全!!!")); ui->tabMainWindow->setRunStatus(tr("喷印速度过快!无法喷印完全!!!")); } @@ -1768,14 +1813,14 @@ void InkJetPrinter::timerHandler(void){ } #ifdef __RFID_CARD - /*****************墨水刷卡控制start**********************************************/ + /*****************墨水刷卡控制start**********************************************/ /*墨水刷卡新的控制逻辑*/ - /* 1.任何时候,打印墨点数达到2.3billion之后,提示24小时内刷卡,否则禁止使用机器*/ + /* 1.任何时候,打印墨点数达到2.3billion之后,提示24小时内刷卡,否则禁止使用机器*/ /*2.当墨水液位后,持续提示刷卡,24小时后如果还没有刷卡,禁止使用机器*/ static bool logFlag4 = 1; static int warnNum1 = 0; if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN)) - warnNum1 = 0; + warnNum1 = 0; if((sysPara->status.statWarn & WARN_STATUS_INK_WARN) || sysPara->para.RFIDInkWarn){ if(!sysPara->para.RFIDInkWarn){ if(++warnNum1 >6){ @@ -1815,28 +1860,28 @@ void InkJetPrinter::timerHandler(void){ if(sysPara->RFIDPara.PrintInkDots >= MAX_INK_DOTS || sysPara->para.RFIDInkWarn){ sysPara->status.flagOfNeedInkCard = true; if(sysPara->RFIDPara.InkRFIDCnt == 0){ - msgtest->setText(tr("请使用原厂墨水,然后刷墨水卡,否则机器将在24小时后禁止使用!")); - msgtest->show(); - ui->tabMainWindow->setRunStatus(tr("请使用原厂墨水,然后刷墨水卡,否则机器将在24小时后禁止使用!")); - LogInfo::setRunStatusText(tr("请使用原厂墨水,然后刷墨水卡,否则机器将在24小时后禁止使用!")); - } - int timeRemain = (MAX_INK_RFIDTIME - sysPara->RFIDPara.InkRFIDCnt)/60; - if(timeRemain > 60){ - if(sysPara->RFIDPara.PrintInkDots >= MAX_INK_DOTS) - ui->tabMainWindow->setRunStatus(tr("1.请使用原厂墨水,然后刷墨水卡,否则机器将在%1小时后禁止使用!").arg(timeRemain/60)); - else - ui->tabMainWindow->setRunStatus(tr("2.请使用原厂墨水,然后刷墨水卡,否则机器将在%1小时后禁止使用!").arg(timeRemain/60)); - } - else if(timeRemain > 0){ - if(sysPara->RFIDPara.PrintInkDots >= MAX_INK_DOTS) - ui->tabMainWindow->setRunStatus(tr("1.请使用原厂墨水,然后刷墨水卡,否则机器将在%1分钟后禁止使用!").arg(timeRemain)); - else - ui->tabMainWindow->setRunStatus(tr("2.请使用原厂墨水,然后刷墨水卡,否则机器将在%1分钟后禁止使用!").arg(timeRemain)); - } - if(sysPara->RFIDPara.InkRFIDCnt % 300 == 0) - sysPara->saveRFIDPara(); - if(++sysPara->RFIDPara.InkRFIDCnt >= MAX_INK_RFIDTIME) - sysPara->status.flagOfInkMaxDot = true; + msgtest->setText(tr("请使用原厂墨水,然后刷墨水卡,否则机器将在24小时后禁止使用!")); + msgtest->show(); + ui->tabMainWindow->setRunStatus(tr("请使用原厂墨水,然后刷墨水卡,否则机器将在24小时后禁止使用!")); + LogInfo::setRunStatusText(tr("请使用原厂墨水,然后刷墨水卡,否则机器将在24小时后禁止使用!")); + } + int timeRemain = (MAX_INK_RFIDTIME - sysPara->RFIDPara.InkRFIDCnt)/60; + if(timeRemain > 60){ + if(sysPara->RFIDPara.PrintInkDots >= MAX_INK_DOTS) + ui->tabMainWindow->setRunStatus(tr("1.请使用原厂墨水,然后刷墨水卡,否则机器将在%1小时后禁止使用!").arg(timeRemain/60)); + else + ui->tabMainWindow->setRunStatus(tr("2.请使用原厂墨水,然后刷墨水卡,否则机器将在%1小时后禁止使用!").arg(timeRemain/60)); + } + else if(timeRemain > 0){ + if(sysPara->RFIDPara.PrintInkDots >= MAX_INK_DOTS) + ui->tabMainWindow->setRunStatus(tr("1.请使用原厂墨水,然后刷墨水卡,否则机器将在%1分钟后禁止使用!").arg(timeRemain)); + else + ui->tabMainWindow->setRunStatus(tr("2.请使用原厂墨水,然后刷墨水卡,否则机器将在%1分钟后禁止使用!").arg(timeRemain)); + } + if(sysPara->RFIDPara.InkRFIDCnt % 300 == 0) + sysPara->saveRFIDPara(); + if(++sysPara->RFIDPara.InkRFIDCnt >= MAX_INK_RFIDTIME) + sysPara->status.flagOfInkMaxDot = true; } if(sysPara->status.flagOfInkMaxDot){ @@ -1868,7 +1913,7 @@ void InkJetPrinter::timerHandler(void){ /*****************溶剂刷卡控制start**********************************************/ /*溶剂刷卡新的控制逻辑*/ - /* 1.任何时候,混合阀打开次数达到360次,提示2小时关机,必须刷卡才能恢复*/ + /* 1.任何时候,混合阀打开次数达到360次,提示2小时关机,必须刷卡才能恢复*/ /*2.溶剂液位报警后,提示刷卡,允许有10次的混合阀打开次数,必须刷卡才能恢复*/ if(sysPara->RFIDPara.solventNumber >= MAX_SOLV_OPENNUM){ //混合阀打开次数达到360次 sysPara->status.flagOfNeedSolventCard = true; @@ -1889,7 +1934,7 @@ void InkJetPrinter::timerHandler(void){ static bool logFlag5 = 1; static int warnNum2 = 0; if(!(sysPara->status.statWarn & WARN_STATUS_SOLV_WARN)) - warnNum2 = 0; + warnNum2 = 0; if((sysPara->status.statWarn & WARN_STATUS_SOLV_WARN) || sysPara->para.RFIDSolventWarn){ if(!sysPara->para.RFIDSolventWarn){ if(++warnNum2 > 6){ @@ -1937,7 +1982,7 @@ void InkJetPrinter::timerHandler(void){ ui->tabMainWindow->on_pushButtonStopPrint_pressed(); static bool logFlag3 = true; if(sysPara->para.RFIDSolventWarnMixCnt>=10){ - ui->tabMainWindow->setRunStatus(tr("请刷溶剂卡以恢复机器的正常功能")); + ui->tabMainWindow->setRunStatus(tr("请刷溶剂卡以恢复机器的正常功能")); if(logFlag3){ logFlag3 = false; msgtest->setText(tr("请刷溶剂卡以恢复机器的正常功能!")); @@ -2055,7 +2100,7 @@ void InkJetPrinter::timerHandler(void){ if(pulse_100ms) { if(pre_hvcurrent>150 && ( sysPara->status.HV_DETOUT> pre_hvcurrent+20) && (sysPara->status.waitHightVolOn==8 || sysPara->status.waitHightVolOff==1) && sysPara->status.isPrinting ) - pre_hvcurrent = sysPara->status.HV_DETOUT; + pre_hvcurrent = sysPara->status.HV_DETOUT; if(sysPara->status.waitHightVolOn<8)sysPara->status.waitHightVolOn++; if(sysPara->status.isPrinting==0) sysPara->status.waitHightVolOn=0; @@ -2067,37 +2112,28 @@ void InkJetPrinter::timerHandler(void){ } else if(pulse_1s && sysPara->para.gearPumpEnable && sysPara->status.selfCheckDone && (!sysPara->status.statWarn) && !sysPara->status.powerOffAppending){ - if((!sysPara->para.flagOfReclaimPumEnable && sysPara->status.gearPumpRunSpeed <= 2000) - ||(sysPara->para.flagOfReclaimPumEnable && sysPara->status.gearPumpRunSpeed <= sysPara->para.gearPumpSpeedAlarm)) + // 隔膜泵速度告警逻辑:检测转速是否异常超过最大工作转速 + // 最大工作转速对应的RPM约为:300 * 60 * 1000 / (500 * 2) = 1800 RPM + // 给予余量,告警阈值设为2200 RPM + const int MAX_SPEED_ALARM = 2200; + + if(sysPara->status.gearPumpRunSpeed <= MAX_SPEED_ALARM) { pulse_30s = 0; } else{ pulse_30s++; if(pulse_30s >= 30){ - if((sysPara->status.gearPumpRunSpeed >= 2500)||(sysPara->devOp->color_flag == 2) - ||(sysPara->para.flagOfReclaimPumEnable && sysPara->status.gearPumpRunSpeed > sysPara->para.gearPumpSpeedAlarm)) - { - sysPara->status.flagOfSpeedAlarm = true; - sysPara->devOp->color_flag = 2; - if(pulse_30s % 500 == 0){ - LogInfo::setRunStatusText(tr("齿轮泵转速过高,请立即停机并联系供应商!")); - qDebug()<<"齿轮泵转速过高,请立即停机并联系供应商!"; - } - ui->tabMainWindow->setRunStatus(tr("齿轮泵转速过高,请立即停机并联系供应商!")); - sysPara->devOp->controlRedLight(true); - if(sysPara->status.isPrinting) - ui->tabMainWindow->on_pushButtonStopPrint_pressed(); - } - else{ - sysPara->devOp->color_flag = 1; - if(pulse_30s % 500 == 0){ - LogInfo::setRunStatusText(tr("齿轮泵转速过高,请清理过滤器或者检查是否泄露!")); - qDebug()<<"齿轮泵转速过高,请清理过滤器或者检查是否泄露!"; - } - ui->tabMainWindow->setRunStatus(tr("齿轮泵转速过高,请清理过滤器或者检查是否泄露!")); - sysPara->devOp->controlYellowLight(true); + sysPara->status.flagOfSpeedAlarm = true; + sysPara->devOp->color_flag = 2; + if(pulse_30s % 500 == 0){ + LogInfo::setRunStatusText(tr("泵转速异常过高,请立即停机并联系供应商!")); + qDebug()<<"泵转速异常过高,请立即停机并联系供应商!"; } + ui->tabMainWindow->setRunStatus(tr("泵转速异常过高,请立即停机并联系供应商!")); + sysPara->devOp->controlRedLight(true); + if(sysPara->status.isPrinting) + ui->tabMainWindow->on_pushButtonStopPrint_pressed(); } if(pulse_30s % 10 == 0) qDebug()<<"粘度: "<status.viscosity); @@ -2167,6 +2203,8 @@ void InkJetPrinter::cnt1GroupCheck(void) static unsigned char lastGroupRunningIndex = 0; if(sysPara->para.cnt1ByGroupEnalbe) { + + sysPara->devOp->ReadCnt1GroupStatus(); if(lastGroupRunningIndex == sysPara->status.cnt1GroupRunningIndex) return; @@ -2313,34 +2351,34 @@ void InkJetPrinter::autoControlValvePump(void) } /*-----------------------------------主墨泵------------------------------------------*/ - if(sysPara->status.SEPTAL_POSITION < (sysPara->para.septalPostion - DIFF_SEPTAL_POSITION)) - sysPara->status.septalPositionOverFlowCnt ++; - else - sysPara->status.septalPositionOverFlowCnt = 0; - if(sysPara->status.septalPositionOverFlowCnt > 2 && !sysPara->status.mainInkPumpError){ //主墨泵 - if(!sysPara->devOp->isMainInkPumpOpen()){ - sysPara->devOp->controlMainInkPump(true); - sysPara->status.mainInkPumpRunTmCnt = 0; - } - else if(sysPara->status.selfCheckDone){ - if(sysPara->status.mainInkPumpRunTmCnt < MAX_MAIN_INK_PUMP_RUN_TIME){ // - sysPara->status.mainInkPumpRunTmCnt ++; + if(sysPara->status.SEPTAL_POSITION < (sysPara->para.septalPostion - DIFF_SEPTAL_POSITION)) + sysPara->status.septalPositionOverFlowCnt ++; + else + sysPara->status.septalPositionOverFlowCnt = 0; + if(sysPara->status.septalPositionOverFlowCnt > 2 && !sysPara->status.mainInkPumpError){ //主墨泵 + if(!sysPara->devOp->isMainInkPumpOpen()){ + sysPara->devOp->controlMainInkPump(true); + sysPara->status.mainInkPumpRunTmCnt = 0; } - else { - if(!sysPara->para.gearPumpEnable) - { - sysPara->status.mainInkPumpError = true; - sysPara->devOp->controlMainInkPump(false); - LogInfo::setRunStatusText(tr("错误!!!!!!!!!!!主墨泵故障")); - ui->tabMainWindow->setRunStatus(tr("主墨泵故障!!!")); + else if(sysPara->status.selfCheckDone){ + if(sysPara->status.mainInkPumpRunTmCnt < MAX_MAIN_INK_PUMP_RUN_TIME){ // + sysPara->status.mainInkPumpRunTmCnt ++; + } + else { + if(!sysPara->para.gearPumpEnable) + { + sysPara->status.mainInkPumpError = true; + sysPara->devOp->controlMainInkPump(false); + LogInfo::setRunStatusText(tr("错误!!!!!!!!!!!主墨泵故障")); + ui->tabMainWindow->setRunStatus(tr("主墨泵故障!!!")); + } } } } - } - else if(sysPara->status.SEPTAL_POSITION > sysPara->para.septalPostion){ - if(sysPara->devOp->isMainInkPumpOpen()) - sysPara->devOp->controlMainInkPump(false); - } + else if(sysPara->status.SEPTAL_POSITION > sysPara->para.septalPostion){ + if(sysPara->devOp->isMainInkPumpOpen()) + sysPara->devOp->controlMainInkPump(false); + } /*-----------------------------------压缩机------------------------------------------*/ if((sysPara->para.pressure - sysPara->status.PRESSURE > MAX_PRESSURE_DIFF) && !sysPara->status.compressPumpError){ //压缩机 @@ -2372,130 +2410,130 @@ void InkJetPrinter::autoControlValvePump(void) /*------------------------------------粘度泵,混合阀-----------------------------------------*/ /*-----------------------------每30s打开一次粘度泵以及相关处理--------------------------------------*/ - static bool hasDetectedBellow = false; // 检测到下位灯 - static bool hasDetectedTop = false; // 检测到上位灯 - static int viscosity_low = 0; //统计粘度连续偏低10%次数 - static unsigned char Mixing_valve_open = 0; //统计粘度连续偏高5%次数 - static unsigned char viscosity_faulty_num = 0; //统计粘度连续偏高13%次数 - static bool flag = 0; + static bool hasDetectedBellow = false; // 检测到下位灯 + static bool hasDetectedTop = false; // 检测到上位灯 + static int viscosity_low = 0; //统计粘度连续偏低10%次数 + static unsigned char Mixing_valve_open = 0; //统计粘度连续偏高5%次数 + static unsigned char viscosity_faulty_num = 0; //统计粘度连续偏高13%次数 + static bool flag = 0; - if(sysPara->status.cycleValveOpenCntAfterSWintOff) { //关闭墨线的时候要提前开粘度泵 - sysPara->status.viscosityDelayCnt = sysPara->para.viscosityPumpInterval*100 + 100; - } - ++sysPara->status.viscosityDelayCnt; - int mixer_open_threshold = (105*sysPara->para.viscosity)/100; - int viscosity_faulty_threshold =(113*sysPara->para.viscosity)/100; - if(sysPara->status.viscosityDelayCnt >= sysPara->para.viscosityPumpInterval*100 && flag == 0) - { - flag=1; - if (!sysPara->devOp->isViscosityPumpOpen()) + if(sysPara->status.cycleValveOpenCntAfterSWintOff) { //关闭墨线的时候要提前开粘度泵 + sysPara->status.viscosityDelayCnt = sysPara->para.viscosityPumpInterval*100 + 100; + } + ++sysPara->status.viscosityDelayCnt; + int mixer_open_threshold = (105*sysPara->para.viscosity)/100; + int viscosity_faulty_threshold =(113*sysPara->para.viscosity)/100; + if(sysPara->status.viscosityDelayCnt >= sysPara->para.viscosityPumpInterval*100 && flag == 0) { - sysPara->devOp->controlViscosityPump(true); - viscosity_timer->start(10000); - qDebug()<<"粘度: "<status.viscosity); - } - if((sysPara->status.viscosity >= 90*sysPara->para.viscosity/100) && (sysPara->status.viscosity <= mixer_open_threshold)) - { - sysPara->status.viscosityFault = 0; - viscosity_low=0; - Mixing_valve_open = 0; - viscosity_faulty_num = 0; - } - if(sysPara->status.viscosity < 90*sysPara->para.viscosity/100) - { - viscosity_low++; - viscosity_faulty_num = 0; - Mixing_valve_open = 0; - } - if(sysPara->status.viscosity > mixer_open_threshold && sysPara->status.viscosity <= viscosity_faulty_threshold) - { - Mixing_valve_open++; - viscosity_low = 0; - viscosity_faulty_num = 0; - } - if(sysPara->status.viscosity > viscosity_faulty_threshold){ - Mixing_valve_open++; - viscosity_faulty_num++; - viscosity_low = 0; - } + flag=1; + if (!sysPara->devOp->isViscosityPumpOpen()) + { + sysPara->devOp->controlViscosityPump(true); + viscosity_timer->start(10000); + qDebug()<<"粘度: "<status.viscosity); + } + if((sysPara->status.viscosity >= 90*sysPara->para.viscosity/100) && (sysPara->status.viscosity <= mixer_open_threshold)) + { + sysPara->status.viscosityFault = 0; + viscosity_low=0; + Mixing_valve_open = 0; + viscosity_faulty_num = 0; + } + if(sysPara->status.viscosity < 90*sysPara->para.viscosity/100) + { + viscosity_low++; + viscosity_faulty_num = 0; + Mixing_valve_open = 0; + } + if(sysPara->status.viscosity > mixer_open_threshold && sysPara->status.viscosity <= viscosity_faulty_threshold) + { + Mixing_valve_open++; + viscosity_low = 0; + viscosity_faulty_num = 0; + } + if(sysPara->status.viscosity > viscosity_faulty_threshold){ + Mixing_valve_open++; + viscosity_faulty_num++; + viscosity_low = 0; + } - if((!sysPara->devOp->isMixValveOpen()) && (((Mixing_valve_open > 1) && (!sysPara->para.gearPumpEnable)) || ((Mixing_valve_open > 4) && sysPara->para.gearPumpEnable))) { // - sysPara->devOp->controlMixValve(true); - Mixing_valve_open = 0; - LogInfo::setRunStatusText(tr("添加溶剂:")+QString::number(sysPara->status.viscosity)); - qDebug()<<"添加溶剂"; - } + if((!sysPara->devOp->isMixValveOpen()) && (((Mixing_valve_open > 1) && (!sysPara->para.gearPumpEnable)) || ((Mixing_valve_open > 4) && sysPara->para.gearPumpEnable))) { // + sysPara->devOp->controlMixValve(true); + Mixing_valve_open = 0; + LogInfo::setRunStatusText(tr("添加溶剂:")+QString::number(sysPara->status.viscosity)); + qDebug()<<"添加溶剂"; + } - if(viscosity_low >= 60) + if(viscosity_low >= 60) + { + LogInfo::setRunStatusText(tr("警告!!!!!!!!!!!粘度值偏低")+QString::number(sysPara->status.viscosity)); + qDebug()<<"粘度值偏低"; + sysPara->status.viscosityFault = 2; + if(sysPara->devOp->isMixValveOpen()) { + sysPara->devOp->controlMixValve(false); + } + } + if(viscosity_faulty_num >= 5) + { + LogInfo::setRunStatusText(tr("错误!!!!!!!!!!!粘度偏大故障")+QString::number(sysPara->status.viscosity)); + qDebug()<<"粘度偏大故障"; + sysPara->status.viscosityFault = 1; + } + + } + if((sysPara->status.viscosityDelayCnt >= (sysPara->para.viscosityPumpInterval*100+120)) && flag==1) { - LogInfo::setRunStatusText(tr("警告!!!!!!!!!!!粘度值偏低")+QString::number(sysPara->status.viscosity)); - qDebug()<<"粘度值偏低"; - sysPara->status.viscosityFault = 2; if(sysPara->devOp->isMixValveOpen()) { sysPara->devOp->controlMixValve(false); } } - if(viscosity_faulty_num >= 5) + + if((sysPara->status.viscosityDelayCnt >= (sysPara->para.viscosityPumpInterval*100+130)) && flag==1) { - LogInfo::setRunStatusText(tr("错误!!!!!!!!!!!粘度偏大故障")+QString::number(sysPara->status.viscosity)); - qDebug()<<"粘度偏大故障"; - sysPara->status.viscosityFault = 1; + if (sysPara->devOp->isViscosityPumpOpen()) { + sysPara->devOp->controlViscosityPump(false); + } + sysPara->status.viscosityDelayCnt = 0; + flag=0; } - } - if((sysPara->status.viscosityDelayCnt >= (sysPara->para.viscosityPumpInterval*100+120)) && flag==1) - { - if(sysPara->devOp->isMixValveOpen()) { - sysPara->devOp->controlMixValve(false); + if(sysPara->status.statWarn & WARN_STATUS_VISCOTITY_MEASURE_READY){ //上位灯检测标志位 + viscosity_timer->stop(); } - } - if((sysPara->status.viscosityDelayCnt >= (sysPara->para.viscosityPumpInterval*100+130)) && flag==1) - { - if (sysPara->devOp->isViscosityPumpOpen()) { - sysPara->devOp->controlViscosityPump(false); - } - sysPara->status.viscosityDelayCnt = 0; - flag=0; - } - - if(sysPara->status.statWarn & WARN_STATUS_VISCOTITY_MEASURE_READY){ //上位灯检测标志位 - viscosity_timer->stop(); - } - - if(sysPara->status.viscosityDelayCnt < sysPara->para.viscosityPumpInterval*100) { - static int detectBelow = 0; - if (++detectBelow%400 == 0) { - if(sysPara->status.statWarn & WARN_STATUS_VISCOTITY_MEASURE_READY) - { - if(sysPara->status.rWarnViscoReady>=15){ - sysPara->status.viscosityFault = 1; - sysPara->status.viscosity=0; - if(!firstTime) - qDebug()<<"错误!粘度计下位灯故障."+QString::number(sysPara->status.viscosity); - // LogInfo::setRunStatusText(tr("错误!粘度计下位灯故障.")+QString::number(sysPara->status.viscosity)); - hasDetectedBellow = true; + if(sysPara->status.viscosityDelayCnt < sysPara->para.viscosityPumpInterval*100) { + static int detectBelow = 0; + if (++detectBelow%400 == 0) { + if(sysPara->status.statWarn & WARN_STATUS_VISCOTITY_MEASURE_READY) + { + if(sysPara->status.rWarnViscoReady>=15){ + sysPara->status.viscosityFault = 1; + sysPara->status.viscosity=0; + if(!firstTime) + qDebug()<<"错误!粘度计下位灯故障."+QString::number(sysPara->status.viscosity); + // LogInfo::setRunStatusText(tr("错误!粘度计下位灯故障.")+QString::number(sysPara->status.viscosity)); + hasDetectedBellow = true; + } + else sysPara->status.rWarnViscoReady++; + } + else { + sysPara->status.rWarnViscoReady = 0; + sysPara->status.viscosityFault = 0; } - else sysPara->status.rWarnViscoReady++; - } - else { - sysPara->status.rWarnViscoReady = 0; - sysPara->status.viscosityFault = 0; } } - } - if(hasDetectedBellow && hasDetectedTop) - { - if(sysPara->devOp->isMixValveOpen()) { // - sysPara->devOp->controlMixValve(false); //如果检测不到上下位灯就关掉混合阀 + if(hasDetectedBellow && hasDetectedTop) + { + if(sysPara->devOp->isMixValveOpen()) { // + sysPara->devOp->controlMixValve(false); //如果检测不到上下位灯就关掉混合阀 + } } - } - if(sysPara->status.viscosityFault==0) - { - hasDetectedBellow = false; - hasDetectedTop = false; - } - // } + if(sysPara->status.viscosityFault==0) + { + hasDetectedBellow = false; + hasDetectedTop = false; + } +// } /*-----------------------------------回收泵------------------------------------------*/ if(!sysPara->status.autoCtlReclaimAfterSWintOff) @@ -2611,10 +2649,10 @@ void InkJetPrinter::detectAndcontrolReclaimTank(){ sysPara->status.currReclaimTankPos =10*sysPara->status.curr_reclaimTankTime; sysPara->status.reclaimTankBlockedAppending =0; //qDebug()<status.reclaimTankstatus; - // if(sysPara->status.currReclaimTankPos == 0) - // ui->tabMainWindow->setReBootQtUIEnable(false); - // else - // ui->tabMainWindow->setReBootQtUIEnable(true); +// if(sysPara->status.currReclaimTankPos == 0) +// ui->tabMainWindow->setReBootQtUIEnable(false); +// else +// ui->tabMainWindow->setReBootQtUIEnable(true); if(sysPara->status.reclaimTankstatus == 0x10) //7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 { @@ -2996,10 +3034,10 @@ void InkJetPrinter::enableInkJetTabClick(bool flag){ } bool InkJetPrinter::eventFilter(QObject *watched, QEvent *event) -{ +{ if(sysPara->status.flagOfKeyBoardType) - return QTabWidget::eventFilter(watched,event); + return QTabWidget::eventFilter(watched,event); QSpinBox *qsb=dynamic_cast(watched); QLineEdit *qle=dynamic_cast(watched); @@ -3030,19 +3068,19 @@ void InkJetPrinter::sendDataManual(QString cmdstr,QString addrstr,QString datast QByteArray data; data.resize(datastr.length() / 2); - for (int i = 0; i < datastr.length(); i += 2) { - // 提取每两个字符 - QString byteString = datastr.mid(i, 2); - // 将16进制字符串转换为unsigned char - bool ok; - unsigned char byte = static_cast(byteString.toUInt(&ok, 16)); - data[i / 2] = byte; - } - // quint16 data1[] = {68, 90, 108, 125, 141, 156, 170, 170, 180, 193, 204, 214}; - const char* charData = data.constData(); + for (int i = 0; i < datastr.length(); i += 2) { + // 提取每两个字符 + QString byteString = datastr.mid(i, 2); + // 将16进制字符串转换为unsigned char + bool ok; + unsigned char byte = static_cast(byteString.toUInt(&ok, 16)); + data[i / 2] = byte; + } +// quint16 data1[] = {68, 90, 108, 125, 141, 156, 170, 170, 180, 193, 204, 214}; + const char* charData = data.constData(); - // 转换为 unsigned char 指针 - const unsigned char* unsignedCharData = reinterpret_cast(charData); + // 转换为 unsigned char 指针 + const unsigned char* unsignedCharData = reinterpret_cast(charData); } void InkJetPrinter::slt_showMsg(QString msg) @@ -3254,14 +3292,14 @@ void InkJetPrinter::checkPressureControl(){ //1s highPressureCnt = 0; if(highPressureCnt >= 4 && sysPara->status.PRESSURE > 1000){ - QString str = tr("压力过高,请检查管路是否堵塞,然后点击故障恢复按钮"); - showMessage(str); - sysPara->para.gearPumpValue = 0; - sysPara->devOp->WriteMoterPump(); - sysPara->status.isPumpValveControledByHand = true; - sysPara->devOp->mainInkCtrl(); - sysPara->status.flagOfPressureFault = true; - } + QString str = tr("压力过高,请检查管路是否堵塞,然后点击故障恢复按钮"); + showMessage(str); + sysPara->para.gearPumpValue = 0; + sysPara->devOp->WriteMoterPump(); + sysPara->status.isPumpValveControledByHand = true; + sysPara->devOp->mainInkCtrl(); + sysPara->status.flagOfPressureFault = true; + } } void InkJetPrinter::showMessage(QString str){ diff --git a/InkJetPrinter.h b/InkJetPrinter.h index 4c62918..14604a9 100644 --- a/InkJetPrinter.h +++ b/InkJetPrinter.h @@ -101,14 +101,32 @@ private: QTimer* viscosity_timer; QTimer* timer; QTime t1; - bool m_rampDone = false; // pressureAdj 软启动完成标志 - int m_adjSkip = 0; // pressureAdj 节拍计数 - int m_lastPressure = 0; // pressureAdj 上次采样压力(稳定检测用) - int m_stableCount = 0; // pressureAdj 压力连续稳定计数 - int m_pressureBuf[10] = {}; // pressureAdj 压力滑动平均缓冲(10点=1s) - int m_bufIdx = 0; // pressureAdj 滑动平均写入索引 - bool m_lastReclaimMode = false; // 上次 flagOfReclaimPumEnable 状态,用于检测切换 - bool m_lastByHand = false; // 上次 isPumpValveControledByHand 状态,用于检测手动、自动 + + // 隔膜泵状态枚举 + enum DiaphragmPumpState { + DPUMP_STOPPED = 0, // 停止状态 + DPUMP_STARTING = 1, // 启动爬升状态 + DPUMP_RUNNING = 2 // 运行微调状态 + }; + + // 隔膜泵控制参数 + DiaphragmPumpState m_pumpState = DPUMP_STOPPED; // 泵当前状态 + int m_stateChangeCount = 0; // 状态切换计数器(用于实现800ms间隔) + int m_adjSkip = 0; // 调节跳过计数器 + int m_lastActualPressure = 0; // 上次实时压力(微分项用) + int m_startingStepCount = 0; // 启动步进计数器 + int m_pressureBuf[10] = {}; // 压力滑动平均缓冲(10点=1s) + int m_bufIdx = 0; // 滑动平均写入索引 + int m_bufValidCount = 0; // 缓冲区有效点数(用于启动阶段判断) + bool m_lastReclaimMode = false; // 上次回收泵使能状态 + bool m_lastByHand = false; // 上次手动控制状态 + + // 隔膜泵控制函数 + float calculateTargetSpeed(int err); + void handleStoppedState(int err, bool canSwitch); + void handleStartingState(int err, int actual, int target); + void handleRunningState(int err, bool canSwitch); + void autoControlHeater(); void autoControlValvePump(); void detectAndcontrolReclaimTank(); diff --git a/PrintSetting.cpp b/PrintSetting.cpp index 2bb5864..929eb9c 100644 --- a/PrintSetting.cpp +++ b/PrintSetting.cpp @@ -417,13 +417,14 @@ void PrintSetting::updateSysParaToUI(){ void PrintSetting::showMachInfo(QString Mac) { QString VernonBach; - VernonBach.sprintf("%d.%d.%02d%s%s_", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); + VernonBach.sprintf("%s.%s.", MACHINAE_VER, PUMP_VER); VernonBach = VernonBach + (QString) Public::DateToString(__DATE__)+"_";//+UP_PRINTER_STAGE_VER; } void PrintSetting::showRemoteControl(QString SuperNodeIP,QString EdgeIP) { QString VernonBach; - VernonBach.sprintf("%d.%d.%02d%s%s_", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); +// VernonBach.sprintf("%d.%d.%02d%s%s_", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); + VernonBach=SUB_RFID; VernonBach = VernonBach + (QString) Public::DateToString(__DATE__)+"_";//+UP_PRINTER_STAGE_VER; } diff --git a/Public.cpp b/Public.cpp index ac18abe..c85d698 100644 --- a/Public.cpp +++ b/Public.cpp @@ -369,33 +369,12 @@ QString Public::DateToString(char const *time){ int month, day, year; //struct tm t = {0}; static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; -//qDebug()<test_version->setText(s); ui->checkBoxEleEyeMakeClean->setVisible(false); tr("独立参数"); @@ -398,16 +396,6 @@ void TriggerCtrl::updateSysStatusToUI(){ ui->spinBoxpluseSinal->setValue(sysPara->para.pulse_sinal_value); t_init = 1; } - // if((sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER)) - // { - // ui->lineEditPulseCount ->setText(QString::number((int )((sysPara->para.synTriggerPrintLenMm)*sysPara->para.synPulseNumPerMm))); - // } - // else if(((sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL - // ||sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE) - // && sysPara->para.eleEyeTriggerSynPrintEn)) - // { - // ui->lineEditPulseCount ->setText(QString::number( (int )((sysPara->para.elecEyeTriggerInterval)*sysPara->para.synPulseNumPerMm))); - // } } } @@ -511,11 +499,9 @@ void TriggerCtrl::on_checkBoxPulseOutputEnable_clicked() void TriggerCtrl::setBuildTime(QString s1) { QString s; - s.sprintf("A%d.%d.%02d%s%s_", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); - s = s + (QString) Public::DateToString(__DATE__)+ "_"+ QString(__TIME__); - // hlp :邓总要求,采用新的格式进行转换 0727 -// s = Public::ArmDate2String(__DATE__, __TIME__); - +// s.sprintf("A%d.%d.%02d%s%s_", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); + s.sprintf("%s.%s.", MACHINAE_VER, PUMP_VER); + s = s + (QString) Public::DateToString(__DATE__)+"."+SUB_VER+SUB_RFID;//+ "_"+ QString(__TIME__) ui->test_version->setText(s+s1); } diff --git a/VerBVersion.h b/VerBVersion.h index f725d18..5360602 100644 --- a/VerBVersion.h +++ b/VerBVersion.h @@ -2,21 +2,17 @@ #define VERBVERSION_H #include "myinclude.h" /* - Major.Minor.Rivison.yyyy-MM-DD_Beta + VX5.D.0826.0100-C + MACHINAE_VER.PUMP_VER.MMdd.SUB_VER+SUB_RFID */ -#define UP_PRINTER_MAJOR_VER 6 -#define UP_PRINTER_MINOR_VER 8 -#define UP_PRINTER_RIVISION_VER 3 -// #define SUB_VERSION "_GuiL" -//#define SUB_VERSION "_JingZ" -//#define SUB_VERSION "_RFID" -#define SUB_VERSION "_Std" -// #define SUB_VERSION "_Std_VZ" +#define MACHINAE_VER "VX5" +#define PUMP_VER "D" +#define SUB_VER "0100" #ifdef __RFID_OLD #define SUB_RFID "_RO" #else -#define SUB_RFID "" +#define SUB_RFID "-C" #endif //#define UP_PRINTER_STAGE_VER "Std" //#define UP_PRINTER_STAGE_VER "Beta" diff --git a/mainwindow.cpp b/mainwindow.cpp index b6d4c08..8d40487 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -706,12 +706,12 @@ bool MainWindow::updatePhaseIndicatorLight(){ return sysPara->status.lastPhaseFault; } -int MainWindow::getMaxSpeedCalcPara(){ +double MainWindow::getMaxSpeedCalcPara(){ sysPara->para.printRowDelay = sysPara->para.currPrintMode; if(sysPara->status.isPrinting == false) sysPara->status.pixNumPerCol = sysPara->status.currPrintRow; - else - sysPara->status.currPrintRow = sysPara->status.pixNumPerCol; + // else + // sysPara->status.currPrintRow = sysPara->status.pixNumPerCol; sysPara->para.pixNumPerCol = sysPara->status.pixNumPerCol; sysPara->para.reducedPixelNum = sysPara->para.reducedPixelNumRatio*sysPara->para.pixNumPerCol/100; @@ -724,9 +724,15 @@ int MainWindow::getMaxSpeedCalcPara(){ int dotNum = sysPara->para.divideRatio?(FPGA_SYS_HZ/(sysPara->para.divideRatio*2)):0;// 1s时间内墨点数 (即晶振频率 64000) int colNum = dotNumPerCol?dotNum/dotNumPerCol:0; // 第列可用墨点数 = 1s时间内墨点数/ 列需要墨点数 - int pulseNum = colNum*sysPara->para.synNumPerCol/(1<<8); //synNumPerCol是被放大后的值 + double pulseNum = colNum*sysPara->para.synNumPerCol/(1<<8); //synNumPerCol是被放大后的值 - return pulseNum; + if(sysPara->para.divideRatio == 0 || sysPara->para.synPulseNumPerMm == 0) + return 600.0f; + + double freq = (FPGA_SYS_HZ/(sysPara->para.divideRatio*2)); + double ddotNumPerCol = sysPara->status.currPrintRow - (sysPara->status.currPrintRow * sysPara->para.reducedPixelNumRatio / 100.0); + pulseNum = sysPara->para.printColDelay / sysPara->para.synPulseNumPerMm / 1000.0 * freq / ddotNumPerCol * 60.0; + return qBound(0.0, pulseNum, 600.0); } static int reclaimTankDelay = 0; @@ -792,8 +798,8 @@ void MainWindow::updateSysStatusToUI(){ //100ms } else { - int pulsePS = getMaxSpeedCalcPara();//No67 - maxMM = (pulsePS/sysPara->para.synPulseNumPerMm) * 60;// 列的最大间距 + double speed = getMaxSpeedCalcPara();//No67 + maxMM = int(speed * 1000.0); } ui->labelSynRate->setText(tr("%1.%2[%3.%4]米/分").arg(mm/1000).arg(mm%1000,3,10,QLatin1Char('0')) .arg(maxMM/1000).arg(maxMM%1000,3,10,QLatin1Char('0'))); @@ -846,8 +852,8 @@ void MainWindow::updateSysStatusToUI(){ //100ms emit readFPGAVersionReady(); logflag5 = false; sysPara->devOp->writeFpgaPrintPara(true); - QString ARM_Version; - ARM_Version.sprintf("%d.%d.%02d%s%s", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); + QString ARM_Version = SUB_RFID; +// ARM_Version.sprintf("%d.%d.%02d%s%s", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); ui->labelFpgaVersionNum->setText(QString("A%1/F%2.%3.%4").arg(ARM_Version).arg(sysPara->status.fpgaVersionNum >> 12) .arg((sysPara->status.fpgaVersionNum>>8) & 0x0f).arg(sysPara->status.fpgaVersionNum&0xff) ); } @@ -4621,8 +4627,8 @@ void MainWindow::UpdateUIVersion(){ QString STM32Ver = QString("S:%1.%2.%3_B%4").arg((sysPara->status.stm32Verion>>16)&0x7F) .arg((sysPara->status.stm32Verion>>8) & 0xFF).arg(sysPara->status.stm32Verion&0xFF).arg(baudRateValue); - QString VernonBach; - VernonBach.sprintf("A%d.%d.%02d%s%s", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); + QString VernonBach = SUB_RFID; +// VernonBach.sprintf("A%d.%d.%02d%s%s", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); QString Mac = QString::number(sysPara->status.machineMac); LogInfo::showVerionInformation(Mac,VernonBach,fpgaVersion,STM32Ver,sysPara->status.flagOfPowerOnMode); @@ -4642,4 +4648,4 @@ void MainWindow::checkPrintingInterval(){ return; } } -} \ No newline at end of file +} diff --git a/mainwindow.h b/mainwindow.h index 198e426..5a959cc 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -63,7 +63,7 @@ public: void enableReclaimCtrlButton(bool enable); void resetReclaimCtrlButtonText(); void enablePushButtonStart(bool enable); - int getMaxSpeedCalcPara(); + double getMaxSpeedCalcPara(); void PreviewPressed(); int getCurrPrintStatus(); diff --git a/printsetting.ui b/printsetting.ui index 316c1aa..a67e22f 100644 --- a/printsetting.ui +++ b/printsetting.ui @@ -301,7 +301,7 @@ QTabBar::tab:selected {background-color: rgb(255, 170, 127)} QTabBar::tab:!selected {margin-top: 5px;} - 2 + 0