Index: firmware/App/Modes/FPModes/InletPressureCheck.c =================================================================== diff -u -rd25471a9b256c1dce1aec7de73f53c730ff70cd0 -rdd0e9acd5f0fb570403be8908ac45e79840d4b70 --- firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision d25471a9b256c1dce1aec7de73f53c730ff70cd0) +++ firmware/App/Modes/FPModes/InletPressureCheck.c (.../InletPressureCheck.c) (revision dd0e9acd5f0fb570403be8908ac45e79840d4b70) @@ -158,22 +158,22 @@ } } // reset the persistence timer when inlet pressure out of range - else if( ( inletPressure <= thresholdMin ) || ( inletPressure >= thresholdMax ) ) + else if ( ( inletPressure <= thresholdMin ) || ( inletPressure >= thresholdMax ) ) { inletPressureCheckPersistanceStartTimeMS = 0; // 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) + 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; } } } else { - if( inletPressure >= INLET_PRES_CHECK_TGT_PSI ) + 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) + 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 Index: firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c =================================================================== diff -u -rd25471a9b256c1dce1aec7de73f53c730ff70cd0 -rdd0e9acd5f0fb570403be8908ac45e79840d4b70 --- firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision d25471a9b256c1dce1aec7de73f53c730ff70cd0) +++ firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision dd0e9acd5f0fb570403be8908ac45e79840d4b70) @@ -46,9 +46,9 @@ 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 ); static void setModePreGenPDefTransition( FP_PRE_GENP_DEF_MODE_STATE_T state ); static U32 getPreGenPermeateDefDataPublishInterval( void ); @@ -159,6 +159,7 @@ setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); break; + case FP_PRE_GENP_DEF_FLUSH: setValveState( M4_VALV, VALVE_STATE_OPEN ); setValveState( M12_VALV, VALVE_STATE_OPEN ); @@ -170,6 +171,7 @@ setValveState( P39_VALV, VALVE_STATE_CLOSED ); preGenPermeateDefFlushTimer = getMSTimerCount(); break; + case FP_PRE_GENP_DEF_PAUSED: setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_VALV, VALVE_STATE_CLOSED ); @@ -210,6 +212,7 @@ signalStartFilterFlush(); state = FP_PRE_GENP_DEF_FLUSH; } + return state; } @@ -233,31 +236,6 @@ if( TRUE == didTimeout( preGenPermeateDefFlushTimer, PRE_GEN_DEF_FLUSH_TIMEOUT_MS ) ) { - state = FP_PRE_GENP_DEF_INLET_WATER_CHECK; - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handlePreGenPDefInletWaterState handles the pause state of gen permeate - * defeatured mode. - * @details \b Inputs: preGenPermeateDefWaterCheckTimer - * @details \b Outputs: none - * @return the next state of gen water defeatured mode - *************************************************************************/ -static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefInletWaterState( void ) -{ - FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_INLET_WATER_CHECK; - -// if ( TRUE == 1 ))// TODO Alarm and Stop State Rework -// { -// state = FP_PRE_GENP_DEF_PAUSED; -// } - - if( TRUE == didTimeout( preGenPermeateDefWaterCheckTimer, PRE_GEN_DEF_WATER_CHECK_TIMEOUT_MS ) ) - { transitionToGenPermeateDefeaturedMode(); requestGenWaterDefStart(); } Index: firmware/App/Monitors/WaterQualityMonitor.c =================================================================== diff -u -rd25471a9b256c1dce1aec7de73f53c730ff70cd0 -rdd0e9acd5f0fb570403be8908ac45e79840d4b70 --- firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision d25471a9b256c1dce1aec7de73f53c730ff70cd0) +++ firmware/App/Monitors/WaterQualityMonitor.c (.../WaterQualityMonitor.c) (revision dd0e9acd5f0fb570403be8908ac45e79840d4b70) @@ -66,10 +66,14 @@ #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 +#define RO_PUMP_DUTY_CYCLE_WARNING_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for duty cycle in warning range in milliseconds. +#define RO_PUMP_DUTY_CYCLE_WARNING_CLEAR_MS ( 1 * MS_PER_SECOND ) ///< Persistence period for duty cycle warning range clear in milliseconds. +// pump manufacturer's data for pump current draw based on pump speed and outlet pressure If 58 PSI ≤ P13 < 120 PSI, +// the currently set P12 duty cycle (% PWM) must be < 0.0065(x^2) - 1.9859(x)+193.23, where x = measured P13 pressure in PSI +#define QUADRATIC_COEFFICIENT 0.0065F ///< X2 quadratic coefficient +#define LINEAR_COEFFICIENT 1.9895F ///< X linear coefficient +#define CONSTANT_TERM 193.23F ///< Constant term // ********** private data ********** @@ -103,6 +107,9 @@ initPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_HIGH_RANGE, PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_CLEAR_MS, PERMEATE_FLOW_OUT_RANGE_PERSISTENCE_TIMEOUT_MS ); // fault , clearing timeout is not applicable initPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_LOW_RANGE, 0, PERMEATE_FLOW_OUT_OF_RANGE_TIMEOUT_MS ); + + // duty cycle warning alarm + initPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, RO_PUMP_DUTY_CYCLE_WARNING_CLEAR_MS, RO_PUMP_DUTY_CYCLE_WARNING_TIMEOUT_MS ); } /*********************************************************************//** @@ -128,18 +135,18 @@ if ( TRUE == isFPDefeatured() ) { - isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG ) ? TRUE : FALSE); - isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE); - isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ? TRUE : FALSE); + isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG ) ? TRUE : FALSE ); + isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE ); + isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM3, MIN_INLET_WATER_PRESSURE_DEFEATURED_WARNING_LOW_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM3, MAX_INLET_WATER_PRESSURE_DEFEATURED_WARNING_HIGH_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE, isPresOutOfHighRangeFault, pressureM3, MAX_INLET_WATER_PRESSURE_DEFEATURED_FAULT_HIGH_PSIG ); } else { - isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ) ? TRUE : FALSE); - isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE); - isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ? TRUE : FALSE); + isPresOutOfLowRange = ( ( pressureM3 < MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ) ? TRUE : FALSE ); + isPresOutOfHighRange = ( ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ) && ( pressureM3 < MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ) ? TRUE : FALSE ); + isPresOutOfHighRangeFault = ( ( pressureM3 > MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_LOW_RANGE, isPresOutOfLowRange, pressureM3, MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_OUT_HIGH_RANGE, isPresOutOfHighRange, pressureM3, MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ); checkPersistentAlarm( ALARM_ID_FP_INLET_PRESSURE_CRITICAL_OUT_RANGE, isPresOutOfHighRangeFault, pressureM3, MAX_INLET_WATER_PRESSURE_FAULT_HIGH_PSIG ); @@ -162,7 +169,7 @@ BOOL isFlowOutOfRange = FALSE; F32 maxAllowedPermeateFlow = (F32)getTargetROPumpFlowRateMLPM() * MAX_PERMEATE_FLOW_FAULT_THRESHOLD; - isFlowOutOfRange = ( ( permeateFlow > maxAllowedPermeateFlow ) ? TRUE : FALSE); + isFlowOutOfRange = ( ( permeateFlow > maxAllowedPermeateFlow ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_HIGH_RANGE, isFlowOutOfRange, permeateFlow, maxAllowedPermeateFlow ); } @@ -182,8 +189,8 @@ BOOL isFlowOutOfRange = FALSE; F32 minimumAllowedPermeateFlow = (F32)getTargetROPumpFlowRateMLPM() - PERMEATE_FLOW_FAULT_MIN_THRESHOLD; - isFlowOutOfRange = ( ( permeateFlow < minimumAllowedPermeateFlow ) ? TRUE : FALSE); - checkPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_LOW_RANGE, isFlowOutOfRange, permeateFlow, minimumAllowedPermeateFlow); + isFlowOutOfRange = ( ( permeateFlow < minimumAllowedPermeateFlow ) ? TRUE : FALSE ); + checkPersistentAlarm( ALARM_ID_FP_PERMEATE_FLOW_OUT_LOW_RANGE, isFlowOutOfRange, permeateFlow, minimumAllowedPermeateFlow ); } /*********************************************************************//** @@ -220,15 +227,15 @@ { F32 pressureP13 = getPressure( P13_PRES ); F32 currentDutyCyclePct = getCurrentROPumpDutyCyclePCT(); + BOOL isFdutyCycleOfRange = FALSE; // TODO verify the calculated dutycycle unit - F32 calculatedDutyCyclePct = QUADRATIC_COEFFICIENT * (pressureP13 * pressureP13) - LINEAR_COEFFICIENT * (pressureP13) + CONSTANT_TERM; + // Iff 58 PSI ≤ P13 < 120 PSI, the currently set P12 duty cycle (% PWM) must be < 0.0065(x^2) - 1.9859(x)+193.23, where x = measured P13 pressure in PSI + 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 ( ( 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() ); - } + isFdutyCycleOfRange = currentDutyCyclePct > calculatedDutyCyclePct; + checkPersistentAlarm( ALARM_ID_FP_POWER_BUDGET_OUT_OF_RANGE, isFdutyCycleOfRange, calculatedDutyCyclePct, getCurrentROPumpDutyCyclePCT() ); } } @@ -250,8 +257,8 @@ BOOL isPresReliefOutOfLowRange = FALSE; BOOL isPresReliefOutOfHighRange = FALSE; - isPresReliefOutOfLowRange = ( ( pressureP17 < MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG ) ? TRUE : FALSE); - isPresReliefOutOfHighRange = ( ( pressureP17 > MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG ) ? TRUE : FALSE); + isPresReliefOutOfLowRange = ( ( pressureP17 < MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG ) ? TRUE : FALSE ); + isPresReliefOutOfHighRange = ( ( pressureP17 > MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_LOW_RANGE, isPresReliefOutOfLowRange, pressureP17, MIN_PRESSURE_RELIEF_WARNING_LOW_PSIG ); checkPersistentAlarm( ALARM_ID_FP_PRESSURE_RELIEF_OUT_HIGH_RANGE, isPresReliefOutOfHighRange, pressureP17, MAX_PRESSURE_RELIEF_WARNING_HIGH_PSIG ); } @@ -275,13 +282,13 @@ BOOL isTempOutOfLowRange = FALSE; BOOL isTempOutOfHighRange = FALSE; - isTempOutOfLowRange = ( ( temperatureP10 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE); - isTempOutOfHighRange = ( ( temperatureP10 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE); + isTempOutOfLowRange = ( ( temperatureP10 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE ); + isTempOutOfHighRange = ( ( temperatureP10 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureP10, INLET_TEMPERATURE_LOW_THRESHOLD_C ); checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureP10, INLET_TEMPERATURE_HIGH_THRESHOLD_C ); - isTempOutOfLowRange = ( ( temperatureM3 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE); - isTempOutOfHighRange = ( ( temperatureM3 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE); + isTempOutOfLowRange = ( ( temperatureM3 < INLET_TEMPERATURE_LOW_THRESHOLD_C ) ? TRUE : FALSE ); + isTempOutOfHighRange = ( ( temperatureM3 > INLET_TEMPERATURE_HIGH_THRESHOLD_C ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_LOW_RANGE, isTempOutOfLowRange, temperatureM3, INLET_TEMPERATURE_LOW_THRESHOLD_C ); checkPersistentAlarm( ALARM_ID_FP_INLET_TEMPERATURE_OUT_HIGH_RANGE, isTempOutOfHighRange, temperatureM3, INLET_TEMPERATURE_HIGH_THRESHOLD_C ); } @@ -301,7 +308,7 @@ F32 conductivityP9 = getFilteredConductivity( P9_COND ); BOOL isConductivtyOutOfLowRange = FALSE; - isConductivtyOutOfLowRange = ( ( conductivityP9 > INLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : FALSE); + isConductivtyOutOfLowRange = ( ( conductivityP9 > INLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_INLET_CONDUCTIVITY_OUT_HIGH_RANGE, isConductivtyOutOfLowRange, conductivityP9, INLET_CONDUCTIVITY_HIGH_THRESHOLD_US ); } @@ -320,7 +327,7 @@ F32 conductivityP18 = getFilteredConductivity( P18_COND ); BOOL isConductivityOutOfLowRange = FALSE; - isConductivityOutOfLowRange = ( ( conductivityP18 > OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : FALSE); + isConductivityOutOfLowRange = ( ( conductivityP18 > OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US ) ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_FP_RO_OUTLET_CONDUCTIVITY_HIGH_RANGE, isConductivityOutOfLowRange, conductivityP18, OUTLET_CONDUCTIVITY_HIGH_THRESHOLD_US ); } @@ -340,7 +347,7 @@ // Alarm if the filtered average is less than allowed RO rejection limit if ( avgRORR < MIN_RO_REJECTION_RATIO_PCT ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_REJECTION_RATIO_LOW_RANGE, avgRORR, MIN_RO_REJECTION_RATIO_PCT) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_REJECTION_RATIO_LOW_RANGE, avgRORR, MIN_RO_REJECTION_RATIO_PCT ) } }