thermferm/thermferm.c

changeset 317
18dd6eadba31
parent 316
73cd31dc6ce1
child 318
aad7789a40f2
--- a/thermferm/thermferm.c	Thu Feb 19 14:42:55 2015 +0100
+++ b/thermferm/thermferm.c	Thu Feb 19 15:43:43 2015 +0100
@@ -1311,51 +1311,72 @@
 	    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;
+		    int	usePid = TRUE;
 
 		    sp = unit->beer_set;
 		    pv = unit->beer_temperature / 1000.0;
 		    if (unit->mode == UNITMODE_FRIDGE) {
 			sp = unit->fridge_set;
 			pv = unit->air_temperature / 1000.0;
+			usePid = FALSE;
 		    } else if (unit->mode == UNITMODE_PROFILE) {
 			sp = unit->prof_target;
 		    }
 
-		    /*
-		     * PID controller compute
-		     */
 		    P_err = sp - pv;
 		    if (P_err < unit->idle_rangeH && P_err > unit->idle_rangeL) {
 			P_err = 0.0;
 		    }
 
-		    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;
+		    if (usePid) {
+			/*
+			 * PID controller compute
+			 */
+		    	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);
+		    	Out = UpdatePID(pid, P_err, pv);
+
+		    	if (Out > 100.0)
+			    Out = 100.0;
+		    	if (Out < -100.0)
+			    Out = -100.0;
 
-		    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",
+		    	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",
+		    	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;
+		    	free(pid);
+		    	pid = NULL;
+		    } else {
+			/*
+			 * Simple temperature control
+			 */
+			if (P_err < 0) {
+			    Out = 100.0;
+			} else if (P_err > 0) {
+			    Out = -100.0;
+			} else {
+			    Out = 0.0;
+			}
+			if ((Out >= 1) || (Out <= -1) || (seconds == 60) || unit->heater_state || unit->cooler_state) {
+			    syslog(LOG_NOTICE, "sp=%.2f pv=%.2f P_err=%.2f Out=%.2f",
+				sp, pv, P_err, Out);
+			}
 		    }
 
-		    unit->PID_iState = pid->iState;
-		    unit->PID_dState = pid->dState;
-
 //		    pTerm = unit->PID_Kp * P_err;
 
 		    /*

mercurial