149 lines
2.9 KiB
C++
149 lines
2.9 KiB
C++
//******************************************************************************
|
|
//
|
|
// IPID.cpp - differential PID equation - type C - out(n) = out(n-1) - Kp[PV(n)-PV(n-1)] + Ki*T*e(n) - (Kd/T)*[PV(n) - 2PV(n-1) + PV(n-2)]
|
|
// Ivo Carvalho 29/4/2011
|
|
//
|
|
//******************************************************************************
|
|
|
|
#if !defined (IPID_H)
|
|
#define IPID_H
|
|
|
|
/** @file
|
|
differential PID equation */
|
|
|
|
|
|
#include "Level0.h"
|
|
#include "Level1.h"
|
|
#include "Level2.h"
|
|
//OBJECT_DLL(IPID)
|
|
|
|
/** differential PID equation */
|
|
class IPID {
|
|
|
|
//OBJECT_DLL_STUFF(IPID)
|
|
private:
|
|
|
|
float error;
|
|
float old_error;
|
|
float old_old_error;
|
|
float Kp_constant;
|
|
float Ki_constant;
|
|
float Kd_constant;
|
|
float T_constant;
|
|
float P_realtime_constant;
|
|
float I_realtime_constant;
|
|
float D_realtime_constant;
|
|
float upper_limit;
|
|
float lower_limit;
|
|
float old_output;
|
|
float old_PV;
|
|
float old_old_PV;
|
|
|
|
|
|
public:
|
|
|
|
bool LoadOldOutputWithinLimits(float old_output_to_load);
|
|
|
|
float GetUpperLimit(){
|
|
return (this->upper_limit);
|
|
}
|
|
|
|
float GetLowerLimit(){
|
|
return (this->lower_limit);
|
|
}
|
|
|
|
float GetOldOutput(){
|
|
return (this->old_output);
|
|
}
|
|
|
|
float GetRealtimeConstantP(){
|
|
return (this->P_realtime_constant);
|
|
}
|
|
|
|
float GetRealtimeConstantI(){
|
|
return (this->I_realtime_constant);
|
|
}
|
|
|
|
float GetRealtimeConstantD(){
|
|
return (this->D_realtime_constant);
|
|
}
|
|
|
|
float GetConstantKp(){
|
|
return (this->Kp_constant);
|
|
}
|
|
|
|
float GetConstantKi(){
|
|
return (this->Ki_constant);
|
|
}
|
|
|
|
float GetConstantKd(){
|
|
return (this->Kd_constant);
|
|
}
|
|
|
|
float GetConstantT(){
|
|
return (this->T_constant);
|
|
}
|
|
|
|
float GetError(){
|
|
return (this->error);
|
|
}
|
|
|
|
float GetOldProcessVariable(){
|
|
return this->old_PV;
|
|
}
|
|
|
|
float GetOldOldProcessVariable(){
|
|
return this->old_old_PV;
|
|
}
|
|
|
|
float GetOldError(){
|
|
return (this->old_error);
|
|
}
|
|
|
|
float GetOldOldError(){
|
|
return (this->old_old_error);
|
|
}
|
|
|
|
IPID (float set_Kp_constant, float set_Ki_constant, float set_Kd_constant, float set_T_constant, float set_upper_limit, float set_lower_limit);
|
|
|
|
IPID (float set_P_realtime_constant, float set_I_realtime_constant, float set_D_realtime_constant, float set_upper_limit, float set_lower_limit);
|
|
|
|
bool SetPIDConstants(float set_Kp_constant, float set_Ki_constant, float set_Kd_constant, float set_T_constant);
|
|
|
|
bool SetRealtimePIDConstants(float set_P_realtime_constant, float set_I_realtime_constant, float set_D_realtime_constant);
|
|
|
|
bool SetLimits(float set_upper_limit, float set_lower_limit);
|
|
|
|
float CalculatePID(float process_variable, float setpoint);
|
|
|
|
float CalculatePI(float process_variable, float setpoint);
|
|
|
|
float CalculateP(float process_variable, float setpoint);
|
|
|
|
float CalculatePID_types(float process_variable, float setpoint, float type);
|
|
|
|
float ReturnErrorInPercentage(float process_variable, float setpoint);
|
|
|
|
~IPID();
|
|
|
|
private:
|
|
|
|
bool SortWaveform();
|
|
bool RemoveRepeatedValues();
|
|
|
|
};
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|