Index: firmware/App/Modes/FPModes/FlushConcentrate.c =================================================================== diff -u -r25e44b3d8133ef2d8bed9a2e2dd55696c41e8acf -r3b38773ea822bb860a0fd3af416d2380a095b499 --- firmware/App/Modes/FPModes/FlushConcentrate.c (.../FlushConcentrate.c) (revision 25e44b3d8133ef2d8bed9a2e2dd55696c41e8acf) +++ firmware/App/Modes/FPModes/FlushConcentrate.c (.../FlushConcentrate.c) (revision 3b38773ea822bb860a0fd3af416d2380a095b499) @@ -20,6 +20,7 @@ #include "FlowSensor.h" #include "FlushConcentrate.h" #include "FPOperationModes.h" +#include "Level.h" #include "MessageSupport.h" #include "Messaging.h" #include "PermeateTank.h" @@ -39,23 +40,27 @@ #define CONCENTRATE_FLUSH_MAX_TIMEOUT ( 600 * MS_PER_SECOND ) ///< Max override timeout for 10 minutes #define CONCENTRATE_FLUSH_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. #define CONCENTRATE_FLUSH_TIMEOUT ( 30 * MS_PER_SECOND ) ///< Concentrate flush timer (in ms) -#define CONCENTRATE_FLUSH_RO_PUMP_TGT_PWM 0.8F ///< target in PWM % for the RO pump during concentrate flush. +#define CONCENTRATE_FLUSH_RO_PUMP_TGT_PWM 0.75F ///< target in PWM % for the RO pump during concentrate flush. #define CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during concentrate flush. #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD_ML 1000.0F ///< Integrated volume threshold in ml #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD_PCT 0.9F ///< Integrated volume threshold percentage #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD CONCENTRATE_FLUSH_VOLUME_THRESHOLD_ML * CONCENTRATE_FLUSH_VOLUME_THRESHOLD_PCT ///< alarm threshold for integrated volume +#define CONCENTRATE_FLUSH_WAIT_FOR_TANK_FULL_TIMEOUT ( 60 * MS_PER_SECOND ) ///< Concentrate flush wait for tank full timer (in ms) +#define CONCENTRATE_FLUSH_WAIT_FOR_TANK_FULL_TGT_FLOW 700 ///< target flow rate for waiting for tank state +#define CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during concentrate flush. +#define MIN_BOOST_PUMP_DUTY_CYCLE_PCT 0.5F ///< Minimum duty cycle value for boost pump during open loop control + // ********** private data ********** -static const F32 CONCENTRATE_FLOW_INTEGRATOR = 1.0F / (F32)( SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); ///< Multiplier to convert flow (mL/min) into volume (mL) for period of general task interval. static FP_CONC_FLUSH_STATE_T concentrateFlushState; ///< Currently active Concentrate flush state. static U32 concentrateFlushDataPublicationTimerCounter; ///< Used to schedule Concentrate flush data publication to CAN bus. static OVERRIDE_U32_T concentrateFlushDataPublishInterval; ///< Concentrate Flush mode data publish interval. static OVERRIDE_U32_T concentrateFlushTimeout; ///< Concentrate Flush timeout value static U32 concentrateFlushTimer; ///< Concentrate Flush timeout timer static BOOL pendingStartConcentrateFlushRequest; ///< signal to start flushing. static BOOL isFlushComplete; ///< Concentrate Flush complete BOOL -static F32 cumulativeConcentrateVolume_mL; ///< cumulative concentrate volume for integrated volume +static BOOL isTankFilled; ///< Concentrate tank filled in permeate flush state // ********** private function prototypes ********** @@ -88,7 +93,7 @@ concentrateFlushTimer = 0; isFlushComplete = FALSE; pendingStartConcentrateFlushRequest = FALSE; - cumulativeConcentrateVolume_mL = 0.0F; + isTankFilled = FALSE; } /*********************************************************************//** @@ -131,35 +136,45 @@ /*********************************************************************//** * @brief * The handleConcentrateFlushProgressState handles the in progress state of Concentrate flush - * @details \b Inputs: none - * @details \b Outputs: none + * @details \b Inputs: concentrateFlushTimer + * @details \b Outputs: isFlushComplete * @return the next state of Concentrate flush state *************************************************************************/ static FP_CONC_FLUSH_STATE_T handleConcentrateFlushProgressState( void ) { FP_CONC_FLUSH_STATE_T state = CONC_FLUSH_IN_PROGRESS; - BOOL isVolumeOutOfRange = FALSE; + LEVEL_STATE_T level = getLevelStatus( P25_LEVL ); // if ( TRUE == 1 ) )// TODO Alarm and Stop State Rework // { // state = CONC_FLUSH_PAUSED; // } - // TODO - Condition is to be removed once P7 flow meter is removed. - cumulativeConcentrateVolume_mL = getFlowRate( P7_FLOW ) * CONCENTRATE_FLOW_INTEGRATOR; - if( TRUE == didTimeout( concentrateFlushTimer, getConcentrateFlushTimeout() ) ) + if ( TRUE == didTimeout( concentrateFlushTimer, getConcentrateFlushTimeout() ) ) { - isVolumeOutOfRange = ( cumulativeConcentrateVolume_mL >= CONCENTRATE_FLUSH_VOLUME_THRESHOLD ? TRUE : FALSE ); - - if( FALSE == isVolumeOutOfRange ) - { isFlushComplete = TRUE; state = CONC_FLUSH_PAUSED; + } + // Manual control of Permeate tank to prevent over fill. + if ( LEVEL_STATE_HIGH == level ) + { + setValveState( M4_VALV, VALVE_STATE_CLOSED ); + if ( TRUE == isBoostPumpInstalled() ) + { + F32 currentDutyCyclePct = getCurrentBoostPumpDutyCyclePCT() > MIN_BOOST_PUMP_DUTY_CYCLE_PCT ? getCurrentBoostPumpDutyCyclePCT(): MIN_BOOST_PUMP_DUTY_CYCLE_PCT; + + setBoostPumpTargetDutyCycle( currentDutyCyclePct ); + isTankFilled = TRUE; } - else + } + else if ( LEVEL_STATE_LOW == level ) + { + setValveState( M4_VALV, VALVE_STATE_OPEN ); + // set boost pump to closed loop when M4 closed. Added Tank fill check to avoid reset during initial transition + if ( ( TRUE == isBoostPumpInstalled() ) && ( TRUE == isTankFilled ) ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_CONCENTRATE_FLUSH_VOLUME_OUT_OF_RANGE, CONCENTRATE_FLUSH_VOLUME_THRESHOLD, cumulativeConcentrateVolume_mL) - state = CONC_FLUSH_PAUSED; + setBoostPumpTargetPressure( CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI ); + isTankFilled = FALSE; } } @@ -168,9 +183,9 @@ /*********************************************************************//** * @brief - * The handleConcentrateFlushProgressState handles the in progress state of Concentrate flush - * @details \b Inputs: none - * @details \b Outputs: none + * The handleConcentrateFlushPausedState handles the paused state of Concentrate flush + * @details \b Inputs: pendingStartConcentrateFlushRequest + * @details \b Outputs: isFlushComplete, pendingStartConcentrateFlushRequest * @return the next state of Concentrate flush state *************************************************************************/ static FP_CONC_FLUSH_STATE_T handleConcentrateFlushPausedState( void ) @@ -210,14 +225,12 @@ setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_OPEN ); setValveState( P39_VALV, VALVE_STATE_OPEN ); - startPermeateTankControl(); if ( TRUE == isBoostPumpInstalled() ) { setBoostPumpTargetPressure( CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI ); } setROPumpTargetDutyCycle( CONCENTRATE_FLUSH_RO_PUMP_TGT_PWM, TRUE ); concentrateFlushTimer = getMSTimerCount(); - cumulativeConcentrateVolume_mL = 0; break; case CONC_FLUSH_PAUSED: @@ -232,7 +245,6 @@ setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); - if ( TRUE == isBoostPumpInstalled() ) { signalBoostPumpHardStop();