Index: firmware/App/Modes/FPModes/InletPressureCheck.c =================================================================== diff -u -r3417933e6edf61a914c428e2fa944b3b349272a4 -rd25471a9b256c1dce1aec7de73f53c730ff70cd0 --- firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision 3417933e6edf61a914c428e2fa944b3b349272a4) +++ firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision d25471a9b256c1dce1aec7de73f53c730ff70cd0) @@ -38,9 +38,11 @@ #define INLET_PRES_CHECK_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. #define INLET_PRES_CHECK_TIMEOUT ( 60 * MS_PER_SECOND ) ///< Inlet Pressure Check timer (in ms) #define INLET_PRES_CHECK_BOOST_PUMP_TGT_PWM 0.2F ///< target in PWM % for the BOOST pump during inlet pressure check. -#define INLET_PRES_CHECK_TGT_PSI 30 ///< Pressure target in PSI for the M3 during inlet pressure check. +#define INLET_PRES_CHECK_WITH_BP_TGT_PSI 30 ///< Pressure target in PSI for the M3 during inlet pressure check with booster pump. +#define INLET_PRES_CHECK_TGT_PSI 75 ///< Pressure target in PSI for the M3 during inlet pressure check without booster pump. #define INLET_PRES_CHECK_TOLERANCE_PSI 2 ///< Pressure tolerance in PSI for the M3 during inlet pressure check. -#define INLET_PRES_PERSISTENCE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check. +#define INLET_PRES_PERSISTENCE_TIME_WITH_BP_MS ( 10 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check with booster pump. +#define INLET_PRES_PERSISTENCE_TIME_MS ( 1 * MS_PER_SECOND ) ///< Persistence time for M3 during inlet pressure check without booster pump. // ********** private data ********** @@ -127,40 +129,67 @@ * The handleInletPressureCheckProgressState handles the in progress * state of inlet pressure check * @details \b Inputs: none - * @details \b Outputs: none + * @details \b Outputs: isPressureCheckComplete * @return the next state of Inlet Pressure check state *************************************************************************/ static FP_INLET_PRES_CHECK_STATE_T handleInletPressureCheckProgressState( void ) { FP_INLET_PRES_CHECK_STATE_T state = INLET_PRES_CHECK_IN_PROGRESS; F32 inletPressure = 0.0; + F32 thresholdMin = INLET_PRES_CHECK_WITH_BP_TGT_PSI - INLET_PRES_CHECK_TOLERANCE_PSI; + F32 thresholdMax = INLET_PRES_CHECK_WITH_BP_TGT_PSI + INLET_PRES_CHECK_TOLERANCE_PSI; inletPressure = getFilteredPressure(M3_PRES); - // check for inlet pressure (M3) within range - if( ( inletPressure >= (INLET_PRES_CHECK_TGT_PSI - INLET_PRES_CHECK_TOLERANCE_PSI) ) && ( inletPressure <= (INLET_PRES_CHECK_TGT_PSI + INLET_PRES_CHECK_TOLERANCE_PSI) ) ) + + if ( TRUE == isBoostPumpInstalled() ) { - if ( 0 == inletPressureCheckPersistanceStartTimeMS ) + // check for inlet pressure (M3) within range + if( ( inletPressure >= thresholdMin ) && ( inletPressure <= thresholdMax ) ) { - inletPressureCheckPersistanceStartTimeMS = getMSTimerCount(); + if ( 0 == inletPressureCheckPersistanceStartTimeMS ) + { + inletPressureCheckPersistanceStartTimeMS = getMSTimerCount(); + } + else if ( TRUE == didTimeout( inletPressureCheckPersistanceStartTimeMS, INLET_PRES_PERSISTENCE_TIME_WITH_BP_MS ) ) + { + inletPressureCheckPersistanceStartTimeMS = 0; + isPressureCheckComplete = TRUE; + state = INLET_PRES_CHECK_PAUSED; + } } - else if ( TRUE == didTimeout( inletPressureCheckPersistanceStartTimeMS, INLET_PRES_PERSISTENCE_TIME_MS ) ) + // reset the persistence timer when inlet pressure out of range + else if( ( inletPressure <= thresholdMin ) || ( inletPressure >= thresholdMax ) ) { inletPressureCheckPersistanceStartTimeMS = 0; - isPressureCheckComplete = TRUE; - state = INLET_PRES_CHECK_PAUSED; + // Trigger alarm if M3 pressure is not within range + if ( TRUE == didTimeout( inletPressureCheckTimer, getInletPressureCheckTimeout() ) ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, INLET_PRES_CHECK_TIMEOUT, inletPressure) + state = INLET_PRES_CHECK_PAUSED; + } } } - // reset the persistence timer when inlet pressure out of range - else if( ( inletPressure <= (INLET_PRES_CHECK_TGT_PSI - INLET_PRES_CHECK_TOLERANCE_PSI) ) || ( inletPressure >= (INLET_PRES_CHECK_TGT_PSI + INLET_PRES_CHECK_TOLERANCE_PSI) ) ) + else { - inletPressureCheckPersistanceStartTimeMS = 0; + if( inletPressure >= INLET_PRES_CHECK_TGT_PSI ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, INLET_PRES_CHECK_TGT_PSI, inletPressure) + state = INLET_PRES_CHECK_PAUSED; + } + else + { + if ( 0 == inletPressureCheckPersistanceStartTimeMS ) + { + inletPressureCheckPersistanceStartTimeMS = getMSTimerCount(); + } + else if ( TRUE == didTimeout( inletPressureCheckPersistanceStartTimeMS, INLET_PRES_PERSISTENCE_TIME_MS ) ) + { + inletPressureCheckPersistanceStartTimeMS = 0; + isPressureCheckComplete = TRUE; + state = INLET_PRES_CHECK_PAUSED; + } + } } - // Trigger alarm if M3 pressure is not within range - else if ( TRUE == didTimeout( inletPressureCheckTimer, getInletPressureCheckTimeout() ) ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, INLET_PRES_CHECK_TIMEOUT, inletPressure) - state = INLET_PRES_CHECK_PAUSED; - } return state; } Index: firmware/App/Modes/FPModes/ModePreGenPermeate.c =================================================================== diff -u -r2475e55c224cbd841d61b76f1618451efe6be1f5 -rd25471a9b256c1dce1aec7de73f53c730ff70cd0 --- firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 2475e55c224cbd841d61b76f1618451efe6be1f5) +++ firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision d25471a9b256c1dce1aec7de73f53c730ff70cd0) @@ -232,20 +232,13 @@ // state = FP_PRE_GENP_PAUSED; // } - if ( FALSE == isBoostPumpInstalled() ) + execInletPressureCheck(); + + if ( TRUE == isInletPressureCheckCompleted() ) { signalStartFilterFlush(); state = FP_PRE_GENP_FILTER_FLUSH; } - else - { - execInletPressureCheck(); - if ( TRUE == isInletPressureCheckCompleted() ) - { - signalStartFilterFlush(); - state = FP_PRE_GENP_FILTER_FLUSH; - } - } return state; } Index: firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c =================================================================== diff -u -r2475e55c224cbd841d61b76f1618451efe6be1f5 -rd25471a9b256c1dce1aec7de73f53c730ff70cd0 --- firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 2475e55c224cbd841d61b76f1618451efe6be1f5) +++ firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision d25471a9b256c1dce1aec7de73f53c730ff70cd0) @@ -46,7 +46,7 @@ static U32 preGenPermeateDefWaterCheckTimer; // ********** private function prototypes ********** - +static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefInletPressureCheckState( void ); static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefFlushState( void ); static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefInletWaterState( void ); static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefPausedState( void ); @@ -64,7 +64,7 @@ *************************************************************************/ void initPreGenPermeateDefeaturedMode( void ) { - preGenPermeateDefState = FP_PRE_GENP_DEF_FLUSH; + preGenPermeateDefState = FP_PRE_GENP_INLET_PRESSURE_CHECK; preGenPermeateDefDataPublishInterval.data = PRE_GEN_DEF_PERMEATE_DATA_PUBLISH_INTERVAL; preGenPermeateDefDataPublishInterval.ovData = PRE_GEN_DEF_PERMEATE_DATA_PUBLISH_INTERVAL; preGenPermeateDefDataPublishInterval.ovInitData = 0; @@ -107,14 +107,14 @@ // execute current gen Permeate defeatured state switch ( preGenPermeateDefState ) { + case FP_PRE_GENP_DEF_INLET_PRESSURE_CHECK: + preGenPermeateDefState = handlePreGenPDefInletPressureCheckState(); + break; + case FP_PRE_GENP_DEF_FLUSH: preGenPermeateDefState = handlePreGenPDefFlushState(); break; - case FP_PRE_GENP_DEF_INLET_WATER_CHECK: - preGenPermeateDefState = handlePreGenPDefInletWaterState(); - break; - case FP_PRE_GENP_DEF_PAUSED: preGenPermeateDefState = handlePreGenPDefPausedState(); break; @@ -149,30 +149,27 @@ // Execute on running state switch( state ) { - case FP_PRE_GENP_DEF_FLUSH: - setValveState( M4_VALV, VALVE_STATE_OPEN ); - setValveState( M12_VALV, VALVE_STATE_OPEN ); + case FP_PRE_GENP_DEF_INLET_PRESSURE_CHECK: + setValveState( M4_VALV, VALVE_STATE_CLOSED ); + setValveState( M12_VALV, VALVE_STATE_CLOSED ); setValveState( P6_VALV, VALVE_STATE_CLOSED ); setValveState( P11_VALV, VALVE_STATE_CLOSED ); setValveState( P33_VALV, VALVE_STATE_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); - preGenPermeateDefFlushTimer = getMSTimerCount(); break; - - case FP_PRE_GENP_DEF_INLET_WATER_CHECK: + case FP_PRE_GENP_DEF_FLUSH: setValveState( M4_VALV, VALVE_STATE_OPEN ); - setValveState( M12_VALV, VALVE_STATE_CLOSED ); + setValveState( M12_VALV, VALVE_STATE_OPEN ); setValveState( P6_VALV, VALVE_STATE_CLOSED ); setValveState( P11_VALV, VALVE_STATE_CLOSED ); setValveState( P33_VALV, VALVE_STATE_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); - preGenPermeateDefWaterCheckTimer = getMSTimerCount(); + preGenPermeateDefFlushTimer = getMSTimerCount(); break; - case FP_PRE_GENP_DEF_PAUSED: setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_VALV, VALVE_STATE_CLOSED ); @@ -192,6 +189,32 @@ /*********************************************************************//** * @brief + * The handlePreGenPDefInletPressureCheckState handles the inlet pressure check state of pre gen Permeate. + * @details \b Inputs: none + * @details \b Outputs: none + * @return the next state of pre gen Permeate mode + *************************************************************************/ +static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefInletPressureCheckState( void ) +{ + FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_INLET_PRESSURE_CHECK; + +// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework +// { +// state = FP_PRE_GENP_PAUSED; +// } + + execInletPressureCheck(); + + if ( TRUE == isInletPressureCheckCompleted() ) + { + signalStartFilterFlush(); + state = FP_PRE_GENP_DEF_FLUSH; + } + return state; +} + +/*********************************************************************//** + * @brief * The handlePreGenPDefFlushState handles the supply water of gen permeate * defeatured mode. * @details \b Inputs: preGenPermeateDefFlushTimer @@ -206,6 +229,7 @@ // { // state = FP_PRE_GENP_DEF_PAUSED; // } + //checkInletPressures(); TODO if( TRUE == didTimeout( preGenPermeateDefFlushTimer, PRE_GEN_DEF_FLUSH_TIMEOUT_MS ) ) { Index: firmware/App/Monitors/WaterQualityMonitor.c =================================================================== diff -u -r2475e55c224cbd841d61b76f1618451efe6be1f5 -rd25471a9b256c1dce1aec7de73f53c730ff70cd0 --- firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision 2475e55c224cbd841d61b76f1618451efe6be1f5) +++ firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision d25471a9b256c1dce1aec7de73f53c730ff70cd0) @@ -39,7 +39,8 @@ #define INLET_TEMPERATURE_PERSISTENCE_TIMER_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer to trigger alarm in ms. #define INLET_TEMPERATURE_PERSISTENCE_CLEAR_MS ( 5 * MS_PER_SECOND ) ///< Persistence timer to clear alarm in ms. -#define MAX_INLET_RO_PUMP_PRESSURE_WARNING_PSIG 120.0F ///< Maximum allowed Input pressure to the RO membrane. +#define MAX_INLET_RO_PUMP_PRESSURE_WARNING_HIGH_PSIG 120.0F ///< Maximum allowed Input warning pressure to the RO membrane. +#define MAX_INLET_RO_PUMP_PRESSURE_WARNING_LOW_PSIG 58.0F ///< Minimum Input warning pressure to the RO membrane. #define MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG 25.0F ///< Minimum allowed Input warning low pressure value in psig for RO featured. #define MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG 40.0F ///< Maximum allowed Input warning high pressure value in psig for RO featured. #define MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG 75.0F ///< Maximum allowed Input fault high pressure value in psig for RO featured. @@ -65,6 +66,11 @@ #define PERMEATE_FLOW_FAULT_MIN_THRESHOLD 200.0F ///< Permeate flow low tolerance limit #define PERMEATE_FLOW_OUT_OF_RANGE_TIMEOUT_MS ( 12 * MS_PER_SECOND ) ///< Permeate flow low tolerance out of range timeout +#define QUADRATIC_COEFFICIENT 0.0065F ///< x2 coefficient +#define LINEAR_COEFFICIENT 1.9895F ///< x coefficient +#define CONSTANT_TERM 193.23F ///< constant term + + // ********** private data ********** // ********** private function prototypes ********** @@ -194,14 +200,40 @@ { F32 pressureP13 = getPressure( P13_PRES ); - if ( pressureP13 > MAX_INLET_RO_PUMP_PRESSURE_WARNING_PSIG ) + if ( pressureP13 > MAX_INLET_RO_PUMP_PRESSURE_WARNING_HIGH_PSIG ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, pressureP13, MAX_INLET_RO_PUMP_PRESSURE_WARNING_PSIG ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_RO_INLET_PRESSURE_OUT_HIGH_RANGE, pressureP13, MAX_INLET_RO_PUMP_PRESSURE_WARNING_HIGH_PSIG ) } } /*********************************************************************//** * @brief + * The checkROPressures function checks the RO membrane pressure + * against the pressure threshold and alarm if the pressure is out of range. + * @details \b Inputs: none + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_FP_POWER_BUDGET_OUT_OF_RANGE when + * P13 pressure goes beyond high pressure limit. + * @return none + *************************************************************************/ +void checkRODutyCycle( void ) +{ + F32 pressureP13 = getPressure( P13_PRES ); + F32 currentDutyCyclePct = getCurrentROPumpDutyCyclePCT(); + // TODO verify the calculated dutycycle unit + F32 calculatedDutyCyclePct = QUADRATIC_COEFFICIENT * (pressureP13 * pressureP13) - LINEAR_COEFFICIENT * (pressureP13) + CONSTANT_TERM; + + if ( (pressureP13 > MAX_INLET_RO_PUMP_PRESSURE_WARNING_LOW_PSIG ) && (pressureP13 < MAX_INLET_RO_PUMP_PRESSURE_WARNING_HIGH_PSIG) ) + { + if ( currentDutyCyclePct > calculatedDutyCyclePct ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_POWER_BUDGET_OUT_OF_RANGE, pressureP13, getCurrentROPumpDutyCyclePCT() ); + } + } +} + +/*********************************************************************//** + * @brief * The checkROPressures function checks the RO membrane outlet pressure * against the pressure threshold and alarm if the pressure is out of range. * @details \b Inputs: pressureP17