6月29日崩溃前缓存

This commit is contained in:
2026-06-30 08:21:08 +08:00
parent ef2eecf972
commit 14d97b9bcb
5 changed files with 974 additions and 78 deletions
+240 -78
View File
@@ -387,102 +387,228 @@ float PID_realize(float speed, float act){
}
float PID_realize2(float speed, float act){
pid.Kp = 0.8;
pid.Ki = 0.02;
pid.Kd = 0.5;
pid.integral_max = 12000;
pid.SetSpeed=speed;
// 增量式 PID:Δu = Kp*(e[k]-e[k-1]) + Ki*e[k]
pid.Kp = 0.15f;
pid.Ki = 0.02f;
pid.Kd = 0.0f;
pid.SetSpeed = speed;
pid.ActualSpeed = act;
pid.err=pid.SetSpeed-pid.ActualSpeed;
pid.err = pid.SetSpeed - pid.ActualSpeed;
float Pout = pid.Kp * pid.err;
pid.integral += pid.err;
if (pid.integral > pid.integral_max) {
pid.integral = pid.integral_max;
} else if (pid.integral < -pid.integral_max) {
pid.integral = -pid.integral_max;
}
float Iout = pid.Ki * pid.integral;
float Dout = pid.Kd * ((pid.err + pid.err_last)/2 - pid.err_last);
float delta_u = pid.Kp * (pid.err - pid.err_last)
+ pid.Ki * pid.err;
pid.voltage = Pout + Iout + Dout;
pid.err_last=pid.err;
return pid.voltage;
// 自适应非对称限幅:
// 压力严重偏高(err < -30):允许快速减速,限制慢速加速
// 压力严重偏低(err > 50):允许正常加速,限制减速(避免过度降速)
// 接近目标:小步长,平稳调节
if(pid.err < -30.0f) {
if(delta_u > 1.0f) delta_u = 1.0f;
if(delta_u < -6.0f) delta_u = -6.0f;
} else if(pid.err > 50.0f) {
if(delta_u > 3.0f) delta_u = 3.0f;
if(delta_u < -2.0f) delta_u = -2.0f;
} else {
if(delta_u > 3.0f) delta_u = 3.0f;
if(delta_u < -3.0f) delta_u = -3.0f;
}
pid.err_last = pid.err;
return delta_u;
}
void InkJetPrinter::pressureAdj()
{
//float u, actual;
signed short delta_u;
signed short old = (signed short)sysPara->para.gearPumpValue;
static unsigned int oldPressure = 0;
static qint32 printOut = 0;
if(printOut++%2 !=0) {
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;
for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0;
m_bufIdx = 0;
sysPara->devOp->WriteMoterPump();
return;
}
static qint32 dbgCnt = 0;
if(++dbgCnt % 50 == 0){
// qDebug()<<"[pressureAdj] pressure="<<sysPara->para.pressure
// <<" PRESSURE="<<sysPara->status.PRESSURE
// <<" gearPumpValue="<<sysPara->para.gearPumpValue
// <<" u="<<u
// <<" flagOfReclaimPumEnable="<<sysPara->para.flagOfReclaimPumEnable
// <<" gearPumpSpeedAlarm="<<sysPara->para.gearPumpSpeedAlarm
// <<" gearPumpRunStopFlag="<<sysPara->status.gearPumpRunStopFlag
// <<" flagOfSpeedAlarm="<<sysPara->status.flagOfSpeedAlarm;
if(!sysPara->para.gearPumpEnable)
{
if(u > 0 || ((sysPara->para.pressure - sysPara->status.PRESSURE) > 0))
u = PID_realize((float)sysPara->para.pressure, (float)sysPara->status.PRESSURE);
sysPara->para.gearPumpValue = (u > 0) ? (unsigned short)u : 0;
if(sysPara->para.gearPumpValue > 800)
sysPara->para.gearPumpValue = 800;
sysPara->devOp->WriteMoterPump();
return;
}
if(!sysPara->status.gearPumpRunStopFlag)
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;
};
int actual = sysPara->status.PRESSURE;
int target = (int)sysPara->para.pressure;
int cur;
// 每次进入都更新滑动平均缓冲(软启动用瞬时值,闭环用平均值)
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)
{
if(sysPara->para.gearPumpEnable && sysPara->para.flagOfReclaimPumEnable)
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;
sysPara->devOp->WriteMoterPump();
return;
}
u=PID_realize2((float)sysPara->para.pressure,(float)sysPara->status.PRESSURE);
else if(u > 0 || ((sysPara->para.pressure - sysPara->status.PRESSURE) > 0) )
// ---------------------------------------------------------------
// 软启动:自适应步长,每 800ms 一次
// 自检期间也走此逻辑(硬保护兜底),自检完成后重置重新收敛
// 软启动阶段不做压力稳定检测,优先快速收敛
// ---------------------------------------------------------------
if(!m_rampDone)
{
if(++m_adjSkip < 8)
{
//
u=PID_realize((float)sysPara->para.pressure,(float)sysPara->status.PRESSURE);
sysPara->para.gearPumpValue = (unsigned short)(int)u;
sysPara->devOp->WriteMoterPump();
return;
}
}
m_adjSkip = 0;
if(u > 0)
{
sysPara->para.gearPumpValue = (unsigned short)u;
}
else
{
sysPara->para.gearPumpValue = 0;
}
if(sysPara->para.gearPumpValue>800) {
sysPara->para.gearPumpValue = 800;
}
/*********************改回收泵后压力调整*********************************/
if(sysPara->para.gearPumpValue && sysPara->para.flagOfReclaimPumEnable){
int maxValue;
if(sysPara->para.gearPumpSpeedAlarm <= 1200){
maxValue = 200 + (sysPara->para.pressure - 500)*0.1;
if(maxValue > 260) maxValue = 260;
}else{
maxValue = 350 + (sysPara->para.pressure - 500)*0.1;
if(maxValue > 420) maxValue = 420;
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;
}
if(sysPara->para.gearPumpValue < 60)
sysPara->para.gearPumpValue = 75;
else if(sysPara->para.gearPumpValue > maxValue)
sysPara->para.gearPumpValue = maxValue;
}
/************************************************************/
clampU();
if(sysPara->status.gearPumpRunStopFlag)
// 转速上限保护
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;
}
// ---------------------------------------------------------------
// 闭环:等压力稳定后再调速,自适应管路响应时间
//
// 每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
// ---------------------------------------------------------------
{
sysPara->para.gearPumpValue = 0;
// 稳定检测用平均值,滤掉传感器噪声
int pressureChange = avgPressure - m_lastPressure;
if(pressureChange < 0) pressureChange = -pressureChange;
m_lastPressure = avgPressure;
m_adjSkip++; // 复用为超时计数
bool stable = (pressureChange < 10);
bool timeout = (m_adjSkip >= 50); // 5s兜底
if(stable)
m_stableCount++;
else
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();
}
if(sysPara->status.flagOfSpeedAlarm)
sysPara->para.gearPumpValue = 0;
sysPara->devOp->WriteMoterPump();
oldPressure = sysPara->status.PRESSURE;
}
@@ -580,10 +706,11 @@ void InkJetPrinter::timerHandler(void){
if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN) && !gearPumpRunFlag && !sysPara->status.isPumpValveControledByHand)//刚启动前3秒
{
if(sysPara->para.gearPumpEnable) {
sysPara->para.gearPumpValue = 150;
if(tempFlag){
// 确保开机时控制字从 0 开始,让 pressureAdj 软启动从 0 爬坡,避免突变到高转速
if(sysPara->para.gearPumpValue != 0) {
sysPara->para.gearPumpValue = 0;
u = 0.0f;
sysPara->devOp->WriteMoterPump();
tempFlag=0;
}
gearPumpStartFlag = true;
}
@@ -613,6 +740,19 @@ void InkJetPrinter::timerHandler(void){
ControledSwitchFlag = false;
pulse_3s = 0;
}
// 检测手动→自动边沿,直接恢复压力控制,不走 gearPumpStartFlag 的 3s 等待
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;
for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0;
m_bufIdx = 0;
}
m_lastByHand = sysPara->status.isPumpValveControledByHand;
if(!(sysPara->status.statWarn & WARN_STATUS_INK_SWINT)){//墨线开关,压力抖动
InkSwintFlag = true;
}
@@ -654,6 +794,19 @@ void InkJetPrinter::timerHandler(void){
test_flag = 0;
}
if(pulse_1s) {
// 回收泵模式切换时重置软启动和泄漏保护学习状态
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(sysPara->status.selfCheckDone && sysPara->para.gearPumpEnable && sysPara->para.flagOfReclaimPumEnable)
checkPressureControl();
if((QTime::currentTime()>=QTime(00,00,00))&&(QTime::currentTime()<=QTime(00,00,02))&&sysPara->para.Reciclar){
@@ -881,6 +1034,15 @@ void InkJetPrinter::timerHandler(void){
if(sysPara->status.selfCheckCnt >= MAX_SELF_CHECK_CNT)
{
sysPara->status.selfCheckDone = 1;
// 自检完成后管道恢复正常阻力,重置软启动让压力重新平稳收敛
// 不清零 u,从当前控制字开始,避免突变
u = (float)sysPara->para.gearPumpValue;
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;
LogInfo::setRunStatusText(tr("自检完成!!!"));
m_MainWidget->setRunStatus(tr("自检完成!!!"));
qDebug()<<"自检完成!!!";