Index: firmware/App/Controllers/PermeateTank.c =================================================================== diff -u -rd79faa7118db6d048ce3433224b3e5a478c97a98 -raaaefc1196ce48c3a28cf6945022b66afc355564 --- firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision d79faa7118db6d048ce3433224b3e5a478c97a98) +++ firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision aaaefc1196ce48c3a28cf6945022b66afc355564) @@ -20,6 +20,7 @@ #include "Messaging.h" #include "PermeateTank.h" #include "TaskGeneral.h" +#include "TDInterface.h" #include "Timers.h" #include "Utilities.h" #include "Valves.h" @@ -33,9 +34,12 @@ #define PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) for permeate tank broadcast #define PERMEATE_TANK_PUBLISH_COUNTER_START_COUNT 9 ///< Publishing counter offset -#define PERMEATE_TANK_FILL_SWITCH_MS ( 10 * MS_PER_SECOND ) ///< state switch timeout in fill state ( in ms ) -#define PERMEATE_TANK_FULL_SWITCH_MS ( 1 * MS_PER_SECOND ) ///< state switch timeout in full state (in ms) -#define PERMEATE_TANK_FULL_TIMEOUT_MS ( 60 * MS_PER_SECOND ) ///< timeout being in full state too long ( in ms ) +#define PERMEATE_TANK_FULL_SWITCH_MS ( 1 * MS_PER_SECOND ) ///< State switch timeout in full state (in ms) +#define PERMEATE_TANK_EMPTY_LEVEL_VOL_ML 0 ///< Permeate tank volume in empty level ( in ml ) +#define PERMEATE_TANK_LOW_LEVEL_VOL_ML 957 ///< Permeate tank volume in low level ( in ml ) +#define PERMEATE_TANK_HIGH_LEVEL_VOL_ML 1345 ///< Permeate tank volume in high level ( in ml ) +#define PERMEATE_TANK_FULL_LEVEL_VOL_ML 1532 ///< Permeate tank volume in full level ( in ml ) +#define RINSE_PUMP_TARGET_FLOW 228.89 ///< Rinse pump rate // ********** private data ********** @@ -44,9 +48,11 @@ static OVERRIDE_U32_T permeateTankPublishInterval; ///< Interval (in ms) at which to publish permeate tank data to CAN bus. static BOOL pendingStartPermeateTankController; ///< Flag indicates an air trap controller start request is pending. static BOOL pendingStopPermeateTankController; ///< Flag indicates an air trap controller stop request is pending. -static U32 tankFullAlarmTimeout; ///< Time stamp to track alarm timeout. +static U32 tankFullAlarmTimer; ///< Time stamp to track alarm timeout during tank full. +static U32 tankFillAlarmTimer; ///< Time stamp to track alarm timeout during tank fill. static U32 tankFullDelayTime; ///< Time stamp to track delay before valve switch. -static U32 tankFillDelayTime; ///< Time stamp to track fill timeout. +static F32 tankFullAlarmTimeout; ///< Permeate tank full alarm timeout +static F32 tankFillAlarmTimeout; ///< Permeate tank fill alarm timeout // ********** private function prototypes ********** @@ -71,9 +77,11 @@ permeateTankPublishInterval.ovData = PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL; permeateTankPublishInterval.ovInitData = PERMEATE_TANK_PUMP_DATA_PUB_INTERVAL; permeateTankPublishInterval.override = OVERRIDE_RESET; - tankFillDelayTime = 0; tankFullDelayTime = 0; - tankFullAlarmTimeout = 0; + tankFullAlarmTimer = 0; + tankFillAlarmTimer = 0; + tankFullAlarmTimeout = 0.0F; + tankFillAlarmTimeout = 0.0F; } /*********************************************************************//** @@ -156,6 +164,46 @@ /*********************************************************************//** * @brief + * The getTankFullAlarmTimeout function returns the tank full alarm timeout + * @details \b Inputs: none + * @details \b Outputs: tankFullAlarmTimeout + * @return the alarm timeout for tank full + *************************************************************************/ +F32 getTankFullAlarmTimeout( void ) +{ + F32 expectedDeprimeTime = 0.0F; + F32 expectedTankFullTime = 0.0F; + F32 ddConsumptionRate = getTDDialysateFlowrate() + RINSE_PUMP_TARGET_FLOW; + + expectedTankFullTime = ( ( PERMEATE_TANK_HIGH_LEVEL_VOL_ML - PERMEATE_TANK_LOW_LEVEL_VOL_ML ) / ddConsumptionRate ) * SEC_PER_MIN; + expectedDeprimeTime = ( ( PERMEATE_TANK_LOW_LEVEL_VOL_ML - PERMEATE_TANK_EMPTY_LEVEL_VOL_ML ) / ddConsumptionRate ) * SEC_PER_MIN; + tankFullAlarmTimeout = expectedTankFullTime + expectedDeprimeTime; + + return tankFullAlarmTimeout; +} + +/*********************************************************************//** + * @brief + * The getTankFillAlarmTimeout function returns the tank fill alarm timeout + * @details \b Inputs: none + * @details \b Outputs: tankFillAlarmTimeout + * @return the alarm timeout for tank fill + *************************************************************************/ +F32 getTankFillAlarmTimeout( void ) +{ + F32 expectedOverfillTime = 0.0F; + F32 expectedTankFillTime = 0.0F; + F32 ddConsumptionRate = getTDDialysateFlowrate() + RINSE_PUMP_TARGET_FLOW; + + expectedTankFillTime = ( ( PERMEATE_TANK_HIGH_LEVEL_VOL_ML - PERMEATE_TANK_LOW_LEVEL_VOL_ML ) / ddConsumptionRate ) * SEC_PER_MIN; + expectedOverfillTime = ( ( PERMEATE_TANK_FULL_LEVEL_VOL_ML - PERMEATE_TANK_HIGH_LEVEL_VOL_ML ) / ddConsumptionRate ) * SEC_PER_MIN; + tankFillAlarmTimeout = ( expectedTankFillTime + ( expectedOverfillTime / 2 ) ); + + return tankFillAlarmTimeout; +} + +/*********************************************************************//** + * @brief * The execPermeateTankController function executes the air trap control state machine. * @details \b Alarm: ALARM_ID_FP_SOFTWARE_FAULT if current permeate tank control * state is invalid. @@ -243,6 +291,11 @@ PERMEATE_TANK_STATE_T state = PERMEATE_TANK_FILL_STATE; LEVEL_STATE_T level = getLevelStatus( P25_LEVL ); + if ( TRUE == didTimeout( tankFillAlarmTimer, getTankFillAlarmTimeout() ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_FP_GEN_PERMEATE_TANK_FILL_TIMEOUT, level ) + } + // Transition to manual valve control state when requested if ( TRUE == pendingStopPermeateTankController ) { @@ -254,13 +307,6 @@ { state = PERMEATE_TANK_FULL_STATE; } - else if ( level == LEVEL_STATE_LOW ) - { - if ( TRUE == didTimeout( tankFillDelayTime, PERMEATE_TANK_FILL_SWITCH_MS ) ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_FP_GEN_PERMEATE_TANK_FILL_TIMEOUT, level ) - } - } return state; } @@ -278,7 +324,7 @@ PERMEATE_TANK_STATE_T state = PERMEATE_TANK_FULL_STATE; LEVEL_STATE_T level = getLevelStatus( P25_LEVL ); - if ( TRUE == didTimeout( tankFullAlarmTimeout, PERMEATE_TANK_FULL_TIMEOUT_MS ) ) + if ( TRUE == didTimeout( tankFullAlarmTimer, getTankFullAlarmTimeout() ) ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_FP_GEN_PERMEATE_TANK_FULL_TIMEOUT, level ) } @@ -327,20 +373,20 @@ setValveState( P34_VALV, VALVE_STATE_CLOSED ); // Current set to Medium recovery for alpha HW setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_OPEN ); - tankFillDelayTime = getMSTimerCount(); + tankFillAlarmTimer = getMSTimerCount(); break; case PERMEATE_TANK_FULL_STATE: setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_VALV, VALVE_STATE_CLOSED ); - setValveState( P6_VALV, VALVE_STATE_CLOSED ); + setValveState( P6_VALV, VALVE_STATE_OPEN ); setValveState( P11_VALV, VALVE_STATE_OPEN ); setValveState( P33_VALV, VALVE_STATE_OPEN ); - setValveState( P34_VALV, VALVE_STATE_OPEN ); + setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); tankFullDelayTime = getMSTimerCount(); - tankFullAlarmTimeout = getMSTimerCount(); + tankFullAlarmTimer = getMSTimerCount(); break; default: