Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -re66857bf3bbc6be73802ca6596cbb9444541e21f -r6dde3576087b002b0b94879ef1677fc19e563899 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision e66857bf3bbc6be73802ca6596cbb9444541e21f) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 6dde3576087b002b0b94879ef1677fc19e563899) @@ -61,7 +61,7 @@ #define RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM 0.8 ///< RO pump target flow rate during flush/fill in L/min. TODO original flow was 0.8 #define MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI 130 ///< Maximum RO pump pressure during flush/fill states in psi. #define FLUSH_CICRCULATION_WAIT_TIME_MS ( 1 * MS_PER_SECOND ) ///< Flush/rinse circulation path wait time in milliseconds. TODO original time was 30 seconds -#define MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C 30.0 ///< Maximum flush circulation temperature difference tolerance in C. TODO original difference was 3.0 degrees +#define MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C 50.0 ///< Maximum flush circulation temperature difference tolerance in C. TODO original difference was 3.0 degrees #define NUM_OF_TEMP_SENSORS_TO_AVG 4.0 ///< Number of temperature sensors to average to check the difference. // Flush and drain R1 and R2 @@ -73,17 +73,17 @@ #define RSRVRS_DRAIN_TIMEOUT_MS ( 2 * 60 * MS_PER_SECOND ) ///< Reservoirs 1 & 2 drain timeout in ms. // Fill and heat water -#define HEAT_DISINFECT_TARGET_TEMPERATURE_C 25.0 ///< Heat disinfect target water temperature in C. TODO original temperature was 85.0 -#define HEAT_DISINFECT_START_TEMPERATURE_C 21.0 ///< Heat disinfect minimum acceptable temperature in C. TODO original temperature was 81.0 +#define HEAT_DISINFECT_TARGET_TEMPERATURE_C 85.0 ///< Heat disinfect target water temperature in C. TODO original temperature was 85.0 +#define HEAT_DISINFECT_START_TEMPERATURE_C 81.0 ///< Heat disinfect minimum acceptable temperature in C. TODO original temperature was 81.0 // R1 to R2 & R2 to R1 heat disinfect circulation #define HEAT_DISINFECT_TARGET_RO_FLOW_LPM 0.9 ///< Heat disinfect target RO flow rate in L/min. TODO original value was 0.8 #define HEAT_DISINFECT_MAX_RO_PRESSURE_PSI 30 ///< Heat disinfect maximum RO pressure in psi. #define HEAT_DISINFECT_TARGET_DRAIN_PRES_PSI 5.0 ///< Heat disinfect target drain outlet pressure in psi. -#define HEAT_DISINFECT_TIME_MS ( 1 * 60 * MS_PER_SECOND ) ///< Heat disinfect time for each section in milliseconds. TODO original time was 10 minutes -#define HEAT_DISINFECT_START_TEMP_TIMOUT_MS ( 3 * 60 * 60 * MS_PER_SECOND ) ///< Heat disinfect reaching to minimum temperature timeout in milliseconds. TODO figure out this timeout -#define RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ( 0.5 * 60 * MS_PER_SECOND ) ///< Reservoirs 1 & 2 maximum volume out of range timeout during heat disnfect. -#define RSRVRS_MAX_TARGET_VOL_CHANGE_ML 100.0 ///< Reservoirs 1 & 2 maximum allowed volume change when full during heat disinfect. +#define HEAT_DISINFECT_TIME_MS ( 5 * 60 * MS_PER_SECOND ) ///< Heat disinfect time for each section in milliseconds. TODO original time was 10 minutes +#define HEAT_DISINFECT_START_TEMP_TIMOUT_MS ( 4 * 60 * 60 * MS_PER_SECOND ) ///< Heat disinfect reaching to minimum temperature timeout in milliseconds. TODO figure out this timeout +#define RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ( 0.5 * 60 * MS_PER_SECOND ) ///< Reservoirs 1 & 2 maximum volume out of range timeout during heat disnfect. TODO change this to 5 seconds +#define RSRVRS_MAX_TARGET_VOL_CHANGE_ML 100.0 ///< Reservoirs 1 & 2 maximum allowed volume change when full during heat disinfect. TODO original value is 100 mL #define POST_HEAT_DISINFECT_WAIT_TIME_MS ( 1 * 60 * MS_PER_SECOND ) ///< Heat disinfect final wait time before flushing the system in milliseconds. // Rinse R1 to R2 @@ -117,6 +117,7 @@ HEAT_DISINFECT_IN_PROGRESS = 0, ///< Heat disinfect in progress. HEAT_DISINFECT_RSRVRS_LEAK_TIMEOUT, ///< Heat disinfect reservoirs leak timeout. HEAT_DISINFECT_HEAT_UP_TIMEOUT, ///< Heat disinfect heat up timeout. + HEAT_DISINFECT_POST_WAIT, ///< Heat disinfect post wait time state. HEAT_DISINFECT_COMPLETE, ///< Heat disinfect complete. NUM_OF_HEAT_DISINFECT_STATUS ///< Number of heat disinfect status. } HEAT_DISINFECT_STATUS_T; @@ -136,14 +137,25 @@ static F32 R1HeatDisinfectVol = 0.0; ///< Reservoir 1 full volume during heat disinfect. static F32 R2HeatDisinfectVol = 0.0; ///< Reservoir 2 full volume during heat disinfect. static U32 heatDisinfectTimer = 0; ///< Heat disinfect timer. -static BOOL hasHeatDisinfectStarted = FALSE; ///< Heat disinfect start/not start flag. +static BOOL isPartialDisinfectInProgress = FALSE; ///< Heat disinfect partial complete/ in progess flag. static U32 rsrvrsVolMonitorTimer = 0; ///< Reservoir 1 & 2 volume monitor timers during heat disinfect. static BOOL areRsrvrsLeaking = FALSE; ///< Reservoir 1 & 2 leak check flag during heat disinfect. -static BOOL hasPostHeatDisinfectWaitStarted = FALSE; ///< Final delay at the end of heat disinfect and before flush flag. +static BOOL hasPostDisinfectWaitStarted = FALSE; ///< Final delay at the end of heat disinfect and before flush flag. +static U32 heatDisinfectPostTimer = 0; ///< Heat disinfect post wait timer. static U32 dataPublishCounter = 0; ///< Heat Disinfect data publish counter. static CANCELLATION_MODES_T cancellationMode = CANCELLATION_MODE_NONE; ///< Cancellation mode. static U32 rsrvrFillStableTimeCounter = 0; ///< Reservoirs fill stable time counter. +// TODO test code +static U32 tempCounter = 0; +static BOOL endone = FALSE; +static BOOL dedone = FALSE; +static BOOL vro = FALSE; +static BOOL vrd = FALSE; +static BOOL vri = FALSE; +static BOOL vrf = FALSE; +// TODO test code + // ********** private function prototypes ********** static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStartState( void ); @@ -171,7 +183,8 @@ static void resetActuators( void ); static void setModeToFailed( DG_HEAT_DISINFECT_STATE_T state ); static RESERVOIRS_STATUS_T getRsrvrFillStatus( DG_RESERVOIR_ID_T r, F32 targetVol, U32 timeout, DG_HEAT_DISINFECT_STATE_T cancellationState ); -static RESERVOIRS_STATUS_T getRsrvrDrainStatus( DG_RESERVOIR_ID_T r, U32 drainSteadyStateTimeout, U32 timeout, DG_HEAT_DISINFECT_STATE_T cancellationState ); +static RESERVOIRS_STATUS_T getRsrvrDrainStatus( DG_RESERVOIR_ID_T r, U32 drainSteadyStateTimeout, U32 timeout, + DG_HEAT_DISINFECT_STATE_T cancellationState ); static HEAT_DISINFECT_STATUS_T getHeatDisinfectStatus( void ); static void publishHeatDisinfectData( void ); @@ -198,10 +211,17 @@ rsrvr2Status = RESERVOIR_STATUS_UNKNOWN; R1HeatDisinfectVol = 0.0; R2HeatDisinfectVol = 0.0; - hasPostHeatDisinfectWaitStarted = FALSE; + hasPostDisinfectWaitStarted = FALSE; overallHeatDisinfectTimer = 0; cancellationMode = CANCELLATION_MODE_NONE; rsrvrFillStableTimeCounter = 0; + heatDisinfectPostTimer = 0; + isPartialDisinfectInProgress = FALSE; + + tempCounter = 0; + dedone = FALSE; + endone = FALSE; + vro = vrd = vri = vrf = FALSE; } /*********************************************************************//** @@ -397,6 +417,87 @@ } else { + // TODO Test code remove + /*if ( endone != TRUE ) + { + if ( vro != TRUE ) + { + setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); + vro = TRUE; + tempCounter = 0; + } + else if ( vrd != TRUE && tempCounter > 5 ) + { + setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); + vrd = TRUE; + tempCounter = 0; + } + else if ( vri != TRUE && tempCounter > 5 ) + { + setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); + vri = TRUE; + tempCounter = 0; + } + else if ( vrf != TRUE && tempCounter > 5 ) + { + setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); + vrf = TRUE; + tempCounter = 0; + endone = TRUE; + } + + tempCounter++; + state = DG_HEAT_DISINFECT_STATE_START; + } + else if ( endone == TRUE && dedone != TRUE ) + { + if ( vro == TRUE ) + { + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); + vro = FALSE; + tempCounter = 0; + } + else if ( vrd == TRUE && tempCounter > 5 ) + { + setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); + vrd = FALSE; + tempCounter = 0; + } + else if ( vri == TRUE && tempCounter > 5 ) + { + setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); + vri = FALSE; + tempCounter = 0; + } + else if ( vrf == TRUE && tempCounter > 5 ) + { + setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + vrf = FALSE; + tempCounter = 0; + dedone = TRUE; + } + + tempCounter++; + state = DG_HEAT_DISINFECT_STATE_START; + } + + if ( dedone == TRUE && endone == TRUE ) + { + // Close VPi to prevent wasting water + setValveState( VPI, VALVE_STATE_CLOSED ); + // Request a tare for reservoir 1 + tareReservoir(); + // Set the actuators to drain R1 + setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); + setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); + + rsrvrFillStableTimeCounter = 0; + // Assume reservoir 1 is full and drain it + rsrvr1Status = RESERVOIR_STATUS_FULL; + stateTimer = getMSTimerCount(); + }*/ + // TODO test code remove + // Close VPi to prevent wasting water setValveState( VPI, VALVE_STATE_CLOSED ); // Request a tare for reservoir 1 @@ -445,7 +546,7 @@ setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); - //TODO turn on the concentrate pumps + // TODO turn on the concentrate pumps // Set the RO pump to run at full pressure setROPumpTargetFlowRate( RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM, MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI ); @@ -784,6 +885,7 @@ setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); + setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); // Turn on the RO pump setROPumpTargetFlowRate( RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM, MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI ); @@ -829,8 +931,8 @@ // Set the valves to drain R2 and no fill setValveState( VPI, VALVE_STATE_CLOSED ); setValveState( VBF, VALVE_STATE_OPEN ); - setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); - setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); + setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NC ); + //setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); setValveState( VDR, VALVE_STATE_RECIRC_C_TO_NC ); setValveState( VRC, VALVE_STATE_RECIRC_C_TO_NC ); @@ -895,6 +997,10 @@ stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER; break; + + default: + // Do nothing, heat disinfect in progress + break; } return state; @@ -912,21 +1018,17 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER; - // In this state, R2 is fully filled up and R1 is partially filled up with hot water - // So waiting for R1 to get to the level of defined partially full - //BOOL isR1PartiallyFull = fabs( getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ) - RSRVRS_PARTIAL_FILL_VOL_ML ) < - // RSRVRS_MAX_TARGET_VOL_CHANGE_ML; - // First reservoir 1 must be partially full if ( rsrvr1Status == RESERVOIR_STATUS_EMPTY ) { - rsrvr1Status = getRsrvrFillStatus( DG_RESERVOIR_1, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS, DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH ); + rsrvr1Status = getRsrvrFillStatus( DG_RESERVOIR_1, RSRVRS_PARTIAL_FILL_VOL_ML, RSRVRS_500ML_FILL_UP_TIMEOUT_MS, + DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH ); } else if ( rsrvr1Status == RESERVOIR_STATUS_FULL ) { rsrvr2Status = getRsrvrFillStatus( DG_RESERVOIR_2, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH ); - if ( rsrvr2Status == RESERVOIR_STATUS_FULL /*&& isR1PartiallyFull*/ ) + if ( rsrvr2Status == RESERVOIR_STATUS_FULL ) { // Get the current volumes to be monitored during R2 to R1 heat disinfect state R1HeatDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); @@ -961,45 +1063,44 @@ state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; break; - case HEAT_DISINFECT_COMPLETE: - if ( hasPostHeatDisinfectWaitStarted != TRUE ) + case HEAT_DISINFECT_POST_WAIT: + if ( hasPostDisinfectWaitStarted != TRUE ) { // Turn off the pumps and heaters // TODO turn off CP1 and CP2 stopPrimaryHeater(); stopTrimmerHeater(); - hasPostHeatDisinfectWaitStarted = TRUE; - stateTimer = getMSTimerCount(); + hasPostDisinfectWaitStarted = TRUE; } - else if ( hasPostHeatDisinfectWaitStarted && didTimeout( stateTimer, POST_HEAT_DISINFECT_WAIT_TIME_MS ) ) - { - // Stop the drain pump and the RO pump to exit the closed loop - signalDrainPumpHardStop(); - signalROPumpHardStop(); + break; - // De-energize all the valves that are not in the path anymore and set the other - // valves to drain the hot water - setValveState( VPI, VALVE_STATE_OPEN ); - setValveState( VBF, VALVE_STATE_CLOSED ); - setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); - setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); - setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NC ); + case HEAT_DISINFECT_COMPLETE: + // Stop the drain pump and the RO pump to exit the closed loop + signalDrainPumpHardStop(); + signalROPumpHardStop(); - // Turn on the drain pump to drain the reservoirs in open loop mode - setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); + // De-energize all the valves that are not in the path anymore and set the other + // valves to drain the hot water + setValveState( VPI, VALVE_STATE_OPEN ); + setValveState( VBF, VALVE_STATE_CLOSED ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NC ); - rsrvr1Status = RESERVOIR_STATUS_FULL; - stateTimer = getMSTimerCount(); - hasPostHeatDisinfectWaitStarted = FALSE; - R1HeatDisinfectVol = 0; - R2HeatDisinfectVol = 0; - state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; - } + // Turn on the drain pump to drain the reservoirs in open loop mode + setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); + + rsrvr1Status = RESERVOIR_STATUS_FULL; + stateTimer = getMSTimerCount(); + hasPostDisinfectWaitStarted = FALSE; + R1HeatDisinfectVol = 0; + R2HeatDisinfectVol = 0; + state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; break; } @@ -1261,7 +1362,7 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; - if ( cancellationMode == CANCELLATION_MODE_NONE ) + /*if ( cancellationMode == CANCELLATION_MODE_NONE ) { // Stop all the actuators first then decide who should run next resetActuators(); @@ -1291,8 +1392,7 @@ // The drain is set to start from reservoir 2 since all the actuators have been de-energized // Start the drain pump // TODO for testing only remove - //setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); - state = DG_HEAT_DISINFECT_STATE_COMPLETE; + setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); //TODo for testing only remove // Start the timer for drain timeout @@ -1324,7 +1424,7 @@ // Pass the previous heat disinfect state for alarm report setModeToFailed( prevHeatDisinfectState ); } - } + }*/ return state; } @@ -1477,7 +1577,7 @@ BOOL isR2OutOfRange = fabs( getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ) - R2HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML; // Check if either reservoir 1 or reservoir 2 are losing volume more than allowed volume - if ( isR1OutOfRange || isR2OutOfRange ) + /*if ( isR1OutOfRange || isR2OutOfRange ) { // If the leak is the first time after a while, set the flag and start the timer if ( FALSE == areRsrvrsLeaking ) @@ -1496,38 +1596,56 @@ else { areRsrvrsLeaking = FALSE; - } + }*/ // If the coldest spot which is TPm is less than minimum heat disinfect temperature, // reset the heat disinfect timers and check whether heating up has timed out if ( ThdTemp < HEAT_DISINFECT_START_TEMPERATURE_C ) { // Keep reseting the disinfect timer so the elapsed time is always 0 until disinfection truly starts - heatDisinfectTimer = getMSTimerCount(); - hasHeatDisinfectStarted = FALSE; + heatDisinfectTimer = getMSTimerCount(); + isPartialDisinfectInProgress = FALSE; if ( didTimeout( stateTimer, HEAT_DISINFECT_START_TEMP_TIMOUT_MS ) ) { // Heating up to minimum temperature for heat disinfect failed - // TODO we need to know how long it takes to reach to temperature before turning on the timeout status = HEAT_DISINFECT_HEAT_UP_TIMEOUT; } } - else if ( hasHeatDisinfectStarted != TRUE && ThdTemp > HEAT_DISINFECT_START_TEMPERATURE_C ) + else if ( isPartialDisinfectInProgress != TRUE && ThdTemp > HEAT_DISINFECT_START_TEMPERATURE_C ) { // The temperature of the coldest spot is in range to start the disinfect timer - heatDisinfectTimer = getMSTimerCount(); - hasHeatDisinfectStarted = TRUE; + heatDisinfectTimer = getMSTimerCount(); + isPartialDisinfectInProgress = TRUE; } // If the flag is TRUE, check if this stage of heat disinfect is done - if ( hasHeatDisinfectStarted ) + if ( isPartialDisinfectInProgress && didTimeout( heatDisinfectTimer, HEAT_DISINFECT_TIME_MS ) ) { - if ( didTimeout( heatDisinfectTimer, HEAT_DISINFECT_TIME_MS ) ) + // If the state is disinfect R2 to R1 but post wait time has not started, set the post disinfect timer + if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_DISINFECT_R2_TO_R1 && hasPostDisinfectWaitStarted != TRUE ) { + heatDisinfectPostTimer = getMSTimerCount(); + status = HEAT_DISINFECT_POST_WAIT; + } + // If the state is disinfect R2 to R1 but post wait time has started + else if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_DISINFECT_R2_TO_R1 && hasPostDisinfectWaitStarted == TRUE ) + { + // Check if the post disinfect wait has timed out + if ( didTimeout( heatDisinfectPostTimer, POST_HEAT_DISINFECT_WAIT_TIME_MS ) ) + { + status = HEAT_DISINFECT_COMPLETE; + } + else + { + status = HEAT_DISINFECT_POST_WAIT; + } + } + else + { // Done with this stage of heat disnfect. Reset the variables status = HEAT_DISINFECT_COMPLETE; - hasHeatDisinfectStarted = FALSE; + isPartialDisinfectInProgress = FALSE; } } Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r73796a0e50450e4958407c4ce42337e257277faa -r6dde3576087b002b0b94879ef1677fc19e563899 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 73796a0e50450e4958407c4ce42337e257277faa) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 6dde3576087b002b0b94879ef1677fc19e563899) @@ -449,13 +449,6 @@ if ( hasTimeOut || hasTargetReached ) { - // TODO remove Test code - if ( reservoirId == DG_RESERVOIR_1 ) - { - BOOL test = TRUE; - } - // TODO remove test code - result = TRUE; reservoirLowestWeight[ reservoirId ] = MAX_RESERVOIR_WEIGHT;