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