Index: firmware/App/Monitors/Pressure.c =================================================================== diff -u -re7fe0454b5b2d39009dc784dc8c156856df8bc86 -rc85d9f0a8023fabdf1cd557965958d225e2b9085 --- firmware/App/Monitors/Pressure.c (.../Pressure.c) (revision e7fe0454b5b2d39009dc784dc8c156856df8bc86) +++ firmware/App/Monitors/Pressure.c (.../Pressure.c) (revision c85d9f0a8023fabdf1cd557965958d225e2b9085) @@ -18,7 +18,9 @@ #include "AlarmMgmtDD.h" #include "Messaging.h" #include "Pressure.h" -#include "TaskPriority.h" +#include "PersistentAlarm.h" +#include "TaskPriority.h" +#include "Valves.h" /** * @addtogroup Pressure @@ -35,6 +37,18 @@ #define SIZE_OF_PRESSURETEMP_ROLLING_AVG ( PRESSURE_TEMP_SAMPLE_FILTER_MS / TASK_PRIORITY_INTERVAL ) ///< Filtered pressure temprature w/ 1 second moving average. #define MMHG_TO_PSI_CONVERSION 0.0193368F ///< MMHG to PSI conversion. +#define MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG 20.0F ///< Minimum allowed Input low pressure value in psig. +#define MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG 80.0F ///< Maximum allowed Input high pressure value in psig. +#define MIN_INLET_PRESSURE_TO_CLEAR_WARINING_PSIG 24.0F ///< Minimum allowed Input low pressure value in psig ( to clear alarm) +#define MIN_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG 78.0F ///< Minimum allowed Input high pressure value in psig. +#define INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ( 20 * MS_PER_SECOND ) ///< Persistence period for pressure out of range error in milliseconds. +#define INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS ( 10 * MS_PER_SECOND ) ///< Persistence period for pressure out of range clear in milliseconds. + +#define MIN_INLET_WATER_PRES_OUT_WARNING_LOW_PSIG 10.0F ///< Minimum allowed output low pressure value in psig. +#define MAX_INLET_WATER_PRES_OUT_WARNING_HIGH_PSIG 20.0F ///< Maximum allowed output high pressure value in psig. +#define MIN_INLET_PRES_OUT_TO_CLEAR_WARINING_PSIG 11.0F ///< Minimum allowed output low pressure value in psig ( to clear alarm) +#define MIN_INLET_WATER_PRES_OUT_WARNING_HIGH_PSIG 18.0F ///< Minimum allowed output high pressure value in psig. + /// Defined states for the pressures monitor state machine. typedef enum PresMonitor_States { @@ -121,6 +135,11 @@ filteredPressureTempReadings[i].pressureTempReadingsIdx = 0; filteredPressureTempReadings[i].pressureTempReadingsTotal = 0.0F; } + + initPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_IN_LOW_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_IN_HIGH_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_OUT_LOW_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_OUT_HIGH_RANGE, INLET_WATER_PRES_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_PRES_OUT_OF_RANGE_TIMEOUT_MS ); } /*********************************************************************//** @@ -201,6 +220,84 @@ return result; } + +/*********************************************************************//** + * @brief + * The checkInletWaterPressure function checks inlet water pressure value + * and triggers an alarm when pressure value is out of allowed range. + * @details \b Inputs: RO pump inlet pressure sensor value + * @details \b Outputs: Triggers low pressure persistent alarm + * @details \b Alarms: ALARM_ID_DD_INLET_WATER_PRESSURE_IN_LOW_RANGE when + * the inlet water pressure is less than the low limit. + * @details \b Alarms: ALARM_ID_DD_INLET_WATER_PRESSURE_IN_HIGH_RANGE when + * the inlet water pressure is greater than the high limit. + * @return none + *************************************************************************/ +void checkInletWaterPressure( void ) +{ + F32 pressureIn = getFilteredPressure( PRESSURE_SENSOR_WATER_INLET_INPUT ); + F32 PressureOut = getFilteredPressure( PRESSURE_SENSOR_WATER_INLET_OUTPUT ); + + //Check Water Inlet Input pressure range + if ( VALVE_STATE_OPEN == getValveStateName( VWI ) ) + { + BOOL isPressureTooLow; + BOOL isPressureTooHigh; + F32 maxInletWaterPressureWarningLow = MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG; + F32 minInletWaterPressureWarningLow = MIN_INLET_PRESSURE_TO_CLEAR_WARINING_PSIG; + + isPressureTooLow = ( pressureIn < maxInletWaterPressureWarningLow ? TRUE : FALSE ); + isPressureTooHigh = ( pressureIn > MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ? TRUE : FALSE ); + + if ( TRUE == isAlarmActive( ALARM_ID_DD_INLET_WATER_PRESSURE_IN_LOW_RANGE ) ) + { + isPressureTooLow = ( pressureIn >= minInletWaterPressureWarningLow ? FALSE : TRUE ); + } + checkPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_IN_LOW_RANGE, isPressureTooLow, pressureIn, maxInletWaterPressureWarningLow ); + + if ( TRUE == isAlarmActive( ALARM_ID_DD_INLET_WATER_PRESSURE_IN_HIGH_RANGE ) ) + { + isPressureTooHigh = ( pressureIn <= MIN_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ? FALSE : TRUE ); + } + checkPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_IN_HIGH_RANGE, isPressureTooHigh, pressureIn, MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ); + } + else + { + // VWI is closed - clear all alarms + checkPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_IN_LOW_RANGE, FALSE, pressureIn, MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ); + checkPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_IN_HIGH_RANGE, FALSE, pressureIn, MAX_INLET_WATER_PRESSURE_WARNING_HIGH_PSIG ); + } + + //Check Water Inlet Output pressure range + if ( VALVE_STATE_OPEN == getValveStateName( VWI ) ) + { + BOOL isPressureTooLow; + BOOL isPressureTooHigh; + F32 maxInletWaterPressureWarningLow = MIN_INLET_WATER_PRES_OUT_WARNING_LOW_PSIG; + F32 minInletWaterPressureWarningLow = MIN_INLET_PRES_OUT_TO_CLEAR_WARINING_PSIG; + + isPressureTooLow = ( PressureOut < maxInletWaterPressureWarningLow ? TRUE : FALSE ); + isPressureTooHigh = ( PressureOut > MAX_INLET_WATER_PRES_OUT_WARNING_HIGH_PSIG ? TRUE : FALSE ); + + if ( TRUE == isAlarmActive( ALARM_ID_DD_INLET_WATER_PRESSURE_OUT_LOW_RANGE ) ) + { + isPressureTooLow = ( PressureOut >= minInletWaterPressureWarningLow ? FALSE : TRUE ); + } + checkPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_OUT_LOW_RANGE, isPressureTooLow, PressureOut, maxInletWaterPressureWarningLow ); + + if ( TRUE == isAlarmActive( ALARM_ID_DD_INLET_WATER_PRESSURE_OUT_HIGH_RANGE ) ) + { + isPressureTooHigh = ( PressureOut <= MIN_INLET_WATER_PRES_OUT_WARNING_HIGH_PSIG ? FALSE : TRUE ); + } + checkPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_OUT_HIGH_RANGE, isPressureTooHigh, PressureOut, MAX_INLET_WATER_PRES_OUT_WARNING_HIGH_PSIG ); + } + else + { + // VWI is closed - clear all alarms + checkPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_OUT_LOW_RANGE, FALSE, PressureOut, MIN_INLET_WATER_PRES_OUT_WARNING_LOW_PSIG ); + checkPersistentAlarm( ALARM_ID_DD_INLET_WATER_PRESSURE_OUT_HIGH_RANGE, FALSE, PressureOut, MAX_INLET_WATER_PRES_OUT_WARNING_HIGH_PSIG ); + } +} /*********************************************************************//** * @brief @@ -379,12 +476,16 @@ if ( ++pressuresDataPublicationTimerCounter >= getU32OverrideValue( &pressuresDataPublishInterval ) ) { PRESSURE_TEMP_DATA_T data; - + + data.filteredWaterInletInputPressure = getFilteredPressure( PRESSURE_SENSOR_WATER_INLET_INPUT ); + data.filteredWaterInletOutputPressure = getFilteredPressure( PRESSURE_SENSOR_WATER_INLET_OUTPUT ); data.filteredHydraulicsOutletPressure = getFilteredPressure( PRESSURE_SENSOR_HYDRAULICS_OUTLET ); data.filteredBibagPressure = getFilteredPressure( PRESSURE_SENSOR_BIBAG ); data.filteredSpentdialysatePressure = getFilteredPressure( PRESSURE_SENSOR_SPENT_DIALYSATE ); data.filteredFreshdialysatePressure = getFilteredPressure( PRESSURE_SENSOR_FRESH_DIALYSATE ); data.filteredTransmembranePressure = getFilteredPressure( PRESSURE_SENSOR_TRANSMEMBRANE ); + data.filteredWaterInletInputTemp = getFilteredPressureSensorTemperature( PRESSURE_SENSOR_WATER_INLET_INPUT ); + data.filteredWaterInletOutputTemp = getFilteredPressureSensorTemperature( PRESSURE_SENSOR_WATER_INLET_OUTPUT ); data.filteredHydraulicsOutletTemp = getFilteredPressureSensorTemperature( PRESSURE_SENSOR_HYDRAULICS_OUTLET ); data.filteredBibagTemp = getFilteredPressureSensorTemperature( PRESSURE_SENSOR_BIBAG ); data.filteredSpentdialysateTemp = getFilteredPressureSensorTemperature( PRESSURE_SENSOR_SPENT_DIALYSATE );