6月29日崩溃前缓存
This commit is contained in:
+240
-78
@@ -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()<<"自检完成!!!";
|
||||
|
||||
Reference in New Issue
Block a user