hlp:修改版本号规则

This commit is contained in:
kite_lucs
2026-08-27 09:10:41 +08:00
parent cbeb5f0e0a
commit ee7792077d
12 changed files with 664 additions and 633 deletions
+25 -16
View File
@@ -2700,23 +2700,30 @@ int DevOp::writeFpgaPrintPara(bool ignoreWarn){
QMessageBox::critical(NULL,tr("错误"),tr("在同步计米的情况下无打印串或显示区域为零")); QMessageBox::critical(NULL,tr("错误"),tr("在同步计米的情况下无打印串或显示区域为零"));
} }
else { else {
if(currPrintCol && type == 2){ // if(currPrintCol && type == 2){
int synNumPerCol = displayAreaTotalSynNum*(1<<8)/(currPrintCol*(1 + sysPara->para.charBold)); // int synNumPerCol = displayAreaTotalSynNum*(1<<8)/(currPrintCol*(1 + sysPara->para.charBold));
//加宽的时候,相当于列数翻倍 // //加宽的时候,相当于列数翻倍
if(displayAreaTotalSynNum >= (1<<24)){ // if(displayAreaTotalSynNum >= (1<<24)){
if(!ignoreWarn) // if(!ignoreWarn)
QMessageBox::critical(NULL,tr("错误"),tr("在同步计米的情况下喷印同步脉冲数过多,请检查你的配置")); // QMessageBox::critical(NULL,tr("错误"),tr("在同步计米的情况下喷印同步脉冲数过多,请检查你的配置"));
} // }
if(synNumPerCol >= (1<< 16)){ // if(synNumPerCol >= (1<< 16)){
if(!ignoreWarn) // if(!ignoreWarn)
QMessageBox::critical(NULL,tr("警告"),tr("喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度")); // QMessageBox::critical(NULL,tr("警告"),tr("喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度"));
} // }
if(synNumPerCol < 5){ // if(synNumPerCol < 5){
if(!ignoreWarn) // if(!ignoreWarn)
QMessageBox::critical(NULL,tr("警告"),tr("喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度")); // QMessageBox::critical(NULL,tr("警告"),tr("喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度"));
} // }
sysPara->para.synNumPerCol = synNumPerCol; // 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) { if(sysPara->para.synPulseNumPerMm<1 || sysPara->para.synPulseNumPerMm>50) {
} }
sysPara->para.synPulsePerMmX8 = (unsigned short)((unsigned int)sysPara->para.synPulseNumPerMm <<8); sysPara->para.synPulsePerMmX8 = (unsigned short)((unsigned int)sysPara->para.synPulseNumPerMm <<8);
@@ -3377,6 +3384,8 @@ void DevOp::printCtrl2(int cmd){
} }
unsigned int DevOp::readFpgaVersionNum(){ unsigned int DevOp::readFpgaVersionNum(){
if (sysPara == NULL) return 0;
fpgaRd(0x00EC,&sysPara->status.FPGAChipType,1); fpgaRd(0x00EC,&sysPara->status.FPGAChipType,1);
fpgaRd(0x00FE,(unsigned char *)&sysPara->status.fpgaVersionNum,2); 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)); fpgaRd(READ_BUILD_DAT, (unsigned char *)&sysPara->status.build_dat.builTime, sizeof(sysPara->status.build_dat.builTime));
+275 -237
View File
@@ -26,7 +26,7 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) :
ui(new Ui::InkJetPrinter) ui(new Ui::InkJetPrinter)
{ {
// 隐藏系统任务栏,隐藏后,如果需要激活任务栏,则需要呼出QtUI中的任意弹出式、非全屏窗口,然后使用鼠标将光标移动至屏幕最左侧或最顶部则可以呼出任务栏 // 隐藏系统任务栏,隐藏后,如果需要激活任务栏,则需要呼出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; qInfo() << "Hide system panel ret:" << ret;
// system("ifconfig eth1 down"); // system("ifconfig eth1 down");
@@ -52,14 +52,13 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) :
m_serialThreadFPGA = new QThread; m_serialThreadFPGA = new QThread;
serialFPGA = new Serial("/dev/ttyAS5"); serialFPGA = new Serial("/dev/ttyAS5");
connect(m_serialThreadFPGA,&QThread::started,serialFPGA,&Serial::startInitSlot);
serialFPGA->moveToThread(m_serialThreadFPGA); 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(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(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(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(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(stopSendData(bool)),this,SLOT(stopSendFPGAData(bool)));
connect(serialFPGA,SIGNAL(getFPGAPhaseDetectHighTm(unsigned char*)),this,SLOT(saveFPGAPhaseDetectHighTm(unsigned char*))); connect(serialFPGA,SIGNAL(getFPGAPhaseDetectHighTm(unsigned char*)),this,SLOT(saveFPGAPhaseDetectHighTm(unsigned char*)));
connect(serialFPGA,SIGNAL(getFPGAStatus(unsigned char*)),this,SLOT(saveFPGAStatus(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(); m_serialThreadSTM32 = new QThread();
serialSTM32 = new Serial("/dev/ttyAS2"); serialSTM32 = new Serial("/dev/ttyAS2");
connect(m_serialThreadSTM32,&QThread::started,serialSTM32,&Serial::startInitSlot);
serialSTM32->moveToThread(m_serialThreadSTM32); 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(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))); 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(getSTM32Time(unsigned char*)),this,SLOT(saveSTM32Time(unsigned char*)));
connect(serialSTM32,SIGNAL(stopSendData(bool)),this,SLOT(stopSendSTM32Data(bool))); connect(serialSTM32,SIGNAL(stopSendData(bool)),this,SLOT(stopSendSTM32Data(bool)));
connect(serialSTM32,SIGNAL(powerOffReady()),ui->tabMainWindow,SLOT(powerOffConfirmed())); 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(serialSTM32,SIGNAL(queueSizeSTM32(int)),ui->tabMainWindow,SLOT(showSTM32queuesize(int)));
connect(ui->tabSystemManage,SIGNAL(upgradeSTM32(QString)),serialSTM32,SLOT(upgradeSTM32File(QString))); connect(ui->tabSystemManage,SIGNAL(upgradeSTM32(QString)),serialSTM32,SLOT(upgradeSTM32File(QString)));
connect(ui->tabSystemManage,SIGNAL(enableClick(bool)),this,SLOT(enableInkJetTabClick(bool))); 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())); connect(ui->tabSystemSetting,SIGNAL(pressureAdjust()),this,SLOT(pressureAdjustForsystemseeting()));
#ifdef COUNTER1_BY_GROUP /* 分段计米 */ #ifdef COUNTER1_BY_GROUP /* 分段计米 */
connect(this,SIGNAL(updateCnt1GroupDisp(bool)), connect(this,SIGNAL(updateCnt1GroupDisp(bool)),ui->tabPrintSetting,SLOT(onUpdateCnt1GroupDisp(bool)));
ui->tabPrintSetting,SLOT(onUpdateCnt1GroupDisp(bool)));
#endif #endif
initCntGroup(); initCntGroup();
msgtest = new QMessageBox(this); msgtest = new QMessageBox(this);
connect(msgtest, SIGNAL(finished(int)), this, SLOT(OnFinished(int))); connect(msgtest, SIGNAL(finished(int)), this, SLOT(OnFinished(int)));
msgBox1 = new QMessageBox(this); 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->tabSystemManage,SLOT(engieerModeAcceptSystemManage(bool)));
connect(ui->tabPrintSetting, SIGNAL(engineerMode(bool)), ui->tabSystemSetting, SLOT(setFreqFixVisible(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; sysPara->status.rWarnViscoReady=0;
// hlp: 260608: 以授权为标准,不过度开放权限 // hlp: 260608: 以授权为标准,不过度开放权限
@@ -264,7 +253,7 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) :
sysPara->status.FileChangeRestCntFlag=0; sysPara->status.FileChangeRestCntFlag=0;
sysPara->status.HVFaultCloseEn=0; sysPara->status.HVFaultCloseEn=0;
sysPara->devOp->printCtrl( PRINT_CTRL_STOP); sysPara->devOp->printCtrl( PRINT_CTRL_STOP);
sysPara->devOp->writeFpgaCalandar(1); sysPara->devOp->writeFpgaCalandar(1);//
//qDebug()<<sysPara->para.calandar_and_dat.year; //qDebug()<<sysPara->para.calandar_and_dat.year;
sysPara->status.cnt1GroupRunningIndex=0; sysPara->status.cnt1GroupRunningIndex=0;
//sysPara->status.cnt1RepeatCurrent=0; //sysPara->status.cnt1RepeatCurrent=0;
@@ -308,6 +297,8 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) :
ui->tabMainWindow->enableReclaimCtrlButton(false); ui->tabMainWindow->enableReclaimCtrlButton(false);
//edit@12-14 //edit@12-14
connect(this,SIGNAL(currentChanged(int)),ui->tabMainWindow,SLOT(onInkJetPrinterCurrentChanged(int)), Qt::QueuedConnection); connect(this,SIGNAL(currentChanged(int)),ui->tabMainWindow,SLOT(onInkJetPrinterCurrentChanged(int)), Qt::QueuedConnection);
//pidControllerInit(); //pidControllerInit();
@@ -713,7 +704,6 @@ void InkJetPrinter::initCntGroup()
connect(this, &InkJetPrinter::sig_updateDisp, connect(this, &InkJetPrinter::sig_updateDisp,
SectionalManager::instance(), &SectionalManager::sig_updateCntGroupDisp); SectionalManager::instance(), &SectionalManager::sig_updateCntGroupDisp);
} }
float PID_realize(float speed); float PID_realize(float speed);
struct _pid{ struct _pid{
@@ -790,20 +780,23 @@ float PID_realize2(float speed, float act){
void InkJetPrinter::pressureAdj() void InkJetPrinter::pressureAdj()
{ {
// 故障停机处理
if(sysPara->status.gearPumpRunStopFlag || sysPara->status.flagOfSpeedAlarm) if(sysPara->status.gearPumpRunStopFlag || sysPara->status.flagOfSpeedAlarm)
{ {
sysPara->para.gearPumpValue = 0; sysPara->para.gearPumpValue = 0;
u = 0.0f; u = 0.0f;
m_rampDone = false; m_pumpState = DPUMP_STOPPED;
m_stateChangeCount = 0;
m_adjSkip = 0; m_adjSkip = 0;
m_lastPressure = 0; m_lastActualPressure = 0;
m_stableCount = 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;
sysPara->devOp->WriteMoterPump(); sysPara->devOp->WriteMoterPump();
return; return;
} }
// 泵未使能时的PID控制(保持原有逻辑)
if(!sysPara->para.gearPumpEnable) if(!sysPara->para.gearPumpEnable)
{ {
if(u > 0 || ((sysPara->para.pressure - sysPara->status.PRESSURE) > 0)) if(u > 0 || ((sysPara->para.pressure - sysPara->status.PRESSURE) > 0))
@@ -815,173 +808,214 @@ void InkJetPrinter::pressureAdj()
return; return;
} }
int maxValue = sysPara->para.flagOfReclaimPumEnable ? 420 : 800; // 隔膜泵控制参数
if(maxValue < 60) maxValue = 60; const int STOP_TO_START_THRESHOLD = 5; // 停止→启动:压力低于目标15(扩大滞环)
const int RUN_TO_STOP_THRESHOLD = 5; // 运行→停止:压力高于目标10(扩大滞环)
int maxSpeed = (int)sysPara->para.gearPumpSpeedAlarm; const int MIN_STATE_INTERVAL = 8; // 最小状态切换间隔:8个100ms = 800ms
auto clampU = [&]() {
if(u < 60.0f) u = 60.0f;
if(u > (float)maxValue) u = (float)maxValue;
};
int actual = sysPara->status.PRESSURE; int actual = sysPara->status.PRESSURE;
int target = (int)sysPara->para.pressure; int target = (int)sysPara->para.pressure;
int cur; int err = target - actual; // 正值=压力偏低,负值=压力偏高
// 每次进入都更新滑动平均缓冲(软启动用瞬时值,闭环用平均值) // 更新滑动平均缓冲
m_pressureBuf[m_bufIdx] = actual; m_pressureBuf[m_bufIdx] = actual;
m_bufIdx = (m_bufIdx + 1) % 10; m_bufIdx = (m_bufIdx + 1) % 10;
int avgPressure = 0; int avgPressure = 0;
for(int i = 0; i < 10; i++) avgPressure += m_pressureBuf[i]; for(int i = 0; i < 10; i++) avgPressure += m_pressureBuf[i];
avgPressure /= 10; avgPressure /= 10;
// --------------------------------------------------------------- // 状态切换计数器递增
// 硬保护:压力超过目标+50,立即强制减速,优先级最高 m_stateChangeCount++;
// 覆盖自检、软启动、闭环所有阶段
// --------------------------------------------------------------- // 检查是否允许状态切换(距上次切换>=800ms)
if(actual > target + 50) bool canSwitch = (m_stateChangeCount >= MIN_STATE_INTERVAL);
// 硬保护:压力严重超标,立即强制停泵(不受800ms限制)
if(actual > target + 80)
{ {
float overErr = (float)(actual - (target + 50)); if(m_pumpState != DPUMP_STOPPED) {
float delta = -0.1f * overErr; u = 0.0f;
if(delta < -15.0f) delta = -15.0f; sysPara->para.gearPumpValue = 0;
u += delta;
clampU();
m_lastPressure = actual;
sysPara->para.gearPumpValue = (unsigned short)(int)u;
sysPara->devOp->WriteMoterPump(); sysPara->devOp->WriteMoterPump();
return; m_pumpState = DPUMP_STOPPED;
} m_stateChangeCount = 0;
// ---------------------------------------------------------------
// 软启动:自适应步长,每 800ms 一次
// 自检期间也走此逻辑(硬保护兜底),自检完成后重置重新收敛
// 软启动阶段不做压力稳定检测,优先快速收敛
// ---------------------------------------------------------------
if(!m_rampDone)
{
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; m_adjSkip = 0;
} }
sysPara->para.gearPumpValue = (unsigned short)cur;
sysPara->devOp->WriteMoterPump();
return; return;
} }
// --------------------------------------------------------------- // 状态机处理
// 闭环:等压力稳定后再调速,自适应管路响应时间 switch(m_pumpState) {
// case DPUMP_STOPPED:
// 每100ms采样一次,连续3次压力变化<15认为稳定,才执行调速 handleStoppedState(err, canSwitch);
// 最长等待5s(50次)兜底,防止管路持续抖动导致永远不调 break;
//
// 调速后立即重置稳定计数,重新等待下一次稳定
//
// 分区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++; // 复用为超时计数
bool stable = (pressureChange < 10); case DPUMP_STARTING:
bool timeout = (m_adjSkip >= 50); // 5s兜底 handleStartingState(err, actual, target);
break;
if(stable) case DPUMP_RUNNING:
m_stableCount++; handleRunningState(err, canSwitch);
else break;
m_stableCount = 0;
bool readyToAdj = (m_stableCount >= 15) || timeout;
if(!readyToAdj)
{
sysPara->para.gearPumpValue = (unsigned short)(int)u;
sysPara->devOp->WriteMoterPump();
return;
}
// 平均压力已稳定(或超时兜底),执行调速,重置计数
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();
} }
} }
// 停止状态处理:压力低于目标较多时启动泵
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;
}
// 计算压力变化率(微分项)
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))) // 压力高且在下降
{
delta_u = -0.20f * (float)pressureChange; // 只刹车
}
else {
// 标准增量式控制:比例项 + 微分项
delta_u = 0.05f * error - 0.20f * (float)pressureChange;
}
// 分级限幅(根据误差大小限制调节幅度)
float maxDelta;
if(absErr > 30.0f) maxDelta = 1.0f;
else if(absErr > 10.0f) maxDelta = 0.6f;
else maxDelta = 0.3f;
if(delta_u > maxDelta) delta_u = maxDelta;
if(delta_u < -maxDelta) delta_u = -maxDelta;
// 更新控制量
u += delta_u;
// 限制范围
const float MIN_RUNNING_SPEED = 30.0f; // 最低运行转速(低于此值泵不转)
const float MAX_WORKING_SPEED = 500.0f;
if(u < MIN_RUNNING_SPEED) u = MIN_RUNNING_SPEED;
if(u > MAX_WORKING_SPEED) u = MAX_WORKING_SPEED;
sysPara->para.gearPumpValue = (unsigned short)(int)u;
sysPara->devOp->WriteMoterPump();
}
void InkJetPrinter::DacAdjustStore() void InkJetPrinter::DacAdjustStore()
{ {
@@ -1189,6 +1223,10 @@ void InkJetPrinter::timerHandler(void){
static float gearPumpRunNormalValue = 0.0; static float gearPumpRunNormalValue = 0.0;
if(sysPara){ if(sysPara){
xxxm=1; xxxm=1;
if(sysPara->para.flagOfModuleDecimal || sysPara->para.flagOfModuleHide){
sysPara->para.flagOfModuleDecimal = 0;
sysPara->para.flagOfModuleHide = 0;
}
sysPara->para.ReadFileErrorCnt=0; // 正常打开文件 sysPara->para.ReadFileErrorCnt=0; // 正常打开文件
@@ -1234,16 +1272,22 @@ void InkJetPrinter::timerHandler(void){
if(pulse_300ms) tempFlag=1; if(pulse_300ms) tempFlag=1;
if((sysPara->status.delay10ms%3) == 0) //读取状态后再检測 if((sysPara->status.delay10ms%3) == 0) //读取状态后再检測
{ {
// 检测是否需要启动泵泵,注意启动条件:1. 无墨水警告 2. 未运行 3. 未手动控制
if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN) && !gearPumpRunFlag && !sysPara->status.isPumpValveControledByHand)//刚启动前3秒 if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN) && !gearPumpRunFlag && !sysPara->status.isPumpValveControledByHand)//刚启动前3秒
{ {
if(sysPara->para.gearPumpEnable) { if(sysPara->para.gearPumpEnable) {
// 确保开机时控制字从 0 开始,让 pressureAdj 软启动从 0 爬坡,避免突变到高转速 // 隔膜泵初始化:确保从停止状态开始
if(sysPara->para.gearPumpValue != 0) { if(sysPara->para.gearPumpValue != 0) {
sysPara->para.gearPumpValue = 0; sysPara->para.gearPumpValue = 0;
u = 0.0f; u = 0.0f;
sysPara->devOp->WriteMoterPump(); sysPara->devOp->WriteMoterPump();
} }
// 初始化隔膜泵状态机
m_pumpState = DPUMP_STOPPED;
m_stateChangeCount = 0;
m_adjSkip = 0;
m_lastActualPressure = 0;
m_bufValidCount = 0;
m_startingStepCount = 0;
gearPumpStartFlag = true; gearPumpStartFlag = true;
} }
} }
@@ -1277,10 +1321,16 @@ void InkJetPrinter::timerHandler(void){
{ {
ControledSwitchFlag = true; ControledSwitchFlag = true;
u = (float)sysPara->para.gearPumpValue; // 同步当前转速,避免突变 u = (float)sysPara->para.gearPumpValue; // 同步当前转速,避免突变
m_rampDone = false; // 重新软启动,适应切换后的压力状态 // 重置隔膜泵状态机,从当前转速状态开始
if(u > 40.0f) {
m_pumpState = DPUMP_RUNNING; // 如果当前有转速,进入运行状态
} else {
m_pumpState = DPUMP_STOPPED; // 否则从停止状态开始
}
m_stateChangeCount = 0;
m_adjSkip = 0; m_adjSkip = 0;
m_lastPressure = 0; m_lastActualPressure = 0;
m_stableCount = 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;
} }
@@ -1299,25 +1349,29 @@ void InkJetPrinter::timerHandler(void){
} }
if(gearPumpRunNormalFlag && !sysPara->status.isPumpValveControledByHand && sysPara->para.gearPumpEnable) 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) int pressureChange = sysPara->status.PRESSURE - lastPressureForLeak;
{
count_3s++; // 泵运行中(转速>40),压力不升反降,或上升太慢(<5/秒)
if(count_3s == 3) if(u > 40.0f && pressureChange < 5) {
{ leakCheckCount++;
count_3s = 0; if(leakCheckCount >= 5) { // 连续5秒
ui->tabMainWindow->setRunStatus(tr("压力泄漏或压力传感器故障!")); leakCheckCount = 0;
ui->tabMainWindow->setRunStatus(tr("压力异常,可能泄漏!"));
sysPara->status.gearPumpRunStopFlag = true; sysPara->status.gearPumpRunStopFlag = true;
gearPumpRunNormalFlag = false; gearPumpRunNormalFlag = false;
LogInfo::setRunStatusText(tr("运行中压力泄漏,停齿轮泵!")); LogInfo::setRunStatusText(tr("运行中压力泄漏,停泵!"));
} }
} else {
leakCheckCount = 0;
} }
}
else lastPressureForLeak = sysPara->status.PRESSURE;
{
count_3s = 0;
} }
} }
if(sysPara->para.gearPumpEnable && (sysPara->status.gearPumpRunSpeed < 100) && test_flag){ if(sysPara->para.gearPumpEnable && (sysPara->status.gearPumpRunSpeed < 100) && test_flag){
@@ -1385,16 +1439,12 @@ void InkJetPrinter::timerHandler(void){
if(pulse_1s && flagOfSerialThreadStratEn){ if(pulse_1s && flagOfSerialThreadStratEn){
if (!m_serialThreadFPGA->isRunning()) { if (!m_serialThreadFPGA->isRunning()) {
#ifndef ARCH_X86
qDebug()<<"start FPGA tread"; qDebug()<<"start FPGA tread";
m_serialThreadFPGA->start(); m_serialThreadFPGA->start();
#endif
} }
if (!m_serialThreadSTM32->isRunning()){ if (!m_serialThreadSTM32->isRunning()){
#ifndef ARCH_X86
qDebug()<<"start STM32 tread"; qDebug()<<"start STM32 tread";
m_serialThreadSTM32->start(); m_serialThreadSTM32->start();
#endif
} }
flagOfSerialThreadStratEn = false; flagOfSerialThreadStratEn = false;
} }
@@ -1505,20 +1555,11 @@ void InkJetPrinter::timerHandler(void){
if(gearPumpRunFlag || sysPara->para.gearPumpEnable == 0) if(gearPumpRunFlag || sysPara->para.gearPumpEnable == 0)
{ {
if(!sysPara->status.selfCheckDone && sysPara->status.isPrinting){ if(!sysPara->status.selfCheckDone && sysPara->status.isPrinting){
sysPara->status.selfCheckDone = true;
ui->tabMainWindow->updatePrintDisplayLabel();
sysPara->status.flagOfAbnormalStatus = true; sysPara->status.flagOfAbnormalStatus = true;
static bool onceLog = true;
if(onceLog) {
LogInfo::setRunStatusText(tr("打印过程中死机了!!!")); LogInfo::setRunStatusText(tr("打印过程中死机了!!!"));
qDebug()<<"打印过程中死机了!!!"; qDebug()<<"打印过程中死机了!!!";
onceLog = false;
ui->tabMainWindow->updatePrintDisplayLabel();
}
ui->tabMainWindow->on_pushButtonStopPrint_pressed();
} }
if(!sysPara->status.selfCheckDone) if(!sysPara->status.selfCheckDone)
{ {
@@ -1550,15 +1591,17 @@ void InkJetPrinter::timerHandler(void){
{ {
sysPara->status.selfCheckDone = 1; sysPara->status.selfCheckDone = 1;
u = (float)sysPara->para.gearPumpValue; u = (float)sysPara->para.gearPumpValue;
// 自检完成后管道恢复正常阻力,重置软启动让压力重新平稳收敛 // 自检完成后管道恢复正常阻力,重置状态机让压力重新平稳收敛
// 不清零 u,从当前控制字开始,避免突变 // 不清零 u,从当前控制字开始,避免突变
// m_rampDone = false; if(u > 40.0f) {
// m_adjSkip = 0; m_pumpState = DPUMP_RUNNING; // 如果当前有转速,进入运行状态
// m_lastPressure = 0; } else {
// m_stableCount = 0; m_pumpState = DPUMP_STOPPED; // 否则从停止状态开始
}
autoControlValvePump(); m_stateChangeCount = 0;
m_adjSkip = 0;
m_lastActualPressure = 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;
LogInfo::setRunStatusText(tr("自检完成!!!")); LogInfo::setRunStatusText(tr("自检完成!!!"));
@@ -1590,10 +1633,12 @@ void InkJetPrinter::timerHandler(void){
m_lastReclaimMode = sysPara->para.flagOfReclaimPumEnable; m_lastReclaimMode = sysPara->para.flagOfReclaimPumEnable;
gearPumpRunNormalFlag = false; // 泄漏保护重新学习 gearPumpRunNormalFlag = false; // 泄漏保护重新学习
gearPumpRunNormalValue = 0.0f; gearPumpRunNormalValue = 0.0f;
m_rampDone = false; // 软启动重新爬坡适应新上限 // 重置隔膜泵状态机,适应新模式
m_pumpState = DPUMP_STOPPED;
m_stateChangeCount = 0;
m_adjSkip = 0; m_adjSkip = 0;
m_lastPressure = 0; m_lastActualPressure = 0;
m_stableCount = 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;
} }
@@ -1729,12 +1774,12 @@ void InkJetPrinter::timerHandler(void){
if(sysPara->para.speedoverPaushPrint) { if(sysPara->para.speedoverPaushPrint) {
ui->tabMainWindow->on_pushButtonPausePrint_pressed();// 2014-03-19 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("喷印速度过快!无法喷印完全,自动暂停喷印!!!")); ui->tabMainWindow->setRunStatus(tr("喷印速度过快!无法喷印完全,自动暂停喷印!!!"));
} }
else { else {
// emit OnSpeedOver(1);//QMessageBox::warning(NULL,tr("警告"),tr("喷印速度过快!无法喷印完全!!!")); // emit OnSpeedOver(1);//QMessageBox::warning(NULL,tr("警告"),tr("喷印速度过快!无法喷印完全!!!"));
ui->tabMainWindow->setRunStatus(tr("喷印速度过快!无法喷印完全!!!")); ui->tabMainWindow->setRunStatus(tr("喷印速度过快!无法喷印完全!!!"));
} }
@@ -2067,38 +2112,29 @@ void InkJetPrinter::timerHandler(void){
} }
else if(pulse_1s && sysPara->para.gearPumpEnable && sysPara->status.selfCheckDone else if(pulse_1s && sysPara->para.gearPumpEnable && sysPara->status.selfCheckDone
&& (!sysPara->status.statWarn) && !sysPara->status.powerOffAppending){ && (!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; pulse_30s = 0;
} }
else{ else{
pulse_30s++; pulse_30s++;
if(pulse_30s >= 30){ 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->status.flagOfSpeedAlarm = true;
sysPara->devOp->color_flag = 2; sysPara->devOp->color_flag = 2;
if(pulse_30s % 500 == 0){ if(pulse_30s % 500 == 0){
LogInfo::setRunStatusText(tr("齿轮泵转速过高,请立即停机并联系供应商!")); LogInfo::setRunStatusText(tr("泵转速异常过高,请立即停机并联系供应商!"));
qDebug()<<"齿轮泵转速过高,请立即停机并联系供应商!"; qDebug()<<"泵转速异常过高,请立即停机并联系供应商!";
} }
ui->tabMainWindow->setRunStatus(tr("齿轮泵转速过高,请立即停机并联系供应商!")); ui->tabMainWindow->setRunStatus(tr("泵转速异常过高,请立即停机并联系供应商!"));
sysPara->devOp->controlRedLight(true); sysPara->devOp->controlRedLight(true);
if(sysPara->status.isPrinting) if(sysPara->status.isPrinting)
ui->tabMainWindow->on_pushButtonStopPrint_pressed(); 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);
}
}
if(pulse_30s % 10 == 0) if(pulse_30s % 10 == 0)
qDebug()<<"粘度: "<<QString::number(sysPara->status.viscosity); qDebug()<<"粘度: "<<QString::number(sysPara->status.viscosity);
} }
@@ -2167,6 +2203,8 @@ void InkJetPrinter::cnt1GroupCheck(void)
static unsigned char lastGroupRunningIndex = 0; static unsigned char lastGroupRunningIndex = 0;
if(sysPara->para.cnt1ByGroupEnalbe) if(sysPara->para.cnt1ByGroupEnalbe)
{ {
sysPara->devOp->ReadCnt1GroupStatus(); sysPara->devOp->ReadCnt1GroupStatus();
if(lastGroupRunningIndex == sysPara->status.cnt1GroupRunningIndex) if(lastGroupRunningIndex == sysPara->status.cnt1GroupRunningIndex)
return; return;
@@ -2495,7 +2533,7 @@ void InkJetPrinter::autoControlValvePump(void)
hasDetectedBellow = false; hasDetectedBellow = false;
hasDetectedTop = false; hasDetectedTop = false;
} }
// } // }
/*-----------------------------------回收泵------------------------------------------*/ /*-----------------------------------回收泵------------------------------------------*/
if(!sysPara->status.autoCtlReclaimAfterSWintOff) if(!sysPara->status.autoCtlReclaimAfterSWintOff)
@@ -2611,10 +2649,10 @@ void InkJetPrinter::detectAndcontrolReclaimTank(){
sysPara->status.currReclaimTankPos =10*sysPara->status.curr_reclaimTankTime; sysPara->status.currReclaimTankPos =10*sysPara->status.curr_reclaimTankTime;
sysPara->status.reclaimTankBlockedAppending =0; sysPara->status.reclaimTankBlockedAppending =0;
//qDebug()<<sysPara->status.reclaimTankstatus; //qDebug()<<sysPara->status.reclaimTankstatus;
// if(sysPara->status.currReclaimTankPos == 0) // if(sysPara->status.currReclaimTankPos == 0)
// ui->tabMainWindow->setReBootQtUIEnable(false); // ui->tabMainWindow->setReBootQtUIEnable(false);
// else // else
// ui->tabMainWindow->setReBootQtUIEnable(true); // ui->tabMainWindow->setReBootQtUIEnable(true);
if(sysPara->status.reclaimTankstatus == 0x10) //7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 if(sysPara->status.reclaimTankstatus == 0x10) //7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作
{ {
@@ -3038,7 +3076,7 @@ void InkJetPrinter::sendDataManual(QString cmdstr,QString addrstr,QString datast
unsigned char byte = static_cast<unsigned char>(byteString.toUInt(&ok, 16)); unsigned char byte = static_cast<unsigned char>(byteString.toUInt(&ok, 16));
data[i / 2] = byte; data[i / 2] = byte;
} }
// quint16 data1[] = {68, 90, 108, 125, 141, 156, 170, 170, 180, 193, 204, 214}; // quint16 data1[] = {68, 90, 108, 125, 141, 156, 170, 170, 180, 193, 204, 214};
const char* charData = data.constData(); const char* charData = data.constData();
// 转换为 unsigned char 指针 // 转换为 unsigned char 指针
+26 -8
View File
@@ -101,14 +101,32 @@ private:
QTimer* viscosity_timer; QTimer* viscosity_timer;
QTimer* timer; QTimer* timer;
QTime t1; QTime t1;
bool m_rampDone = false; // pressureAdj 软启动完成标志
int m_adjSkip = 0; // pressureAdj 节拍计数 // 隔膜泵状态枚举
int m_lastPressure = 0; // pressureAdj 上次采样压力(稳定检测用) enum DiaphragmPumpState {
int m_stableCount = 0; // pressureAdj 压力连续稳定计数 DPUMP_STOPPED = 0, // 停止状态
int m_pressureBuf[10] = {}; // pressureAdj 压力滑动平均缓冲(10点=1s) DPUMP_STARTING = 1, // 启动爬升状态
int m_bufIdx = 0; // pressureAdj 滑动平均写入索引 DPUMP_RUNNING = 2 // 运行微调状态
bool m_lastReclaimMode = false; // 上次 flagOfReclaimPumEnable 状态,用于检测切换 };
bool m_lastByHand = false; // 上次 isPumpValveControledByHand 状态,用于检测手动、自动
// 隔膜泵控制参数
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 autoControlHeater();
void autoControlValvePump(); void autoControlValvePump();
void detectAndcontrolReclaimTank(); void detectAndcontrolReclaimTank();
+3 -2
View File
@@ -417,13 +417,14 @@ void PrintSetting::updateSysParaToUI(){
void PrintSetting::showMachInfo(QString Mac) void PrintSetting::showMachInfo(QString Mac)
{ {
QString VernonBach; 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; VernonBach = VernonBach + (QString) Public::DateToString(__DATE__)+"_";//+UP_PRINTER_STAGE_VER;
} }
void PrintSetting::showRemoteControl(QString SuperNodeIP,QString EdgeIP) void PrintSetting::showRemoteControl(QString SuperNodeIP,QString EdgeIP)
{ {
QString VernonBach; 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; VernonBach = VernonBach + (QString) Public::DateToString(__DATE__)+"_";//+UP_PRINTER_STAGE_VER;
} }
+2 -23
View File
@@ -369,33 +369,12 @@ QString Public::DateToString(char const *time){
int month, day, year; int month, day, year;
//struct tm t = {0}; //struct tm t = {0};
static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
//qDebug()<<time;
sscanf(time, "%s %d %d", s_month, &day, &year); sscanf(time, "%s %d %d", s_month, &day, &year);
//qDebug()<<time<<s_month<<day<<year;
month = ((strstr(month_names, s_month)-month_names)/3)+1; month = ((strstr(month_names, s_month)-month_names)/3)+1;
//qDebug()<<month<<s_month;
QString s; QString s;
s.sprintf("%04d-%02d-%02d",year,month,day); // s.sprintf("%04d-%02d-%02d",year,month,day);
return s; s.sprintf("%02d%02d",month,day);
}
QString Public::ArmDate2String(const char *date, const char *time)
{
char s_month[5];
int month, day, year;
static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
sscanf(date, "%s %d %d", s_month, &day, &year);
month = ((strstr(month_names, s_month)-month_names)/3)+1;
QString dateStr;
dateStr.sprintf("A%04d%02d%02d",year,month,day);
int hour, min, secend;
sscanf(time, "%d:%d:%d", &hour, &min, &secend);
QString timeStr;
timeStr.sprintf("%02d%02d", hour, min);
QString s = dateStr+timeStr;
return s; return s;
} }
-2
View File
@@ -36,8 +36,6 @@ public:
static time_t getDateFromMacro(const char *time); static time_t getDateFromMacro(const char *time);
static QString DateToString(const char *time); static QString DateToString(const char *time);
static QString ArmDate2String(const char * date, const char * time);
static QString ReadKeyBoardUse(); static QString ReadKeyBoardUse();
static int getType(int vartype); // 将变量类型进行转换,以处理横向字体 static int getType(int vartype); // 将变量类型进行转换,以处理横向字体
+1 -1
View File
@@ -57,7 +57,7 @@ DEFINES+=WARNING
DEFINES+=TEMPMIMA DEFINES+=TEMPMIMA
DEFINES+=COUNTER1_BY_GROUP #分段计米 DEFINES+=COUNTER1_BY_GROUP #分段计米
# DEFINES+=COUNTER2_BY_GROUP #分段计米2 #DEFINES+=COUNTER2_BY_GROUP #分段计米2
DEFINES+=_2DCODE_ #QR二维码 DEFINES+=_2DCODE_ #QR二维码
DEFINES+=PICSCENE DEFINES+=PICSCENE
#DEFINES+=__2451WIFI__ #DEFINES+=__2451WIFI__
+7 -21
View File
@@ -93,13 +93,11 @@ TriggerCtrl::TriggerCtrl(QWidget *parent) :
connect(pulseNumFix,SIGNAL(pulseNuxFixDone(float)),this,SLOT(onPulseNumFixDone(float))); connect(pulseNumFix,SIGNAL(pulseNuxFixDone(float)),this,SLOT(onPulseNumFixDone(float)));
updateSysStatusToUI(); updateSysStatusToUI();
QString s; QString s;
// s.sprintf("%d.%d.%02d%s%s_", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID);
s.sprintf("%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__)+"_"+ QString(__TIME__)+"_"; s = s + (QString) Public::DateToString(__DATE__)+"."+SUB_VER+SUB_RFID;
// hlp :邓总要求,采用新的格式进行转换 0727
// s = Public::ArmDate2String(__DATE__, __TIME__);
ui->test_version->setText(s); ui->test_version->setText(s);
ui->checkBoxEleEyeMakeClean->setVisible(false); ui->checkBoxEleEyeMakeClean->setVisible(false);
tr("独立参数"); tr("独立参数");
@@ -398,16 +396,6 @@ void TriggerCtrl::updateSysStatusToUI(){
ui->spinBoxpluseSinal->setValue(sysPara->para.pulse_sinal_value); ui->spinBoxpluseSinal->setValue(sysPara->para.pulse_sinal_value);
t_init = 1; 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) void TriggerCtrl::setBuildTime(QString s1)
{ {
QString s; 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.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__); s.sprintf("%s.%s.", MACHINAE_VER, PUMP_VER);
// hlp :邓总要求,采用新的格式进行转换 0727 s = s + (QString) Public::DateToString(__DATE__)+"."+SUB_VER+SUB_RFID;//+ "_"+ QString(__TIME__)
// s = Public::ArmDate2String(__DATE__, __TIME__);
ui->test_version->setText(s+s1); ui->test_version->setText(s+s1);
} }
+6 -10
View File
@@ -2,21 +2,17 @@
#define VERBVERSION_H #define VERBVERSION_H
#include "myinclude.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 MACHINAE_VER "VX5"
#define UP_PRINTER_MINOR_VER 8 #define PUMP_VER "D"
#define UP_PRINTER_RIVISION_VER 3 #define SUB_VER "0100"
// #define SUB_VERSION "_GuiL"
//#define SUB_VERSION "_JingZ"
//#define SUB_VERSION "_RFID"
#define SUB_VERSION "_Std"
// #define SUB_VERSION "_Std_VZ"
#ifdef __RFID_OLD #ifdef __RFID_OLD
#define SUB_RFID "_RO" #define SUB_RFID "_RO"
#else #else
#define SUB_RFID "" #define SUB_RFID "-C"
#endif #endif
//#define UP_PRINTER_STAGE_VER "Std" //#define UP_PRINTER_STAGE_VER "Std"
//#define UP_PRINTER_STAGE_VER "Beta" //#define UP_PRINTER_STAGE_VER "Beta"
+17 -11
View File
@@ -706,12 +706,12 @@ bool MainWindow::updatePhaseIndicatorLight(){
return sysPara->status.lastPhaseFault; return sysPara->status.lastPhaseFault;
} }
int MainWindow::getMaxSpeedCalcPara(){ double MainWindow::getMaxSpeedCalcPara(){
sysPara->para.printRowDelay = sysPara->para.currPrintMode; sysPara->para.printRowDelay = sysPara->para.currPrintMode;
if(sysPara->status.isPrinting == false) if(sysPara->status.isPrinting == false)
sysPara->status.pixNumPerCol = sysPara->status.currPrintRow; sysPara->status.pixNumPerCol = sysPara->status.currPrintRow;
else // else
sysPara->status.currPrintRow = sysPara->status.pixNumPerCol; // sysPara->status.currPrintRow = sysPara->status.pixNumPerCol;
sysPara->para.pixNumPerCol = sysPara->status.pixNumPerCol; sysPara->para.pixNumPerCol = sysPara->status.pixNumPerCol;
sysPara->para.reducedPixelNum = sysPara->para.reducedPixelNumRatio*sysPara->para.pixNumPerCol/100; 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 dotNum = sysPara->para.divideRatio?(FPGA_SYS_HZ/(sysPara->para.divideRatio*2)):0;// 1s时间内墨点数 (即晶振频率 64000)
int colNum = dotNumPerCol?dotNum/dotNumPerCol:0; // 第列可用墨点数 = 1s时间内墨点数/ 列需要墨点数 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; static int reclaimTankDelay = 0;
@@ -792,8 +798,8 @@ void MainWindow::updateSysStatusToUI(){ //100ms
} }
else else
{ {
int pulsePS = getMaxSpeedCalcPara();//No67 double speed = getMaxSpeedCalcPara();//No67
maxMM = (pulsePS/sysPara->para.synPulseNumPerMm) * 60;// 列的最大间距 maxMM = int(speed * 1000.0);
} }
ui->labelSynRate->setText(tr("%1.%2[%3.%4]米/分").arg(mm/1000).arg(mm%1000,3,10,QLatin1Char('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'))); .arg(maxMM/1000).arg(maxMM%1000,3,10,QLatin1Char('0')));
@@ -846,8 +852,8 @@ void MainWindow::updateSysStatusToUI(){ //100ms
emit readFPGAVersionReady(); emit readFPGAVersionReady();
logflag5 = false; logflag5 = false;
sysPara->devOp->writeFpgaPrintPara(true); sysPara->devOp->writeFpgaPrintPara(true);
QString ARM_Version; 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); // 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) 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) ); .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) 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); .arg((sysPara->status.stm32Verion>>8) & 0xFF).arg(sysPara->status.stm32Verion&0xFF).arg(baudRateValue);
QString VernonBach; 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); // 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); QString Mac = QString::number(sysPara->status.machineMac);
LogInfo::showVerionInformation(Mac,VernonBach,fpgaVersion,STM32Ver,sysPara->status.flagOfPowerOnMode); LogInfo::showVerionInformation(Mac,VernonBach,fpgaVersion,STM32Ver,sysPara->status.flagOfPowerOnMode);
+1 -1
View File
@@ -63,7 +63,7 @@ public:
void enableReclaimCtrlButton(bool enable); void enableReclaimCtrlButton(bool enable);
void resetReclaimCtrlButtonText(); void resetReclaimCtrlButtonText();
void enablePushButtonStart(bool enable); void enablePushButtonStart(bool enable);
int getMaxSpeedCalcPara(); double getMaxSpeedCalcPara();
void PreviewPressed(); void PreviewPressed();
int getCurrPrintStatus(); int getCurrPrintStatus();
+1 -1
View File
@@ -301,7 +301,7 @@ QTabBar::tab:selected {background-color: rgb(255, 170, 127)}
QTabBar::tab:!selected {margin-top: 5px;}</string> QTabBar::tab:!selected {margin-top: 5px;}</string>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>2</number> <number>0</number>
</property> </property>
<widget class="QWidget" name="tab_3"> <widget class="QWidget" name="tab_3">
<attribute name="title"> <attribute name="title">