Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r0b121a7c92a8d86f8369b7094b0bce21389f3747 -r329409d63c11fd7d7fc8c3d3dd1d96e4e5a109dc --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 0b121a7c92a8d86f8369b7094b0bce21389f3747) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 329409d63c11fd7d7fc8c3d3dd1d96e4e5a109dc) @@ -62,6 +62,7 @@ #define NUMBER_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK 1 ///< Number of acid and bicarb non-volatile data to check. #define DATA_PUBLISH_COUNTER_START_COUNT 0 ///< Data publish counter start count. +#define CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Concentrate pump park fault timeout in milliseconds. /*************************DVT Definitions********************************************/ @@ -153,21 +154,22 @@ { concentratePumps[ pumpId ].controlTimerCounter = 0; concentratePumps[ pumpId ].execState = CONCENTRATE_PUMP_OFF_STATE; - concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0; + concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0F; concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; concentratePumps[ pumpId ].hasParkBeenRequested = FALSE; concentratePumps[ pumpId ].parked.data = FALSE; concentratePumps[ pumpId ].parkFaulted.data = FALSE; - concentratePumps[ pumpId ].pumpTargetSpeed = 0.0; + concentratePumps[ pumpId ].pumpTargetSpeed = 0.0F; concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; // For V3 concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_FORWARD; // For DVT stopConcentratePump( pumpId ); } initPersistentAlarm( ALARM_ID_CP1_SPEED_CONTROL_ERROR, CONCENTRATE_PUMP_SPEED_CONTROL_PERSISTENCE_PERIOD, CONCENTRATE_PUMP_SPEED_CONTROL_PERSISTENCE_PERIOD ); initPersistentAlarm( ALARM_ID_CP2_SPEED_CONTROL_ERROR, CONCENTRATE_PUMP_SPEED_CONTROL_PERSISTENCE_PERIOD, CONCENTRATE_PUMP_SPEED_CONTROL_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS, - CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS ); + initPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS, CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS ); + initPersistentAlarm( ALARM_ID_DG_ACID_CONCENTRATE_PUMP_PARK_FAULT, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DG_BICARB_CONCENTRATE_PUMP_PARK_FAULT, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ); } /*********************************************************************//** @@ -205,24 +207,36 @@ monitorPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB, ALARM_ID_CP2_SPEED_CONTROL_ERROR ); } +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONCENTRATE_PUMPS_PARK ) != SW_CONFIG_ENABLE_VALUE ) + { + BOOL isAcidPumpParked = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); + BOOL isBicarbPumpParked = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); + + checkPersistentAlarm( ALARM_ID_DG_ACID_CONCENTRATE_PUMP_PARK_FAULT, isAcidPumpParked, isAcidPumpParked, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ); + checkPersistentAlarm( ALARM_ID_DG_BICARB_CONCENTRATE_PUMP_PARK_FAULT, isBicarbPumpParked, isBicarbPumpParked, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ); + } +#endif + if ( ++concentratePumpMonitorTimerCounter >= getU32OverrideValue( &concentratePumpDataPublishInterval ) ) { CONCENTRATE_PUMP_DATA_T data; - U08 fpgaConcentratePumpsFault = getFPGAConcentratePumpsFault(); - U08 cp1Direction = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].direction; - F32 cp1SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; - F32 cp1Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); - F32 cp1TgtSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pumpTargetSpeed; - BOOL cp1Parked = getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ); - BOOL cp2ParkFault = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ); - U08 cp2Direction = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].direction; - F32 cp2SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; - F32 cp2Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); - F32 cp2TgtSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pumpTargetSpeed; - if ( 0 != fpgaConcentratePumpsFault ) + U08 fpgaConcPumpsFault = getFPGAConcentratePumpsFault(); + U08 cp1Direction = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].direction; + F32 cp1SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; + F32 cp1Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); + F32 cp1TgtSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pumpTargetSpeed; + BOOL cp1Parked = getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ); + BOOL cp2ParkFault = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ); + U08 cp2Direction = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].direction; + F32 cp2SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; + F32 cp2Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); + F32 cp2TgtSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pumpTargetSpeed; + + if ( 0 != fpgaConcPumpsFault ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, fpgaConcentratePumpsFault ); + //SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, fpgaConcPumpsFault ); } // Use the above values to prepare the broadcast data @@ -606,18 +620,38 @@ if ( HW_CONFIG_BETA == getHardwareConfigStatus() ) { controlSet = ( CONCENTRATE_PUMP_ON_CONTROL | concentratePumps[ pumpId ].direction ); - CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAV3AcidPumpControl( controlSet ) : setFPGAV3BicarbPumpControl( controlSet ); + + if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) + { + setFPGAV3AcidPumpControl( controlSet ); + } + else + { + setFPGAV3BicarbPumpControl( controlSet ); + } } else #endif { controlSet = concentratePumps[ pumpId ].controlSet; - CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAAcidPumpControl( controlSet ) : setFPGABicarbPumpControl( controlSet ); + if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) + { + setFPGAAcidPumpControl( controlSet ); + } + else + { + setFPGABicarbPumpControl( controlSet ); + } } state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; } + if ( TRUE == concentratePumps[ pumpId ].hasParkBeenRequested ) + { + stopConcentratePump( pumpId ); + } + return state; } @@ -1011,7 +1045,7 @@ if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) { result = TRUE; - concentratePumps[ pumpId ].parkFaulted.ovData = 0.0; + concentratePumps[ pumpId ].parkFaulted.ovData = 0.0F; concentratePumps[ pumpId ].parkFaulted.override = OVERRIDE_RESET; } Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r5d3e28c19ae10a99a5ce1fc5c010ac944975a6a1 -r329409d63c11fd7d7fc8c3d3dd1d96e4e5a109dc --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 5d3e28c19ae10a99a5ce1fc5c010ac944975a6a1) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 329409d63c11fd7d7fc8c3d3dd1d96e4e5a109dc) @@ -71,7 +71,7 @@ #define FLUSH_CICRCULATION_WAIT_TIME_MS ( 60 * MS_PER_SECOND ) ///< Flush circulation path wait time in milliseconds. #define FLUSH_CIRCULATION_CONC_PUMPS_WAIT_TIME_MS ( 3 * SEC_PER_MIN * MS_PER_SECOND ) ///< Flush circulation concentrate pumps on time in milliseconds. #define MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C 3.0F ///< Maximum flush circulation temperature difference tolerance in C. -#define NUM_OF_TEMP_SENSORS_TO_AVG 4.0F ///< Number of temperature sensors to average to check the difference. +#define NUM_OF_TEMP_SENSORS_TO_AVG 3.0F ///< Number of temperature sensors to average to check the difference. #define ACID_PUMP_SPEED_ML_PER_MIN 30.6F ///< Acid concentrate pump speed in mL/min. // The bicarb pump is 2% faster than the acid pump to create a flow from acid to bicarb line during heat disinfect #define BICARB_PUMP_SPEED_ML_PER_MIN -30.0F ///< Bicarb concentrate pump speed in mL/min. @@ -86,7 +86,7 @@ // Fill and heat water #define HEAT_DISINFECT_TARGET_TEMPERATURE_C 82.0F ///< Heat disinfect target water temperature in C. -#define HEAT_DISINFECT_START_TEMPERATURE_C 81.0F ///< Heat disinfect minimum acceptable temperature in C. +#define HEAT_DISINFECT_START_TEMPERATURE_C 48.0F // 81.00 ///< Heat disinfect minimum acceptable temperature in C. // R1 to R2 & R2 to R1 heat disinfect circulation #define HEAT_DISINFECT_TARGET_RO_FLOW_LPM 1.3F ///< Heat disinfect target RO flow rate in L/min. @@ -107,10 +107,6 @@ #define DRAIN_PUMP_START_TIME_IN_MIX_DRAIN_MS ( 5 * MS_PER_SECOND ) ///< Time to start the drain pump at mix drain after directing the flow to drain in ms. #define DRAIN_PUMP_RPM_IN_MIX_DRAIN 600 ///< The RPM that the drain pump should be run during mix drain. #define MIX_DRAIN_WEIGHT_UNCHANGE_TIMEOUT ( 15 * MS_PER_SECOND ) ///< Time period of unchanged weight during mix draining before timeout. - -// Rinse R1 to R2 -#define ROF_MIN_LOW_PRESSURE_TEMPERATURE_C 45.0F ///< RO filter minimum temperature that the pressure must be no more than 30psi in C. - #define MIX_DRAIN_TEMPERATURE_THRESHOLD_C 60.0F ///< Temperature threshold for performing mix drain or normal drain. /// Cancellation paths @@ -1214,23 +1210,21 @@ if ( TRUE == didTimeout( stateTimer, POST_HEAT_DISINFECT_WAIT_TIME_MS ) ) { - // Stop the drain pump and the RO pump to exit the closed loop - signalDrainPumpHardStop(); signalROPumpHardStop(); - // De-energize all the valves that are not in the path anymore - // and wait for the RO membrane to be cooled down. - setValveState( VPI, VALVE_STATE_CLOSED ); - setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); - setValveState( VRD1, VALVE_STATE_CLOSED ); - setValveState( VBF, VALVE_STATE_OPEN ); - setValveState( VDR, VALVE_STATE_RECIRC_C_TO_NC ); - setValveState( VRC, VALVE_STATE_RECIRC_C_TO_NC ); - setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - //setROPumpTargetFlowRateLPM( ROF_COOL_DOWN_TARGET_FLOW_LPM, HEAT_DISINFECT_MAX_RO_PRESSURE_PSI ); + if ( TRUE == isDrainPumpOn() ) + { + // Stop the drain pump and the RO pump to exit the closed loop + signalDrainPumpHardStop(); + } + else + { + + } + stateTimer = getMSTimerCount(); - state = DG_HEAT_DISINFECT_STATE_COMPLETE; + state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; } return state; @@ -1251,10 +1245,8 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectMixDrainR1State( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; + heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_FLUSH_AFTER_DISINFECT; - // Set the heat disinfect UI state - heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_FLUSH_AFTER_DISINFECT; - if ( ( TRUE == didTimeout( stateTimer, DRAIN_PUMP_START_TIME_IN_MIX_DRAIN_MS ) ) && ( FALSE == isDrainPumpInMixDrainOn ) ) { isDrainPumpInMixDrainOn = TRUE; @@ -1277,13 +1269,13 @@ setValveState( VRD2, VALVE_STATE_OPEN ); rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; - stateTimer = getMSTimerCount(); - state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R2; + stateTimer = getMSTimerCount(); + state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R2; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevHeatDisinfectState = state; - state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; } } @@ -1315,7 +1307,7 @@ else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevHeatDisinfectState = state; - state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; } return state; @@ -1378,7 +1370,7 @@ // The two sensors must be less than a threshold to decide if mix drain is needed to normal drain if ( ( TDi < MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) && ( TRo < MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) ) { - targetRPM = DRAIN_PUMP_TARGET_RPM; + targetRPM = DRAIN_PUMP_TARGET_RPM; cancellationMode = CANCELLATION_MODE_COLD; } else @@ -1387,7 +1379,7 @@ setValveState( VPI, VALVE_STATE_OPEN ); setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NO ); - targetRPM = DRAIN_PUMP_RPM_IN_MIX_DRAIN; + targetRPM = DRAIN_PUMP_RPM_IN_MIX_DRAIN; cancellationMode = CANCELLATION_MODE_HOT; } @@ -1425,7 +1417,7 @@ signalDrainPumpHardStop(); prevHeatDisinfectState = state; - state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; } // If reservoir 2 has already been drained and reservoir 1 is empty, reset and switch to complete @@ -1439,7 +1431,6 @@ setValveState( VRD1, VALVE_STATE_CLOSED ); setValveState( VRD2, VALVE_STATE_CLOSED ); signalDrainPumpHardStop(); - failHeatDisinfect(); } } @@ -1448,8 +1439,9 @@ setValveState( VRD1, VALVE_STATE_CLOSED ); setValveState( VRD2, VALVE_STATE_CLOSED ); signalDrainPumpHardStop(); + prevHeatDisinfectState = state; - state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; } return state; @@ -1471,7 +1463,7 @@ // Set the heat disinfect UI state heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_COMPLETE; - stopDGHeatDisinfect(); + requestNewOperationMode( DG_MODE_HCOL ); return state; }