Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r3e7ed8c3a429336cc64cd296ef9b370764a5671a -r202e8887cc525b19b76b4eba309afed2e394f49b --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 3e7ed8c3a429336cc64cd296ef9b370764a5671a) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 202e8887cc525b19b76b4eba309afed2e394f49b) @@ -101,12 +101,10 @@ U32 controlTimerCounter; ///< Timer counter to perform control on concentrate pump. CONCENTRATE_PUMP_STATE_T execState; ///< Concentrate pump execute current state. BOOL hasTurnOnPumpsBeenRequested; ///< Flag indicates a request to turn concentrate pumps on. - F32 pumpTargetSpeed; ///< Target concentrate pumps' speed (mL/min). F32 currentPumpSpeed; ///< Current controlled concentrate pumps' speed (mL/min). OVERRIDE_F32_T measuredPumpSpeed; ///< Measured concentrate pump speed (mL/min). U16 togglePeriodCount; ///< Converted pump speed (mL/min) to toggle period counts (0.5 uS increment counts per step). - U08 direction; ///< Concentrate pump motor direction. U08 controlSet; ///< Concentrate pump control set. (Used in DVT) F32 pulseWidthUS; ///< Concentrate pump pulse width in microseconds. @@ -132,6 +130,7 @@ static CONCENTRATE_PUMP_STATE_T handleConcentratePumpControlTargetSpeedState( CONCENTRATE_PUMPS_T pumpId ); static BOOL stepConcentratePumpToTargetSpeed( CONCENTRATE_PUMPS_T pumpId ); static void calcMeasuredPumpsSpeed( CONCENTRATE_PUMPS_T pumpId, U16 pulseWidthCount ); +static void monitorPumpSpeed( CONCENTRATE_PUMPS_T pumpId, ALARM_ID_T alarm ); /*********************************************************************//** * @brief @@ -214,17 +213,8 @@ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONC_PUMPS_SPEED_ALARM ) != SW_CONFIG_ENABLE_VALUE ) #endif { - - F32 cp1TargetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pumpTargetSpeed; - F32 cp1Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) - cp1TargetSpeed ) / cp1TargetSpeed; - BOOL isCP1SpeedOut = ( cp1Error > CONCENTRATE_PUMP_ERROR_TOLERANCE ? TRUE : FALSE ); - - F32 cp2TargetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pumpTargetSpeed; - F32 cp2Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) - cp2TargetSpeed ) / cp2TargetSpeed; - BOOL isCP2SpeedOut = ( cp2Error > CONCENTRATE_PUMP_ERROR_TOLERANCE ? TRUE : FALSE ); - - checkPersistentAlarm( ALARM_ID_CP1_SPEED_CONTROL_ERROR, isCP1SpeedOut, cp1Error, CONCENTRATE_PUMP_ERROR_TOLERANCE ); - checkPersistentAlarm( ALARM_ID_CP2_SPEED_CONTROL_ERROR, isCP2SpeedOut, cp2Error, CONCENTRATE_PUMP_ERROR_TOLERANCE ); + monitorPumpSpeed( CONCENTRATEPUMPS_CP1_ACID, ALARM_ID_CP1_SPEED_CONTROL_ERROR ); + monitorPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB, ALARM_ID_CP2_SPEED_CONTROL_ERROR ); } concentratePumpMonitorTimerCounter = 0; @@ -425,23 +415,18 @@ *************************************************************************/ F32 getMeasuredPumpSpeed( CONCENTRATE_PUMPS_T pumpId ) { - F32 result = 0.0; + F32 speed = 0.0; if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { - result = concentratePumps[ pumpId ].measuredPumpSpeed.data; - - if ( OVERRIDE_KEY == concentratePumps[ pumpId ].measuredPumpSpeed.override ) - { - result = concentratePumps[ pumpId ].measuredPumpSpeed.ovData; - } + speed = getF32OverrideValue( &concentratePumps[ pumpId ].measuredPumpSpeed ); } else { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); } - return result; + return speed; } /*********************************************************************//** @@ -648,35 +633,53 @@ *************************************************************************/ static void calcMeasuredPumpsSpeed( CONCENTRATE_PUMPS_T pumpId, U16 pulseWidthCount ) { - //if ( ( concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].execState != CONCENTRATE_PUMP_OFF_STATE ) && - // ( concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].execState != CONCENTRATE_PUMP_OFF_STATE ) ) - if ( TRUE ) - { - F32 pulseWidthInMicroSeconds = (F32)pulseWidthCount * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION; - BOOL isPulseWidthOut = ( pulseWidthInMicroSeconds <= (F32)CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ? TRUE : FALSE ); - concentratePumps[ pumpId ].pulseWidthUS = pulseWidthInMicroSeconds; + F32 pulseWidthInMicroSeconds = (F32)pulseWidthCount * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION; + BOOL isPulseWidthOut = ( pulseWidthInMicroSeconds <= (F32)CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ? TRUE : FALSE ); + concentratePumps[ pumpId ].pulseWidthUS = pulseWidthInMicroSeconds; - checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, isPulseWidthOut, pulseWidthInMicroSeconds, - CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ); + checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, isPulseWidthOut, pulseWidthInMicroSeconds, + CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ); - if ( FALSE == isPulseWidthOut ) - { - concentratePumps[ pumpId ].measuredPumpSpeed.data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; - } - } - /*else + if ( FALSE == isPulseWidthOut ) { - // Clear the alarm condition - checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, FALSE, 0, CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ); - }*/ + concentratePumps[ pumpId ].measuredPumpSpeed.data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; + } if ( CONCENTRATE_PUMP_ZERO_FLOW_RATE == pulseWidthCount ) { concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0; } } +/*********************************************************************//** + * @brief + * The monitorPumpSpeed function monitors the concentrate pumps speed and + * triggers the alarms if they are out of range. + * @details Inputs: concentratePumps + * @details Outputs: none + * @param pumpId pump id to set step speed + * @param alarm which the corresponding alarm of the concentrate pump + * @return none + *************************************************************************/ +static void monitorPumpSpeed( CONCENTRATE_PUMPS_T pumpId, ALARM_ID_T alarm ) +{ + F32 cpTargetSpeed = concentratePumps[ pumpId ].pumpTargetSpeed; + F32 cpError = fabs( getMeasuredPumpSpeed( pumpId ) - cpTargetSpeed ); + BOOL isCpSpeedOut = FALSE; + if ( concentratePumps[ pumpId ].execState != CONCENTRATE_PUMP_OFF_STATE ) + { + // Check if the pump is not in the off state and if it is not, divide the error + // to target speed. If the pump is off the target speed is 0 + cpError = cpError / cpTargetSpeed; + } + + isCpSpeedOut = ( cpError > CONCENTRATE_PUMP_ERROR_TOLERANCE ? TRUE : FALSE ); + + checkPersistentAlarm( alarm, isCpSpeedOut, cpError, CONCENTRATE_PUMP_ERROR_TOLERANCE ); +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/