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("在同步计米的情况下无打印串或显示区域为零"));
}
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));
+239 -201
View File
@@ -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();
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()<<sysPara->para.calandar_and_dat.year;
sysPara->status.cnt1GroupRunningIndex=0;
//sysPara->status.cnt1RepeatCurrent=0;
@@ -308,6 +297,8 @@ InkJetPrinter::InkJetPrinter(QWidget *parent) :
ui->tabMainWindow->enableReclaimCtrlButton(false);
//edit@12-14
connect(this,SIGNAL(currentChanged(int)),ui->tabMainWindow,SLOT(onInkJetPrinterCurrentChanged(int)), Qt::QueuedConnection);
//pidControllerInit();
@@ -713,7 +704,6 @@ void InkJetPrinter::initCntGroup()
connect(this, &InkJetPrinter::sig_updateDisp,
SectionalManager::instance(), &SectionalManager::sig_updateCntGroupDisp);
}
float PID_realize(float speed);
struct _pid{
@@ -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_pumpState = DPUMP_STOPPED;
m_stateChangeCount = 0;
m_adjSkip = 0;
m_lastPressure = 0;
m_stableCount = 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,172 +808,213 @@ 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;
sysPara->para.gearPumpValue = (unsigned short)(int)u;
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;
}
// ---------------------------------------------------------------
// 软启动:自适应步长,每 800ms 一次
// 自检期间也走此逻辑(硬保护兜底),自检完成后重置重新收敛
// 软启动阶段不做压力稳定检测,优先快速收敛
// ---------------------------------------------------------------
if(!m_rampDone)
// 状态机处理
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)
{
if(++m_adjSkip < 8)
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 err = target - actual;
// 判断是否进入运行状态
int absErr = (err >= 0) ? err : -err;
bool nearTarget = (absErr <= STARTING_TO_RUNNING_RANGE);
bool reachedMaxSpeed = (u >= MAX_WORKING_SPEED - 10);
if(err < 0)
{
// 超压:小步减速
u -= 1.0f;
if(nearTarget || reachedMaxSpeed) {
// 转到运行微调状态
m_pumpState = DPUMP_RUNNING;
m_lastActualPressure = actual;
m_stateChangeCount = 0; // 重置计数器
return;
}
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;
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;
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->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;
}
// ---------------------------------------------------------------
// 闭环:等压力稳定后再调速,自适应管路响应时间
//
// 每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++; // 复用为超时计数
// 常规停泵:压力略高于目标,等待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;
}
bool stable = (pressureChange < 10);
bool timeout = (m_adjSkip >= 50); // 5s兜底
// === 增量式微调控制(每200ms调整一次)===
m_adjSkip++;
if(m_adjSkip < 2) {
sysPara->para.gearPumpValue = (unsigned short)(int)u;
sysPara->devOp->WriteMoterPump();
return;
}
m_adjSkip = 0;
if(stable)
m_stableCount++;
else
m_stableCount = 0;
int actual = sysPara->status.PRESSURE;
float error = (float)err;
float absErr = (error >= 0) ? error : -error;
bool readyToAdj = (m_stableCount >= 15) || timeout;
if(!readyToAdj)
{
// 死区:误差≤0.5不调整
if(absErr < 0.5f) {
m_lastActualPressure = actual;
sysPara->para.gearPumpValue = (unsigned short)(int)u;
sysPara->devOp->WriteMoterPump();
return;
}
// 平均压力已稳定(或超时兜底),执行调速,重置计数
m_adjSkip = 0;
m_stableCount = 0;
// 计算压力变化率(微分项)
int pressureChange = actual - m_lastActualPressure;
m_lastActualPressure = actual;
// 误差用平均值计算,避免瞬时噪声影响调速幅度
float absErr = (float)(target - avgPressure);
if(absErr < 0.0f) absErr = -absErr;
// 增量式控制公式
float delta_u;
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)
// 近目标刹车策略:误差≤5且正在接近目标,只刹车不加速
if(absErr <= 5.0f &&
((error > 0.0f && pressureChange > 0) || // 压力低且在上升
(error < 0.0f && pressureChange < 0))) // 压力高且在下降
{
if(delta_u > 0.0f) delta_u = 0.0f;
delta_u = -0.20f * (float)pressureChange; // 只刹车
}
else {
// 标准增量式控制:比例项 + 微分项
delta_u = 0.05f * error - 0.20f * (float)pressureChange;
}
u += delta_u;
clampU();
cur = (int)u;
// 分级限幅(根据误差大小限制调节幅度)
float maxDelta;
if(absErr > 30.0f) maxDelta = 1.0f;
else if(absErr > 10.0f) maxDelta = 0.6f;
else maxDelta = 0.3f;
sysPara->para.gearPumpValue = (unsigned short)cur;
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()
@@ -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;
}
}
@@ -1277,10 +1321,16 @@ void InkJetPrinter::timerHandler(void){
{
ControledSwitchFlag = true;
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_lastPressure = 0;
m_stableCount = 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;
}
@@ -1505,20 +1555,11 @@ void InkJetPrinter::timerHandler(void){
if(gearPumpRunFlag || sysPara->para.gearPumpEnable == 0)
{
if(!sysPara->status.selfCheckDone && sysPara->status.isPrinting){
sysPara->status.selfCheckDone = true;
ui->tabMainWindow->updatePrintDisplayLabel();
sysPara->status.flagOfAbnormalStatus = true;
static bool onceLog = true;
if(onceLog) {
LogInfo::setRunStatusText(tr("打印过程中死机了!!!"));
qDebug()<<"打印过程中死机了!!!";
onceLog = false;
ui->tabMainWindow->updatePrintDisplayLabel();
}
ui->tabMainWindow->on_pushButtonStopPrint_pressed();
}
if(!sysPara->status.selfCheckDone)
{
@@ -1550,15 +1591,17 @@ void InkJetPrinter::timerHandler(void){
{
sysPara->status.selfCheckDone = 1;
u = (float)sysPara->para.gearPumpValue;
// 自检完成后管道恢复正常阻力,重置软启动让压力重新平稳收敛
// 自检完成后管道恢复正常阻力,重置状态机让压力重新平稳收敛
// 不清零 u,从当前控制字开始,避免突变
// m_rampDone = false;
// m_adjSkip = 0;
// m_lastPressure = 0;
// m_stableCount = 0;
autoControlValvePump();
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("自检完成!!!"));
@@ -1590,10 +1633,12 @@ void InkJetPrinter::timerHandler(void){
m_lastReclaimMode = sysPara->para.flagOfReclaimPumEnable;
gearPumpRunNormalFlag = false; // 泄漏保护重新学习
gearPumpRunNormalValue = 0.0f;
m_rampDone = false; // 软启动重新爬坡适应新上限
// 重置隔膜泵状态机,适应新模式
m_pumpState = DPUMP_STOPPED;
m_stateChangeCount = 0;
m_adjSkip = 0;
m_lastPressure = 0;
m_stableCount = 0;
m_lastActualPressure = 0;
m_bufValidCount = 0;
for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0;
m_bufIdx = 0;
}
@@ -2067,38 +2112,29 @@ 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()<<"齿轮泵转速过高,请立即停机并联系供应商!";
LogInfo::setRunStatusText(tr("泵转速异常过高,请立即停机并联系供应商!"));
qDebug()<<"泵转速异常过高,请立即停机并联系供应商!";
}
ui->tabMainWindow->setRunStatus(tr("齿轮泵转速过高,请立即停机并联系供应商!"));
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);
}
}
if(pulse_30s % 10 == 0)
qDebug()<<"粘度: "<<QString::number(sysPara->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;
+26 -8
View File
@@ -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();
+3 -2
View File
@@ -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;
}
+2 -23
View File
@@ -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()<<time;
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;
//qDebug()<<month<<s_month;
QString s;
s.sprintf("%04d-%02d-%02d",year,month,day);
return s;
}
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;
// s.sprintf("%04d-%02d-%02d",year,month,day);
s.sprintf("%02d%02d",month,day);
return s;
}
-2
View File
@@ -36,8 +36,6 @@ public:
static time_t getDateFromMacro(const char *time);
static QString DateToString(const char *time);
static QString ArmDate2String(const char * date, const char * time);
static QString ReadKeyBoardUse();
static int getType(int vartype); // 将变量类型进行转换,以处理横向字体
+7 -21
View File
@@ -93,13 +93,11 @@ TriggerCtrl::TriggerCtrl(QWidget *parent) :
connect(pulseNumFix,SIGNAL(pulseNuxFixDone(float)),this,SLOT(onPulseNumFixDone(float)));
updateSysStatusToUI();
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 = s + (QString) Public::DateToString(__DATE__)+"_"+ QString(__TIME__)+"_";
// hlp :邓总要求,采用新的格式进行转换 0727
// s = Public::ArmDate2String(__DATE__, __TIME__);
// 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__)+"."+SUB_VER+SUB_RFID;
ui->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);
}
+6 -10
View File
@@ -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"
+17 -11
View File
@@ -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);
+1 -1
View File
@@ -63,7 +63,7 @@ public:
void enableReclaimCtrlButton(bool enable);
void resetReclaimCtrlButtonText();
void enablePushButtonStart(bool enable);
int getMaxSpeedCalcPara();
double getMaxSpeedCalcPara();
void PreviewPressed();
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>
</property>
<property name="currentIndex">
<number>2</number>
<number>0</number>
</property>
<widget class="QWidget" name="tab_3">
<attribute name="title">