diff -r 198f3b4bd0d8 -r 73cd31dc6ce1 thermferm/thermferm.c --- a/thermferm/thermferm.c Tue Feb 17 23:27:47 2015 +0100 +++ b/thermferm/thermferm.c Thu Feb 19 14:42:55 2015 +0100 @@ -32,6 +32,7 @@ #include "panel.h" #include "futil.h" #include "xutil.h" +#include "pid.h" int my_shutdown = FALSE; @@ -845,6 +846,8 @@ #endif int current_step, valid_step, time_until_now; float previous_target; + pid_var *pid; + if (lockprog((char *)"thermferm")) { syslog(LOG_NOTICE, "Can't lock"); @@ -1307,7 +1310,7 @@ */ for (unit = Config.units; unit; unit = unit->next) { if ((unit->mode == UNITMODE_FRIDGE) || (unit->mode == UNITMODE_BEER) || (unit->mode == UNITMODE_PROFILE)) { - double pTerm, dTerm, iTerm; +// double pTerm, dTerm, iTerm; sp = unit->beer_set; pv = unit->beer_temperature / 1000.0; @@ -1325,19 +1328,47 @@ if (P_err < unit->idle_rangeH && P_err > unit->idle_rangeL) { P_err = 0.0; } - pTerm = unit->PID_Kp * P_err; + + pid = (pid_var *)malloc(sizeof(pid_var)); + pid->dState = unit->PID_dState; + pid->iState = unit->PID_iState; + pid->iMax = 100.0; + pid->iMin = -100.0; + pid->pGain = unit->PID_Kp; + pid->iGain = unit->PID_Ki; + pid->dGain = unit->PID_Kd; + + Out = UpdatePID(pid, P_err, pv); + + if (Out > 100.0) + Out = 100.0; + if (Out < -100.0) + Out = -100.0; + + if (debug) + fprintf(stdout, "sp=%.2f pv=%.2f dState=%.2f P_err=%.2f iState=%.2f Out=%.2f\n", + sp, pv, unit->PID_dState, P_err, unit->PID_iState, Out); + if ((Out >= 1) || (Out <= -1) || (seconds == 60) || unit->heater_state || unit->cooler_state) { + syslog(LOG_NOTICE, "sp=%.2f pv=%.2f P_err=%.2f dState=%.2f iState=%.2f Out=%.2f", + sp, pv, P_err, unit->PID_dState, unit->PID_iState, Out); + } + + unit->PID_iState = pid->iState; + unit->PID_dState = pid->dState; + +// pTerm = unit->PID_Kp * P_err; /* * Calculate the intergral state with appropriate limiting */ - unit->PID_iState += P_err; +// unit->PID_iState += P_err; /* Limit integral error */ - if (unit->PID_iState < -100.0) - unit->PID_iState = -100.0; - if (unit->PID_iState > 100.0) - unit->PID_iState = 100.0; - iTerm = unit->PID_iState * unit->PID_Ki; - dTerm = (unit->PID_dState - pv) * unit->PID_Kd; +// if (unit->PID_iState < -100.0) +// unit->PID_iState = -100.0; +// if (unit->PID_iState > 100.0) +// unit->PID_iState = 100.0; +// iTerm = unit->PID_iState * unit->PID_Ki; +// dTerm = (unit->PID_dState - pv) * unit->PID_Kd; /* * A postive value means heating, a negative value cooling. @@ -1346,19 +1377,19 @@ * Increase Kd until a little damping. * Increase Ki after Kp and Kd are set until longterm convergence. */ - Out = pTerm + dTerm + iTerm; - if (Out > 100.0) - Out = 100.0; - if (Out < -100.0) - Out = -100.0; - if (debug) - fprintf(stdout, "sp=%.2f pv=%.2f dState=%.2f P_err=%.2f iState=%.2f Out=%.2f\n", - sp, pv, unit->PID_dState, P_err, unit->PID_iState, Out); - if ((Out >= 1) || (Out <= -1) || (seconds == 60) || unit->heater_state || unit->cooler_state) { - syslog(LOG_NOTICE, "sp=%.2f pv=%.2f P_err=%.2f dState=%.2f iState=%.2f pTerm=%.2f iTerm=%.2f dTerm=%.2f Out=%.2f", - sp, pv, P_err, unit->PID_dState, unit->PID_iState, pTerm, iTerm, dTerm, Out); - } - unit->PID_dState = pv; +// Out = pTerm + dTerm + iTerm; +// if (Out > 100.0) +// Out = 100.0; +// if (Out < -100.0) +// Out = -100.0; +// if (debug) +// fprintf(stdout, "sp=%.2f pv=%.2f dState=%.2f P_err=%.2f iState=%.2f Out=%.2f\n", +// sp, pv, unit->PID_dState, P_err, unit->PID_iState, Out); +// if ((Out >= 1) || (Out <= -1) || (seconds == 60) || unit->heater_state || unit->cooler_state) { +// syslog(LOG_NOTICE, "sp=%.2f pv=%.2f P_err=%.2f dState=%.2f iState=%.2f pTerm=%.2f iTerm=%.2f dTerm=%.2f Out=%.2f", +// sp, pv, P_err, unit->PID_dState, unit->PID_iState, pTerm, iTerm, dTerm, Out); +// } +// unit->PID_dState = pv; if (unit->heater_address) { if (Out >= 1) {