Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r353cb96644812b6278a5b2d98c1b7946a5c47d6e -r3012a339084bbb5fa796d41680bc0c48bdc9f691 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 353cb96644812b6278a5b2d98c1b7946a5c47d6e) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 3012a339084bbb5fa796d41680bc0c48bdc9f691) @@ -91,7 +91,8 @@ BOOL startHeaterSignal; ///< Heater start indication flag. BOOL isHeaterOn; ///< Heater on/off status flag. OVERRIDE_F32_T dutyCycle; ///< Heater duty cycle. - F32 targetFlowLPM; ///< Heater target flow in L/min. + F32 targetFlowLPM; ///< Heater target flow in L/min. + F32 nomTargetFlowLPM; ///< Heater nominal target flow in L/min. BOOL hasTargetTempChanged; ///< Heater target temperature change flag indicator. F32 heaterEstGain; ///< Heater estimation gain during the run. F32 calculatedTemperatureC; ///< Heater calculated temperature. @@ -150,6 +151,7 @@ heatersStatus[ heater ].dutyCycle.ovInitData = HEATERS_MIN_DUTY_CYCLE; heatersStatus[ heater ].dutyCycle.override = 0; heatersStatus[ heater ].targetFlowLPM = 0.0F; + heatersStatus[ heater ].nomTargetFlowLPM = 0.0F; heatersStatus[ heater ].hasTargetTempChanged = FALSE; heatersStatus[ heater ].heaterEstGain = HEATERS_NEUTRAL_EST_GAIN; heatersStatus[ heater ].controlIntervalCounter = 0; @@ -516,47 +518,48 @@ HEATERS_STATE_T state = HEATER_EXEC_STATE_PRIMARY_RAMP_TO_TARGET; DG_HEATERS_T heater = DG_PRIMARY_HEATER; F32 inletTemperature = getTemperatureValue( (U32)TEMPSENSORS_HEAT_DISINFECT ); - F32 targetFlow = 0.0F; + F32 targetFlowLPM = 0.0F; F32 dutyCycle = 0.0F; F32 targetTemperature = heatersStatus[ heater ].targetTempC; DG_OP_MODE_T opMode = getCurrentOperationMode(); if ( DG_MODE_FILL == opMode ) { // If the previous average fill flow rate is 0, use the nominal target RO flow from the RO pump - targetFlow = ( getAvgFillFlowRateLPM() - 0.0F > NEARLY_ZERO ? getAvgFillFlowRateLPM() : getTargetROPumpFlowRateLPM() ); - dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlow, TRUE ); - state = HEATER_EXEC_STATE_PRIMARY_CONTROL_TO_TARGET; + targetFlowLPM = ( getAvgFillFlowRateLPM() - 0.0F > NEARLY_ZERO ? getAvgFillFlowRateLPM() : getTargetROPumpFlowRateLPM() ); + dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlowLPM, TRUE ); + state = HEATER_EXEC_STATE_PRIMARY_CONTROL_TO_TARGET; } else if ( ( DG_MODE_GENE == opMode ) || ( DG_MODE_DRAI == opMode ) ) { targetTemperature += DELTA_TEMPERATURE_TIME_COSNTANT_C; - targetFlow = getTargetROPumpFlowRateLPM(); - dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlow, FALSE ); + targetFlowLPM = getTargetROPumpFlowRateLPM(); + dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlowLPM, FALSE ); state = HEATER_EXEC_STATE_PRIMARY_CONTROL_TO_TARGET; } else if ( ( DG_MODE_HEAT == opMode ) || ( DG_MODE_CHEM == opMode ) ) { // If the mode is any of the disinfects, specially heat, use the target flow rate instead of the avg. flow // Most of the times the heater should be running at 100% duty cycle since the target temperature is far from // the inlet temperature - targetFlow = getTargetROPumpFlowRateLPM(); + targetFlowLPM = getTargetROPumpFlowRateLPM(); inletTemperature = getTemperatureValue( (U32)TEMPSENSORS_OUTLET_PRIMARY_HEATER ); - dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlow, FALSE ); + dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlowLPM, FALSE ); state = HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET; } else { // Calculate the energy equation and set the duty cycle // This is for other modes (i.e. standby or service) - targetFlow = getTargetROPumpFlowRateLPM(); - dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlow, FALSE ); - state = HEATER_EXEC_STATE_PRIMARY_CONTROL_TO_TARGET; + targetFlowLPM = getTargetROPumpFlowRateLPM(); + dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlowLPM, FALSE ); + state = HEATER_EXEC_STATE_PRIMARY_CONTROL_TO_TARGET; } // Update the calculated target temperature and flow heatersStatus[ DG_PRIMARY_HEATER ].calculatedTemperatureC = targetTemperature; - heatersStatus[ DG_PRIMARY_HEATER ].targetFlowLPM = targetFlow; + heatersStatus[ DG_PRIMARY_HEATER ].targetFlowLPM = targetFlowLPM; + heatersStatus[ DG_PRIMARY_HEATER ].nomTargetFlowLPM = getTargetROPumpFlowRateLPM(); setHeaterDutyCycle( heater, dutyCycle ); return state; @@ -589,7 +592,6 @@ heatersStatus[ heater ].calculatedTemperatureC = targetTemperature; heatersStatus[ heater ].targetFlowLPM = targetFlow; heatersStatus[ heater ].hasTargetTempChanged = FALSE; - setHeaterDutyCycle( heater, dutyCycle ); } @@ -850,7 +852,7 @@ { BOOL status = FALSE; F32 targetFlow = ( DG_PRIMARY_HEATER == heater ? getTargetROPumpFlowRateLPM() : getTargetDialysateFlowLPM() ); - BOOL hasFlowChanged = ( fabs( targetFlow - heatersStatus[ heater ].targetFlowLPM ) > NEARLY_ZERO ? TRUE : FALSE ); + BOOL hasFlowChanged = ( fabs( targetFlow - heatersStatus[ heater ].nomTargetFlowLPM ) > NEARLY_ZERO ? TRUE : FALSE ); // Check if the target flow has changed or the target temperature has changed. if ( TRUE == hasFlowChanged )