PID regulatior init fix

This commit is contained in:
2022-01-07 12:56:01 +03:00
parent 07046680e0
commit a7f5c67ab2

View File

@@ -23,7 +23,7 @@ bool out_pid::getConfig()
} }
aJsonObject * kPIDObj = aJson.getArrayItem(item->itemArg, 0); aJsonObject * kPIDObj = aJson.getArrayItem(item->itemArg, 0);
if (kPIDObj->type != aJson_Array) if (!kPIDObj || kPIDObj->type != aJson_Array)
{ {
errorSerial<<F("Invalid PID param array.")<<endl; errorSerial<<F("Invalid PID param array.")<<endl;
return false; return false;
@@ -88,19 +88,19 @@ bool out_pid::getConfig()
default: default:
store->setpoint = 20.; store->setpoint = 20.;
} }
store->input=0.0;
store->output=0.0;
store->alarmTimer=millis();
store->alarmArmed=true;
store->alarmTimeout=alarmTO; //in sec
alarm(true);
if (!store->pid) if (!store->pid)
{store->pid= new PID (&store->input, &store->output, &store->setpoint, kP, kI, kD, direction); {store->pid= new PID (&store->input, &store->output, &store->setpoint, kP, kI, kD, direction);
if (!store->pid) return false; if (!store->pid) return false;
store->pid->SetMode(AUTOMATIC); store->pid->SetMode(AUTOMATIC);
//store->pid->SetOutputLimits(outMin,outMax); //store->pid->SetOutputLimits(outMin,outMax);
store->pid->SetSampleTime(dT*1000.0); store->pid->SetSampleTime(dT*1000.0);
store->alarmTimer=millis();
store->alarmArmed=false;
store->alarmTimeout=alarmTO; //in sec
return true;} return true;}
else errorSerial<<F("PID already initialized")<<endl; else errorSerial<<F("PID already initialized")<<endl;
@@ -168,10 +168,13 @@ if (store && store->pid && (Status() == CST_INITIALIZED) && item && (item->getCm
//short cmd = st.getCmd(); //short cmd = st.getCmd();
if (item->getCmd() != CMD_OFF) if (item->getCmd() != CMD_OFF)
{ {
if(store->pid->Compute() && !store->alarmArmed) if(store->pid->Compute() )
{ {
debugSerial<<F("PID ")<<item->itemArr->name<<F("- set:")<<store->setpoint<<F(" in:")<<store->input<<(" out:") << store->output<<endl; debugSerial<<F("PID ")<<item->itemArr->name<<F(" set:")<<store->setpoint<<F(" in:")<<store->input<<(" out:") << store->output <<F(" P:")<<store->pid->GetKp() <<F(" I:")<<store->pid->GetKi() <<F(" D:")<<store->pid->GetKd();
if (abs(store->output-store->prevOut)>OUTPUT_TRESHOLD) if (store->alarmArmed) debugSerial << F(" Alarm");
debugSerial<<endl;
if ((abs(store->output-store->prevOut)>OUTPUT_TRESHOLD) && !store->alarmArmed)
{ {
aJsonObject * oCmd = aJson.getArrayItem(item->itemArg, 1); aJsonObject * oCmd = aJson.getArrayItem(item->itemArg, 1);
itemCmd value((float) (store->output));// * (100./255.))); itemCmd value((float) (store->output));// * (100./255.)));
@@ -195,12 +198,12 @@ return 1;//store->pollingInterval;
void out_pid::alarm(bool state) void out_pid::alarm(bool state)
{ {
if (!item || item->itemArg) return; if (!item || !item->itemArg) return;
if (state) if (state)
{ {
aJsonObject * kPIDObj = aJson.getArrayItem(item->itemArg, 0); aJsonObject * kPIDObj = aJson.getArrayItem(item->itemArg, 0);
if (kPIDObj->type != aJson_Array) if (!kPIDObj || kPIDObj->type != aJson_Array)
{ {
errorSerial<<F("Invalid PID param array.")<<endl; errorSerial<<F("Invalid PID param array.")<<endl;
return; return;
@@ -281,8 +284,8 @@ debugSerial<<F("Input value:")<<store->input<<endl;
store->alarmTimer=millis(); store->alarmTimer=millis();
if (store->alarmArmed) if (store->alarmArmed)
{ {
alarm(false); store->alarmArmed=false;
store->alarmArmed=false; alarm(false);
} }
return 1; return 1;
//break; //break;