Index: firmware/App/Modes/FPModes/ModeGenPermeate.c =================================================================== diff -u -rfd21e08ba076054488aa112641e0db4191ee0b35 -recb538c8bf67a7a62d11a1186a9ef5fe53cf9d9e --- firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision fd21e08ba076054488aa112641e0db4191ee0b35) +++ firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision ecb538c8bf67a7a62d11a1186a9ef5fe53cf9d9e) @@ -17,6 +17,7 @@ #include "BoostPump.h" #include "FPInterface.h" +#include "Flow.h" #include "FPModeStandby.h" #include "FPOperationModes.h" #include "Level.h" @@ -39,12 +40,14 @@ // ********** private definitions ********** -#define PRE_GEN_PERMEATE_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen permeate mode data published. -#define GEN_PERMEATE_BOOST_PUMP_TGT_PSI 25.0F ///< Pressure target in PSI for the boost pump during generate permeate mode. -#define GEN_PERMEATE_RO_PUMP_TGT_ML 750 ///< Flow target in ml/min for the ro pump during generate permeate mode. -#define PUMP_REST_TIMEOUT_MS ( 3 * MS_PER_SECOND ) ///< Verify Water timer ( in ms ) -#define RO_REJECTION_WAIT_TIME_MS ( 8 * MS_PER_SECOND ) ///< Verify Water timer ( in ms ) -#define MIN_SAMPLES_NEEDED_FOR_DUTY_CYCLE_AVG 10 ///< Minimum number for samples needed for calculating the average duty cycle +#define PRE_GEN_PERMEATE_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen permeate mode data published. +#define GEN_PERMEATE_BOOST_PUMP_TGT_PSI 25.0F ///< Pressure target in PSI for the boost pump during generate permeate mode. +#define GEN_PERMEATE_RO_PUMP_TGT_ML 750 ///< Flow target in ml/min for the ro pump during generate permeate mode. +#define PUMP_REST_TIMEOUT_MS ( 3 * MS_PER_SECOND ) ///< Duraion for open loop control at the start of tank fill/full state ( in ms ) +#define RO_REJECTION_WAIT_TIME_MS ( 8 * MS_PER_SECOND ) ///< RO rejection alarm wait time. 5 seconds for RR to stabilize and 3 seconds for calculating rolling average ( in ms ) +#define MIN_SAMPLES_NEEDED_FOR_DUTY_CYCLE_AVG 10 ///< Minimum number for samples needed for calculating the average duty cycle +#define PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_TIME_MS ( 1 * MS_PER_SECOND ) ///< Verify Water timer ( in ms ) +#define PERMEATE_FLOW_TOLERANCE 1.25 ///< Permeate flow tolerance limit // ********** private data ********** @@ -61,6 +64,7 @@ static BOOL isFullAvgValid; ///< Flag to check if the average full duty cycle value is valid or not. static U32 timeInState; ///< Time to wait after reset before starting close loop control (temporary) static BOOL stateTransitioned; ///< Flag to check if permeate tank state transitioned +static U32 permeateFlowPersistanceStartTimeMS; ///< Permeate flow out range alarm timer // ********** private function prototypes ********** @@ -97,6 +101,7 @@ isFullAvgValid = FALSE; timeInState = 0; stateTransitioned = FALSE; + permeateFlowPersistanceStartTimeMS = 0; } /*********************************************************************//** @@ -129,6 +134,7 @@ U32 execGenPermeateMode( void ) { FP_GENP_MODE_STATE_T prevState = genPermeateState; + F32 permeateFlow = 0.0F; // execute current gen Permeate state switch ( genPermeateState ) @@ -156,6 +162,26 @@ setModeGenPTransition( genPermeateState ); SEND_EVENT_WITH_2_U32_DATA( FP_EVENT_GENP_CHANGE, genPermeateState, prevState ) } + + permeateFlow = getFilteredFlow( P16_FLOW ); + // check for permeate flow (P16) is not within range + if( permeateFlow >= ( GEN_PERMEATE_RO_PUMP_TGT_ML * PERMEATE_FLOW_TOLERANCE ) ) + { + if ( 0 == permeateFlowPersistanceStartTimeMS ) + { + permeateFlowPersistanceStartTimeMS = getMSTimerCount(); + } + else if ( TRUE == didTimeout( permeateFlowPersistanceStartTimeMS, PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_TIME_MS ) ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_PERMEATE_FLOW_OUT_HIGH_RANGE, PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_TIME_MS, permeateFlow) + } + } + // check for permeate flow (P16) within range and reset the alarm timer + else if ( permeateFlow < ( GEN_PERMEATE_RO_PUMP_TGT_ML * PERMEATE_FLOW_TOLERANCE ) ) + { + permeateFlowPersistanceStartTimeMS = 0; + } + //Publish Gen Permeate mode data publishGenPModeData(); @@ -166,14 +192,15 @@ * @brief * The setModeGenPTransition function sets the actuators and variables * for the state transition in generate permeate mode. - * @details Inputs: Valve states, Pump speed + * @details Inputs: none * @details Outputs: Actuate valves, pumps as desired. * @param state gen permeate state enum * @return none *************************************************************************/ static void setModeGenPTransition( FP_GENP_MODE_STATE_T state ) { F32 initDutyCycle = 0.0F; + // Execute on running state switch( state ) { @@ -207,8 +234,8 @@ /*********************************************************************//** * @brief * The handleGenPTankFillState handles the fill state of gen water. - * @details \b Inputs: none - * @details \b Outputs: none + * @details \b Inputs: timeInState, stateTransitioned + * @details \b Outputs: stateTransitioned * @return the next state of gen water mode *************************************************************************/ static FP_GENP_MODE_STATE_T handleGenPTankFillState( void ) @@ -238,8 +265,8 @@ /*********************************************************************//** * @brief * The handleGenPTankFullState handles the full state of gen permeate. - * @details \b Inputs: stateDelayTime - * @details \b Outputs: none + * @details \b Inputs: timeInState, stateTransitioned + * @details \b Outputs: stateTransitioned * @return the next state of gen permeate mode *************************************************************************/ static FP_GENP_MODE_STATE_T handleGenPTankFullState( void ) @@ -266,7 +293,7 @@ * The updateDutyCycleAvg function accumulates duty cycle samples for * states in generate permeate mode. * @details \b Inputs: none - * @details \b Outputs: none + * @details \b Outputs: fillDutySum, fillDutyCount, fullDutySum, fullDutyCount * @param state genPermeateState enum * @return none *************************************************************************/ @@ -290,8 +317,10 @@ * @brief * The calculateDutyCycleAvg function computes the average duty cycle * from the accumulated samples collected using updateDutyCyle. - * @details \b Inputs: none - * @details \b Outputs: none + * @details \b Inputs: fillDutyCount, fullDutyCount + * @details \b Outputs: prevFillAvgDutyCycle, isFillAvgValid, fillDutySum, + * fillDutyCount, prevFullAvgDutyCycle, isFullAvgValid, fullDutySum, + * fullDutyCount * @param state genPermeateState enum * @return none *************************************************************************/