Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r069fa54e253b9eca056ad51743a414854867b1ac -raa8dbad6005f0f63b846673ac1656b003fbf85e3 --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 069fa54e253b9eca056ad51743a414854867b1ac) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision aa8dbad6005f0f63b846673ac1656b003fbf85e3) @@ -43,16 +43,18 @@ #define COND_SENSOR_REFERENCE_TEMPERATURE 25 ///< Reference temperature for conductivity sensor. #define COND_SENSOR_REPORT_PERIOD ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Broadcast conductivity values message every second. -#define COND_SENSOR_CPI_WARNING_HIGH 2200 ///< Warning high value for inlet water conductivity. -#define COND_SENSOR_CPI_WARNING_LOW 2000 ///< Warning low value for inlet water conductivity. -#define COND_SENSOR_CPI_MIN_VALUE 100 ///< Minimum inlet water conductivity. +#define MAX_COND_SENSOR_CPI_WARNING_HIGH 2000.0F ///< Maximum allowed high conductivity value. +#define MIN_COND_SENSOR_CPI_WARNING_HIGH 1990.0F ///< Minimum allowed high conductivity value. +#define MAX_COND_SENSOR_CPI_WARNING_LOW 100.0F ///< Maximum allowed low conductivity value. +#define MIN_COND_SENSOR_CPI_WARNING_LOW 110.0F ///< Minimum allowed low conductivity value. + #define MAX_ALLOWED_UNCHANGED_CONDUCTIVITY_READS ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< New reading every 800 ms, expect to get valid new reading in 1s. #define MAX_CONDUCTIVITY_SENSOR_FAILURES 5 ///< maximum number of conductivity sensor errors within window period before alarm. #define MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS ( 60 * MS_PER_SECOND ) ///< Conductivity sensor error window. #define RO_REJECTION_RATIO_OUT_OF_RANGE_VALUE 1.0 ///< Out of range value for RO rejection ratio when CPi conductivity is zero. -#define MAX_RO_REJECTION_RATIO_ALLOW 0.15 ///< Maximum RO rejection ratio. +#define MAX_RO_REJECTION_RATIO_ALLOW 0.10F ///< Maximum RO rejection ratio. #define MAX_CPO_CONDUCTIVITY_ALLOW 30.0 ///< Maximum CPo sensor conductivity value. #define COND_SENSOR_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for conductivity sensor out of range error. @@ -141,8 +143,8 @@ initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR, MAX_CONDUCTIVITY_SENSOR_FAILURES, MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS ); initPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_WARNING_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_HIGH_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_LOW_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); initPersistentAlarm( ALARM_ID_RO_REJECTION_RATIO_OUT_OF_RANGE, RO_REJECTION_RATIO_PERSISTENCE_PERIOD, RO_REJECTION_RATIO_PERSISTENCE_PERIOD ); } @@ -225,27 +227,29 @@ { #ifndef DISABLE_WATER_QUALITY_CHECK - F32 const conductivity = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); + F32 conductivity = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); + BOOL isConductTooLow = ( conductivity < MAX_COND_SENSOR_CPI_WARNING_LOW ? TRUE : FALSE ); + BOOL isConductInWarningRange = ( conductivity > MAX_COND_SENSOR_CPI_WARNING_HIGH ? TRUE : FALSE ); - BOOL const isConductTooLow = ( conductivity <= COND_SENSOR_CPI_MIN_VALUE ) ? TRUE : FALSE; - - BOOL const isConductTooHigh = ( conductivity >= COND_SENSOR_CPI_WARNING_HIGH ) ? TRUE : FALSE ; - - BOOL const isConductInWarningRange = ( conductivity >= COND_SENSOR_CPI_WARNING_LOW ) && - ( conductivity < COND_SENSOR_CPI_WARNING_HIGH ) ? TRUE : FALSE; - + // Alarm per PRS 403 if ( TRUE == isConductTooLow ) { - checkPersistentAlarm( ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY, isConductTooLow, conductivity, COND_SENSOR_CPI_MIN_VALUE ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_LOW_RANGE, isConductTooLow, conductivity, MAX_COND_SENSOR_CPI_WARNING_LOW ); } - else if ( TRUE == isConductTooHigh ) + else if ( conductivity >= MIN_COND_SENSOR_CPI_WARNING_LOW ) { - checkPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY, isConductTooHigh, conductivity, COND_SENSOR_CPI_WARNING_LOW ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_LOW_RANGE, FALSE, conductivity, MAX_COND_SENSOR_CPI_WARNING_LOW ); } - else if ( TRUE == isConductInWarningRange ) + + // Alarm per PRS 404 + if ( TRUE == isConductInWarningRange ) { - checkPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_WARNING_RANGE, isConductInWarningRange, conductivity, COND_SENSOR_CPI_WARNING_HIGH ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_HIGH_RANGE, isConductInWarningRange, conductivity, MAX_COND_SENSOR_CPI_WARNING_HIGH ); } + else if ( conductivity <= MIN_COND_SENSOR_CPI_WARNING_HIGH ) + { + checkPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_HIGH_RANGE, FALSE, conductivity, MAX_COND_SENSOR_CPI_WARNING_HIGH ); + } #endif } @@ -262,10 +266,13 @@ void checkRORejectionRatio( void ) { #ifndef DISABLE_RO_RATIO_CHECK - F32 const cpo = getConductivityValue( CONDUCTIVITYSENSORS_CPO_SENSOR ); - BOOL const isRORejectionRatioOutOfRange = ( roRejectionRatio > MAX_RO_REJECTION_RATIO_ALLOW ) || ( cpo >= MAX_CPO_CONDUCTIVITY_ALLOW ); + F32 cpo = getConductivityValue( CONDUCTIVITYSENSORS_CPO_SENSOR ); + BOOL isRORectionOutOfRange = ( roRejectionRatio > MAX_RO_REJECTION_RATIO_ALLOW ? TRUE : FALSE ); - checkPersistentAlarm( ALARM_ID_RO_REJECTION_RATIO_OUT_OF_RANGE, isRORejectionRatioOutOfRange, roRejectionRatio, MAX_RO_REJECTION_RATIO_ALLOW ); + //BOOL isRORejRatioOutOfRange = ( roRejectionRatio > MAX_RO_REJECTION_RATIO_ALLOW ) || ( cpo >= MAX_CPO_CONDUCTIVITY_ALLOW ); // TODO why is conductivity checked here again? + + // Fault alarm per PRS 483 + checkPersistentAlarm( ALARM_ID_RO_REJECTION_RATIO_OUT_OF_RANGE, isRORectionOutOfRange, roRejectionRatio, MAX_RO_REJECTION_RATIO_ALLOW ); #endif } Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -r025612ad77fe630889a364586de54bffe5262d56 -raa8dbad6005f0f63b846673ac1656b003fbf85e3 --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 025612ad77fe630889a364586de54bffe5262d56) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision aa8dbad6005f0f63b846673ac1656b003fbf85e3) @@ -46,7 +46,9 @@ #define MIN_VALID_PRESSURE_RANGE 0.0 ///< Minimum valid range on pressure reading. #define MAX_VALID_PRESSURE_RANGE 200.0 ///< Maximum valid range on pressure reading. -#define MIN_INLET_WATER_PRESSURE 25 ///< Minimum water input pressure. +#define MAX_INLET_WATER_PRESSURE_WARNING_LOW 25.0F ///< Maximum allowed low pressure value. +#define MIN_INLET_WATER_PRESSURE_WARNING_LOW 28.0F ///< Minimum allowed low pressure value. + #define INLET_WATER_PRESSURE_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for pressure out of range error. #define PRESSURES_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the pressures data is published on the CAN bus. @@ -116,7 +118,7 @@ pressuresSelfTestState = PRESSURE_SELF_TEST_STATE_START; pressuresDataPublicationTimerCounter = 0; - initPersistentAlarm( ALARM_ID_INLET_WATER_LOW_PRESSURE, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD ); initPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_FAULT, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD ); } @@ -131,31 +133,23 @@ void checkInletPressure( void ) { #ifndef DISABLE_WATER_QUALITY_CHECK - F32 const pressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); - BOOL const isPressureTooLow = ( pressure < MIN_INLET_WATER_PRESSURE ); + F32 pressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); + BOOL isPressureTooLow = ( pressure < MAX_INLET_WATER_PRESSURE_WARNING_LOW ? TRUE : FALSE ); - checkPersistentAlarm( ALARM_ID_INLET_WATER_LOW_PRESSURE, isPressureTooLow, pressure, MIN_INLET_WATER_PRESSURE ); + // Alarm per PRS 401 + if ( TRUE == isPressureTooLow ) + { + checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, isPressureTooLow, pressure, MAX_INLET_WATER_PRESSURE_WARNING_LOW ); + } + else if ( pressure >= MIN_INLET_WATER_PRESSURE_WARNING_LOW ) + { + checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, FALSE, pressure, MAX_INLET_WATER_PRESSURE_WARNING_LOW ); + } #endif } /*********************************************************************//** * @brief - * The checkInletPressureFault function checks inlet water pressure value - * and triggers a machine fault when pressure value is out of allowed range. - * @details Inputs: RO pump inlet pressure sensor value - * @details Outputs: Triggers pressure fault persistent alarm - * @return none - *************************************************************************/ -void checkInletPressureFault( void ) -{ - F32 const pressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); - BOOL const isPressureTooLow = ( pressure < MIN_INLET_WATER_PRESSURE ); - - checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_FAULT, isPressureTooLow, pressure, MIN_INLET_WATER_PRESSURE ); -} - -/*********************************************************************//** - * @brief * The getMeasuredArterialPressure function gets the current arterial pressure. * @details Inputs: arterialPressure * @details Outputs: none Index: firmware/App/Controllers/Pressures.h =================================================================== diff -u -r025612ad77fe630889a364586de54bffe5262d56 -raa8dbad6005f0f63b846673ac1656b003fbf85e3 --- firmware/App/Controllers/Pressures.h (.../Pressures.h) (revision 025612ad77fe630889a364586de54bffe5262d56) +++ firmware/App/Controllers/Pressures.h (.../Pressures.h) (revision aa8dbad6005f0f63b846673ac1656b003fbf85e3) @@ -58,7 +58,6 @@ void execPressures( void ); SELF_TEST_STATUS_T execPressureSelfTest( void ); void checkInletPressure( void ); -void checkInletPressureFault( void ); F32 getMeasuredDGPressure( U32 pressureID ); BOOL testSetPressuresDataPublishIntervalOverride( U32 value ); Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r025612ad77fe630889a364586de54bffe5262d56 -raa8dbad6005f0f63b846673ac1656b003fbf85e3 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 025612ad77fe630889a364586de54bffe5262d56) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision aa8dbad6005f0f63b846673ac1656b003fbf85e3) @@ -138,6 +138,7 @@ static S32 measuredFlowReadingsSum = 0; ///< Raw flow reading sums for averaging. static U32 flowFilterCounter = 0; ///< Flow filtering counter. static DG_FLOW_SENSORS_CAL_RECORD_T flowSensorsCalRecord; ///< Flow sensors calibration record. +static OVERRIDE_F32_T measuredROFlowRateWithConcPumpsLPM = { 0.0, 0.0, 0.0, 0 }; ///< Measure RO flow rate with concentrate pumps (L/min). // ********** private function prototypes ********** @@ -331,8 +332,8 @@ *************************************************************************/ void execROPumpMonitor( void ) { - U16 roFlowReading = getFPGAROPumpFlowRate(); - U16 roFeedbackVoltage = getIntADCVoltageConverted( INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE ); + U32 roFlowReading = (U32)getFPGAROPumpFlowRate(); + F32 roFeedbackVoltage = getIntADCVoltageConverted( INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE ); // Update sum for flow average calculation measuredFlowReadingsSum += (S32)roFlowReading; @@ -355,14 +356,15 @@ { F32 flow = RO_FLOW_ADC_TO_LPM_FACTOR / ( (F32)measuredFlowReadingsSum * FLOW_AVERAGE_MULTIPLIER ); - flow = flow - ( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) / ML_PER_LITER ) - - ( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) / ML_PER_LITER ); + flow = pow(flow, 4) * flowSensorsCalRecord.flowSensors[ CAL_DATA_RO_PUMP_FLOW_SENSOR ].fourthOrderCoeff + + pow(flow, 3) * flowSensorsCalRecord.flowSensors[ CAL_DATA_RO_PUMP_FLOW_SENSOR ].thirdOrderCoeff + + pow(flow, 2) * flowSensorsCalRecord.flowSensors[ CAL_DATA_RO_PUMP_FLOW_SENSOR ].secondOrderCoeff + + flow * flowSensorsCalRecord.flowSensors[ CAL_DATA_RO_PUMP_FLOW_SENSOR ].gain + + flowSensorsCalRecord.flowSensors[ CAL_DATA_RO_PUMP_FLOW_SENSOR ].offset; - measuredROFlowRateLPM.data = pow(flow, 4) * flowSensorsCalRecord.flowSensors[ CAL_DATA_RO_PUMP_FLOW_SENSOR ].fourthOrderCoeff + - pow(flow, 3) * flowSensorsCalRecord.flowSensors[ CAL_DATA_RO_PUMP_FLOW_SENSOR ].thirdOrderCoeff + - pow(flow, 2) * flowSensorsCalRecord.flowSensors[ CAL_DATA_RO_PUMP_FLOW_SENSOR ].secondOrderCoeff + - flow * flowSensorsCalRecord.flowSensors[ CAL_DATA_RO_PUMP_FLOW_SENSOR ].gain + - flowSensorsCalRecord.flowSensors[ CAL_DATA_RO_PUMP_FLOW_SENSOR ].offset; + measuredROFlowRateWithConcPumpsLPM.data = flow; + measuredROFlowRateLPM.data = flow - ( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) / ML_PER_LITER ) - + ( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) / ML_PER_LITER ); // If the flow is less than a certain value, FPGA will return 0xFFFF meaning that // the flow is 0. @@ -547,6 +549,19 @@ /*********************************************************************//** * @brief + * The getMeasuredROFlowRateWithConcPumpsLPM function gets the measured RO + * pump flow rate with the concentrate pumps. + * @details Inputs: measuredROFlowRateWithConcPumpsLPM + * @details Outputs: measuredROFlowRateWithConcPumpsLPM + * @return the current RO pump flow rate with the concentrate pumps (in L/min). + *************************************************************************/ +F32 getMeasuredROFlowRateWithConcPumpsLPM( void ) +{ + return getF32OverrideValue( &measuredROFlowRateWithConcPumpsLPM ); +} + +/*********************************************************************//** + * @brief * The getTargetROPumpPressure function gets the current target RO pump * pressure. * @details Inputs: targetROPumpPressure Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -r025612ad77fe630889a364586de54bffe5262d56 -raa8dbad6005f0f63b846673ac1656b003fbf85e3 --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 025612ad77fe630889a364586de54bffe5262d56) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision aa8dbad6005f0f63b846673ac1656b003fbf85e3) @@ -62,6 +62,7 @@ F32 getTargetROPumpFlowRate( void ); F32 getMeasuredROFlowRateLPM( void ); +F32 getMeasuredROFlowRateWithConcPumpsLPM( void ); F32 getTargetROPumpPressure( void ); Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r2f3090feeb06eb738aefc8eae5f080070a0a8919 -raa8dbad6005f0f63b846673ac1656b003fbf85e3 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 2f3090feeb06eb738aefc8eae5f080070a0a8919) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision aa8dbad6005f0f63b846673ac1656b003fbf85e3) @@ -55,14 +55,13 @@ #define SHIFT_BITS_BY_2_FOR_AVERAGING 2U ///< Shift the ADCs of the temperature sensors by 2 to average them. #define INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for temperature sensors out of range error period. -#define MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE 22U ///< Low range minimum water input temperature. -#define MAX_WATER_TEMPERATURE_WARNING_LOW_RANGE 24U ///< Low range maximum water input temperature. +#define MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE 22.0F ///< Low range minimum water input temperature. +#define MAX_WATER_TEMPERATURE_WARNING_LOW_RANGE 24.0F ///< Low range maximum water input temperature. -#define MIN_WATER_TEMPERATURE_WARNING_HIGH_RANGE 37U ///< High range minimum water input temperature. -#define MAX_WATER_TEMPERATURE_WARNING_HIGH_RANGE 39U ///< High range maximum water input temperature. +#define MIN_WATER_TEMPERATURE_WARNING_HIGH_RANGE 37.0F ///< High range minimum water input temperature. +#define MAX_WATER_TEMPERATURE_WARNING_HIGH_RANGE 39.0F ///< High range maximum water input temperature. -#define MIN_WATER_TEMPERATURE_ALARM 22U ///< Low water temperature alarm. -#define MAX_WATER_TEMPERATURE_ALARM 39U ///< High water temperature alarm. +#define MAX_WATER_TEMPERATURE_ALARM 50.0F ///< High water temperature alarm. #define HEATERS_INTERNAL_TEMPERTURE_CALCULATION_INTERVAL 20U ///< Time interval that is used to calculate the heaters internal temperature. #define HEATERS_INTERNAL_TC_ADC_TO_TEMP_CONVERSION_COEFF 0.25 ///< Heaters internal temperature sensors ADC to temperature conversion coefficient. @@ -271,7 +270,7 @@ initPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_TEMPERATURE, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_INLET_WATER_LOW_TEMPERATURE, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD, + initPersistentAlarm( ALARM_ID____AVAILABLE_28, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ); initPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_LOW_RANGE, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD, @@ -361,33 +360,32 @@ void checkInletWaterTemperature( void ) { #ifndef DISABLE_WATER_QUALITY_CHECK - F32 const temperature = getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ); - BOOL isWaterTempInHighRange = ( temperature >= MIN_WATER_TEMPERATURE_WARNING_HIGH_RANGE ) && - ( temperature <= MAX_WATER_TEMPERATURE_WARNING_HIGH_RANGE ) ? TRUE : FALSE; + F32 temperature = getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ); + BOOL isWaterTempInHighRange = ( temperature > MAX_WATER_TEMPERATURE_WARNING_HIGH_RANGE ? TRUE : FALSE ); + BOOL isWaterTempInLowRange = ( temperature < MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE ? TRUE : FALSE ); + BOOL isWaterTempTooHigh = ( temperature > MAX_WATER_TEMPERATURE_ALARM ? TRUE : FALSE ); - BOOL isWaterTempInLowRange = ( temperature >= MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE ) && - ( temperature <= MAX_WATER_TEMPERATURE_WARNING_LOW_RANGE ) ? TRUE : FALSE; + // Fault alarm per PRS 557 for high temperature + checkPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_TEMPERATURE, isWaterTempTooHigh, temperature, MAX_WATER_TEMPERATURE_ALARM ); - BOOL isWaterTempTooHigh = ( temperature > MAX_WATER_TEMPERATURE_ALARM ); - - BOOL isWaterTempTooLow = ( temperature < MIN_WATER_TEMPERATURE_ALARM ); - - if ( TRUE == isWaterTempInHighRange ) // warning alarm + if ( TRUE == isWaterTempInHighRange ) // warning alarm per PRS 406 { - checkPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_HIGH_RANGE, MIN_WATER_TEMPERATURE_WARNING_HIGH_RANGE, temperature, MAX_WATER_TEMPERATURE_WARNING_HIGH_RANGE ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_HIGH_RANGE, isWaterTempInHighRange, temperature, MAX_WATER_TEMPERATURE_WARNING_HIGH_RANGE ); } - else if ( TRUE == isWaterTempInLowRange ) // warning alarm + else if ( temperature <= MIN_WATER_TEMPERATURE_WARNING_HIGH_RANGE ) { - checkPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_LOW_RANGE, MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE, temperature, MAX_WATER_TEMPERATURE_WARNING_LOW_RANGE ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_HIGH_RANGE, FALSE, temperature, MAX_WATER_TEMPERATURE_WARNING_HIGH_RANGE ); } - else if ( TRUE == isWaterTempTooHigh ) // alarm + + + if ( TRUE == isWaterTempInLowRange ) // warning alarm per PRS 405 { - checkPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_TEMPERATURE, isWaterTempTooHigh, temperature, MAX_WATER_TEMPERATURE_ALARM ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_LOW_RANGE, isWaterTempInLowRange, temperature, MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE ); } - else if ( TRUE == isWaterTempTooLow ) // alarm + else if ( temperature >= MAX_WATER_TEMPERATURE_WARNING_LOW_RANGE ) { - checkPersistentAlarm( ALARM_ID_INLET_WATER_LOW_TEMPERATURE, isWaterTempTooLow, temperature, MIN_WATER_TEMPERATURE_ALARM ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_LOW_RANGE, FALSE, temperature, MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE ); } #endif } Index: firmware/App/DGCommon.h =================================================================== diff -u -rbd80dccfee1f58fdbc49bf05dd000005b105fe26 -raa8dbad6005f0f63b846673ac1656b003fbf85e3 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision bd80dccfee1f58fdbc49bf05dd000005b105fe26) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision aa8dbad6005f0f63b846673ac1656b003fbf85e3) @@ -48,10 +48,10 @@ #define IGNORE_RO_PUMP_MONITOR 1 #define DISABLE_RO_RATIO_CHECK 1 #define DISABLE_COND_SENSOR_CHECK 1 // Disabled for Tom - #define DISABLE_WATER_QUALITY_CHECK 1 // Disabled for Tom +// #define DISABLE_WATER_QUALITY_CHECK 1 // Disabled for Tom #define DISABLE_RTC_CONFIG 1 #define THD_USING_TRO_CONNECTOR 1 - #define DISABLE_FLOW_CHECK_IN_FILL 1 +// #define DISABLE_FLOW_CHECK_IN_FILL 1 #define IGNORE_CONC_PUMP_IN_HEAT_DISINFECT 1 // #define NEW_FMD_FLOW_SENSOR 1 Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -rad0b52bbb67a70e5a629d919ce71196c310da809 -raa8dbad6005f0f63b846673ac1656b003fbf85e3 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision ad0b52bbb67a70e5a629d919ce71196c310da809) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision aa8dbad6005f0f63b846673ac1656b003fbf85e3) @@ -60,8 +60,7 @@ #define CONCENTRATE_PUMP_PRIME_INTERVAL ( 3 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Persistent time interval for concentrate pumps prime. -#define ACID_BICARB_CONCENTRATE_ADDITION_MULTIPLER 1.06 ///< Acid and bicarbonate concentrates make up around 6% to total volume. -#define FLOW_INTEGRATED_VOLUME_CHECK_TOLERANCE 0.1 ///< Flow integrated volume has 10% tolerance compare to load cell reading. +#define FLOW_INTEGRATED_VOLUME_CHECK_TOLERANCE 0.1F ///< Flow integrated volume has 10% tolerance compare to load cell reading. #define ACID_TEST_CD1_TCD 12252.1 ///< Used for testing CD1 acid theoretical conductivity. #define ACID_TEST_CD2_TCD ACID_TEST_CD1_TCD ///< Used for testing CD2 acid theoretical conductivity. @@ -71,7 +70,7 @@ #define CONCENTRATE_PUMP_PRIME_EXTRA_SPEED_ML_MIN 5.0 ///< Concentrate pump additional speed during priming in mL/min. #define CONCENTRATE_TEST_TIME_OUT_MS ( 30 * MS_PER_SECOND ) ///< Concentrate test time out period in ms. #define WATER_QUALITY_TEST_TIME_OUT_MS ( 30 * MS_PER_SECOND ) ///< Inlet water quality test time out period in ms. -#define PRIME_CONCENTRATE_LINES_TIME_OUT_MS ( 95 * MS_PER_SECOND ) ///< Time required to prime the concentrate lines. +#define PRIME_CONCENTRATE_LINES_TIME_OUT_MS ( 95 * MS_PER_SECOND ) ///< Time required to prime the concentrate lines. #define FLUSH_BUBBLES_PUMP_TIME_OUT_MS ( 2 * MS_PER_SECOND ) ///< RO pump on during flush bubble interval in ms. #define DIALYSATE_TEMPERATURE_TOLERANCE_C 2.0 ///< Dialysate temperature tolerance in degree C. #define DIALYSATE_TEMPERATURE_SENSORS_MAX_DRIFT_C 2.0 ///< Dialysate temperature sensors maximum allowed drift in C. @@ -485,7 +484,9 @@ // Set the RO pump flow rate in according to the roPumpFlushBubblesSpeed table to flush bubbles pumpSpeedIndex = 0; setROPumpTargetFlowRateLPM( RO_PUMP_FLUSH_BUBBLES_FLOWS[ pumpSpeedIndex ] / MILLILITERS_PER_LITER, TARGET_RO_PRESSURE_PSI ); + flushBubblesStartTime = getMSTimerCount(); + result = DG_FILL_MODE_STATE_FLUSH_BUBBLES; } return result; @@ -657,8 +658,8 @@ // Prime mixing before deliver result to reservoir handleDialysateMixing( measuredROFlowRateMLPM ); #ifndef DISABLE_MIXING - requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); // SRSDG 217 - requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); // SRSDG 217 + requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); if ( concentratePumpPrimeCount++ > CONCENTRATE_PUMP_PRIME_INTERVAL ) #endif @@ -686,19 +687,18 @@ *************************************************************************/ static DG_FILL_MODE_STATE_T handleDeliverDialysateState( void ) { + F32 integratedVolumeML; + DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_DELIVER_DIALYSATE; DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); + F32 acidConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); + F32 bicarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); - F32 integratedVolumeML; - F32 measuredROFlowRateMLPM = getMeasuredROFlowRateLPM() * ML_PER_LITER; - F32 acidConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); - F32 bicarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); - // Set concentrate pumps speed based on the RO pump flow rate - handleDialysateMixing( measuredROFlowRateMLPM ); + handleDialysateMixing( getMeasuredROFlowRateLPM() ); - totalROFlowRateMLPM += measuredROFlowRateMLPM; - integratedVolumeML = totalROFlowRateMLPM * FLOW_INTEGRATOR * ACID_BICARB_CONCENTRATE_ADDITION_MULTIPLER; + totalROFlowRateMLPM += getMeasuredROFlowRateWithConcPumpsLPM() * ML_PER_LITER; + integratedVolumeML = totalROFlowRateMLPM * FLOW_INTEGRATOR; usedAcidVolumeML.data += getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) * FLOW_INTEGRATOR; usedBicarbVolumeML.data += getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) * FLOW_INTEGRATOR; @@ -711,38 +711,16 @@ fillStatus.fillFlowRateRunningSum += getMeasuredROFlowRateLPM(); fillStatus.fillTemperatureRunningSum += getTemperatureValue( (U32)TEMPSENSORS_OUTLET_PRIMARY_HEATER ); -#ifndef DISABLE_MIXING - // Detect empty bottles using integrated volumes // TODO: empty bottles detection using conductivity sensors - if ( ( ( ACID_CONCENTRATION_BOTTLE_VOLUME_ML - getF32OverrideValue( &usedAcidVolumeML ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) ) // || // SRSDG 437 - { - usedAcidVolumeML.data = 0.0; - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); - setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - fillStatus.isThisFirstFill = TRUE; // empty bottles need replaced, set isThisFirstFill to FALSE so that prime, flush, acid & bicarb test are needed - fillStatus.fillEmptyAcidBottleDetected = TRUE; // set this variable to FALSE when user presses OK on the alarm to confirm bottle has been replaced and resume - } - - if ( ( ( BICARB_CONCENTRATION_BOTTLE_VOLUME_ML - getF32OverrideValue( &usedBicarbVolumeML ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) ) // || // SRSDG 438 - { - usedBicarbVolumeML.data = 0.0; - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); - setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - fillStatus.isThisFirstFill = TRUE; - fillStatus.fillEmptyBicarbBottleDetected = TRUE; - } -#endif - setBadAvgConductivityDetectedFlag( FALSE ); // If we've reached our target fill to volume (by weight), we're done filling - go back to generation idle mode // SRSDG 398 if ( TRUE == hasTargetFillVolumeBeenReached( inactiveReservoir ) ) { F32 filledVolumeML = getReservoirWeight( inactiveReservoir ) - reservoirBaseWeight; - F32 integratedVolumeToLoadCellReadingPercent = fabs( 1 - ( filledVolumeML / integratedVolumeML ) ); + F32 integratedVolumeToLoadCellReadingPercent = fabs( 1.0F - ( filledVolumeML / integratedVolumeML ) ); F32 avgAcidConductivity = acidConductivityTotal / conductivitySampleCount; F32 avgBicarbConductivity = bicarbConductivityTotal / conductivitySampleCount; + integratedVolumeML = 0.0; #ifndef DISABLE_FLOW_CHECK_IN_FILL if ( integratedVolumeToLoadCellReadingPercent > FLOW_INTEGRATED_VOLUME_CHECK_TOLERANCE ) // SRSDG 439 @@ -927,6 +905,7 @@ fillModeData.pctDiffInConductivity = pctDiffInConductivity; fillModeData.usedAcidVolumeML = usedAcidVolumeML.data; fillModeData.usedBicarbVolumeML = usedBicarbVolumeML.data; + fillModeData.totalIntegratedVolumeML = totalROFlowRateMLPM; broadcastData( MSG_ID_DG_FILL_MODE_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&fillModeData, sizeof( DG_FILL_MODE_DATA_T ) ); Index: firmware/App/Modes/ModeFill.h =================================================================== diff -u -rc03d077c365f228423523364f6b88d54c335478b -raa8dbad6005f0f63b846673ac1656b003fbf85e3 --- firmware/App/Modes/ModeFill.h (.../ModeFill.h) (revision c03d077c365f228423523364f6b88d54c335478b) +++ firmware/App/Modes/ModeFill.h (.../ModeFill.h) (revision aa8dbad6005f0f63b846673ac1656b003fbf85e3) @@ -40,6 +40,7 @@ F32 pctDiffInConductivity; ///< The percent difference between CD1 and CD2. F32 usedAcidVolumeML; ///< The used acid volume in ML. F32 usedBicarbVolumeML; ///< The used bicarb volume in ML. + F32 totalIntegratedVolumeML; ///< Total integrated volume in milliliters. } DG_FILL_MODE_DATA_T; // ********** public function prototypes ********** @@ -67,9 +68,9 @@ BOOL isEmptyBicarbBottle( void ); BOOL testSetUsedAcidVolumeMLOverride( F32 value ); -BOOL testSetUsedBicarbVolumeMLOverride( F32 value ); - BOOL testResetUsedAcidVolumeMLOverride( void ); + +BOOL testSetUsedBicarbVolumeMLOverride( F32 value ); BOOL testResetUsedBicarbVolumeMLOverride( void ); /**@}*/