Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r573a26b2a0273a4983b1de1cbff5bed63e01dce0 -re3ea1f5251b7a7af6e47b9e013c3cfc11466e255 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 573a26b2a0273a4983b1de1cbff5bed63e01dce0) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision e3ea1f5251b7a7af6e47b9e013c3cfc11466e255) @@ -37,7 +37,8 @@ #define CONCENTRATE_PUMP_RAMP_SPEED_INCREMENT 10.0F ///< Speed increase (mL/min) when controlling concentrate pump to target step speed. #define CONCENTRATE_PUMP_MIN_SPEED 3.0F ///< Minimum speed for concentrate pump in mL per min. -#define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_ON_PCT 0.02F ///< Concentrate pump speed out of range tolerance when on in percentage. +#define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_ON_PCT 0.01F ///< Concentrate pump speed out of range tolerance when on in percentage. +#define CONCENTRATE_PUMP_CLEANING_SPD_OUT_OF_RANGE_TOL_PCT 0.05F ///< Concentrate pump cleaning mode speed out of range tolerance when on in percentage. #define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_SLOW_MLPM 1.0F ///< Concentrate pump speed out of range tolerance when slow in mL/min. #define CONCENTRATE_PUMP_LOW_SPEED_THRESHOLD_MLPM 10.0F ///< Concentrate pump low speed threshold in mL/min. #define CONCENTRATE_PUMP_ZERO_FLOW_RATE 0xFFFF ///< Pulse width value when zero flow rate or pump is off. @@ -140,6 +141,7 @@ static U32 concentratePumpMonitorTimerCounter; ///< Timer counter to perform monitor on concentrate pump. static BOOL acidConcentratePumpParkPersistenceClear; ///< Boolean acid park persistence clearing. static BOOL bicarbConcentratePumpParkPersistenceClear; ///< Boolean for bicarb park persistence clearing. +static BOOL ufPumpParkPersistenceClear; ///< Boolean for UF pump park persistence clearing. /// Concentrate pump data publish interval. static OVERRIDE_U32_T concentratePumpDataPublishInterval = { CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL, CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL, 0, 0 }; @@ -186,6 +188,7 @@ concentratePumpMonitorTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; acidConcentratePumpParkPersistenceClear = FALSE; bicarbConcentratePumpParkPersistenceClear = FALSE; + ufPumpParkPersistenceClear = FALSE; for ( pumpId = CONCENTRATEPUMPS_FIRST; pumpId < NUM_OF_CONCENTRATE_PUMPS; pumpId++ ) { @@ -229,7 +232,7 @@ initPersistentAlarm( ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); - //TODO: UF pump park bits to be defined in HDD and then will handle UF pump alarm later + initPersistentAlarm( ALARM_ID_DD_D76_PUMP_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DD_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_DD_CONCENTRATE_PUMP_FAULT, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD ); } @@ -248,6 +251,9 @@ U08 fpgaConcPumpsFault = getFPGAConcentratePumpsFault(); BOOL isConcPumpFault = ( fpgaConcPumpsFault > 0 ? TRUE : FALSE ); + //Update UF pump speed fault + fpgaConcPumpsFault |= getFPGAUFPumpFault(); + // Check if a new calibration is available // if ( TRUE == isNewCalibrationRecordAvailable() ) // { @@ -272,6 +278,7 @@ //Monitor Pump Speed monitorPumpSpeed( D11_PUMP, ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR ); monitorPumpSpeed( D10_PUMP, ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR ); + monitorPumpSpeed( D76_PUMP, ALARM_ID_DD_D76_PUMP_SPEED_CONTROL_ERROR ); checkPersistentAlarm( ALARM_ID_DD_CONCENTRATE_PUMP_FAULT, isConcPumpFault, fpgaConcPumpsFault, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD ); @@ -285,16 +292,17 @@ * and associated fault handling. * @details \b Inputs: Park status * @details \b Outputs: isConcPumpParkInProgress,acidConcentratePumpParkPersistenceClear - * bicarbConcentratePumpParkPersistenceClear + * bicarbConcentratePumpParkPersistenceClear,ufPumpParkPersistenceClear * @return none *************************************************************************/ static void monitorPumpParkStatus( void ) { parked[ D11_PUMP ].data = (U32)getFPGAD11PumpIsParked(); parked[ D10_PUMP ].data = (U32)getFPGAD10PumpIsParked(); + parked[ D76_PUMP ].data = (U32)getFPGAD76PumpIsParked(); parkFaulted[ D11_PUMP ].data = (U32)getFPGAD11PumpParkFault(); parkFaulted[ D10_PUMP ].data = (U32)getFPGAD10PumpParkFault(); - // TODO : Handle UF Pump Park alarms once HDD updated with the details. + parkFaulted[ D76_PUMP ].data = (U32)getFPGAD76PumpParkFault(); if ( ( TRUE == getConcPumpIsParked( D11_PUMP ) ) || ( TRUE == getConcPumpParkIsFaulted( D11_PUMP ) ) ) { @@ -305,6 +313,10 @@ { concentratePumps[ D10_PUMP ].isConcPumpParkInProgress = FALSE; } + if ( ( TRUE == getConcPumpIsParked( D76_PUMP ) ) || ( TRUE == getConcPumpParkIsFaulted( D76_PUMP ) ) ) + { + concentratePumps[ D76_PUMP ].isConcPumpParkInProgress = FALSE; + } // Don't monitor persistence for cp speed alarms if we are parked. if ( TRUE == acidConcentratePumpParkPersistenceClear ) @@ -332,6 +344,19 @@ resetPersistentAlarmTimer( ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR ); } } + + if ( TRUE == ufPumpParkPersistenceClear ) + { + // Clear flag and resume persistence checking once park bit is set. + if ( TRUE == getConcPumpIsParked( D76_PUMP ) ) + { + ufPumpParkPersistenceClear = FALSE; + } + else + { + resetPersistentAlarmTimer( ALARM_ID_DD_D76_PUMP_SPEED_CONTROL_ERROR ); + } + } } /*********************************************************************//** @@ -404,7 +429,7 @@ * the concentrate pumps. * @details \b Inputs: none * @details \b Outputs: concentratePumps[],acidConcentratePumpParkPersistenceClear, - * bicarbConcentratePumpParkPersistenceClear + * bicarbConcentratePumpParkPersistenceClear, ufPumpParkPersistenceClear * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid pump ID is seen. * @param pumpId concentrate pump id * @return none @@ -416,6 +441,7 @@ concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = TRUE; acidConcentratePumpParkPersistenceClear = FALSE; bicarbConcentratePumpParkPersistenceClear = FALSE; + ufPumpParkPersistenceClear = FALSE; } else { @@ -875,8 +901,8 @@ } else { - //TODO: Need to evaluate park support in the new pump. setFPGAD76PumpParkCmd(); + ufPumpParkPersistenceClear = TRUE; } concentratePumps[ pumpId ].isConcPumpParkInProgress = TRUE; } @@ -1142,23 +1168,33 @@ * between requested and measured is not in range. * @details \b Alarm: ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR when the speed difference * between requested and measured is not in range. + * @details \b Alarm: ALARM_ID_DD_D76_PUMP_SPEED_CONTROL_ERROR when the speed difference + * between requested and measured is not in range. * @param pumpId pump id to check the difference between requested and measured 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 ].currentPumpSpeed; - F32 cpError = fabs( fabs( getMeasuredPumpSpeedMLPM( pumpId ) ) - cpTargetSpeed ); - BOOL isCpSpeedOut = FALSE; - F32 tolerance = CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_SLOW_MLPM; + F32 cpTargetSpeed = fabs( concentratePumps[ pumpId ].currentPumpSpeed ); + F32 cpMeasSpeed = fabs( getMeasuredPumpSpeedMLPM( pumpId ) ); + F32 cpError = fabs( cpMeasSpeed - cpTargetSpeed ); + BOOL isCpSpeedOut = FALSE; + F32 tolerance = CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_SLOW_MLPM; + DD_OP_MODE_T opMode = getCurrentOperationMode(); if ( cpTargetSpeed > CONCENTRATE_PUMP_LOW_SPEED_THRESHOLD_MLPM ) { // Check if the pump is not in the off state and if it is not and greater than the minimum threshold, divide the error // to target speed. If the pump is off the target speed is 0 so the speed check is done differently + // The speed tolerance is looser in heat disinfect and flush than the rest of the modes that the concentrate pump are running. cpError = cpError / cpTargetSpeed; tolerance = CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_ON_PCT; + + if ( DD_MODE_HEAT == opMode ) + { + tolerance = CONCENTRATE_PUMP_CLEANING_SPD_OUT_OF_RANGE_TOL_PCT; + } } isCpSpeedOut = ( cpError > tolerance ? TRUE : FALSE ); Index: firmware/App/Services/FpgaDD.c =================================================================== diff -u -r333e2d0c0462dcb4343a279420949cce716ebab7 -re3ea1f5251b7a7af6e47b9e013c3cfc11466e255 --- firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision 333e2d0c0462dcb4343a279420949cce716ebab7) +++ firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision e3ea1f5251b7a7af6e47b9e013c3cfc11466e255) @@ -79,6 +79,10 @@ #define CONCENTRATE_CAP_SWITCH_MASK 0x10 ///< Concentrate cap switch bit mask. #define FPGA_CONC_PUMP_FAULT_BITS 0x03 ///< Concentrate pump fault bits mask. +#define UF_PUMP_FAULT_SHIFT 0x02 ///< Shift UF pump fault while reading, to account other dosing pumps fault. +#define FPGA_UF_PUMP_FAULT_BIT 0x00 ///< UF pump fault bit mask. +#define FPGA_UF_PUMP_PARKED_BIT 0x01 ///< UF pump parked status bit mask. +#define FPGA_UF_PUMP_PARK_FAULT_BIT 0x02 ///< UF pump park fault status bit mask. #define FPGA_D11_PUMP_PARKED_BIT 0x04 ///< Acid Concentrate pump parked status bit mask. #define FPGA_D10_PUMP_PARKED_BIT 0x10 ///< Bicarb Concentrate pump parked status bit mask. #define FPGA_D11_PUMP_PARK_FAULT_BIT 0x08 ///< Acid Concentrate pump park fault status bit mask. @@ -247,12 +251,13 @@ U16 fpgaD48PumpSpeedFeedback; ///< Reg 442. D48 Pump Speed feedback U16 fpgaD76PumpHallSense; ///< Reg 444. UF D76_Pump hall sensor pulse width U16 fpgaD76PumpStepCountStatus; ///< Reg 446. UF pump revolution down count status + U08 fpgaD76PumpFault; ///< Reg 448: UF pump fault - U32 fpgaD74CondDataOut; ///< Reg 448. Data read from Conductivity Sensor D74 register - U16 fpgaD74CondCond; ///< Reg 452. D74 conductivity - U16 fpgaD74CondTemp; ///< Reg 454. D74 Temperature - U08 fpgaD74CondReadCnt; ///< Reg 456. D74 successful read count - U08 fpgaD74CondErrorCnt; ///< Reg 457. D74 error read count + U32 fpgaD74CondDataOut; ///< Reg 449. Data read from Conductivity Sensor D74 register + U16 fpgaD74CondCond; ///< Reg 453. D74 conductivity + U16 fpgaD74CondTemp; ///< Reg 455. D74 Temperature + U08 fpgaD74CondReadCnt; ///< Reg 457. D74 successful read count + U08 fpgaD74CondErrorCnt; ///< Reg 458. D74 error read count } DD_FPGA_SENSORS_T; typedef struct @@ -1879,6 +1884,51 @@ /*********************************************************************//** * @brief + * The getFPGAUFPumpFault function gets UF pumps fault + * reported by FGPA. + * @details \b Inputs: fpgaSensorReadings.fpgaD76PumpFault + * @details \b Outputs: none + * @return Latest UF pumps fault value + *************************************************************************/ +U08 getFPGAUFPumpFault( void ) +{ + return ( ( fpgaSensorReadings.fpgaD76PumpFault & FPGA_UF_PUMP_FAULT_BIT ) << UF_PUMP_FAULT_SHIFT ); +} + +/*********************************************************************//** + * @brief + * The getFPGAD76PumpIsParked function gets whether the UF pump is currently + * parked. + * @details \b Inputs: fpgaSensorReadings.fpgaD76PumpFault + * @details \b Outputs: none + * @return TRUE if UF pump is parked, FALSE if not + *************************************************************************/ +BOOL getFPGAD76PumpIsParked( void ) +{ + U08 mask = fpgaSensorReadings.fpgaD76PumpFault & FPGA_UF_PUMP_PARKED_BIT; + BOOL result = ( mask > 0 ? TRUE : FALSE ); + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGAD76PumpParkFault function gets whether the UF pump park command + * has faulted. + * @details \b Inputs: fpgaSensorReadings.fpgaD76PumpFault + * @details \b Outputs: none + * @return TRUE if UF pump park command faulted, FALSE if not + *************************************************************************/ +BOOL getFPGAD76PumpParkFault( void ) +{ + U08 mask = fpgaSensorReadings.fpgaD76PumpFault & FPGA_UF_PUMP_PARK_FAULT_BIT; + BOOL result = ( mask > 0 ? TRUE : FALSE ); + + return result; +} + +/*********************************************************************//** + * @brief * The getFPGAConcentratePumpsFault function gets concentrate pumps fault * reported by FGPA. * @details \b Inputs: fpgaSensorReadings.fpgaD11_D10_PumpFault Index: firmware/App/Services/FpgaDD.h =================================================================== diff -u -r3cc784af591b14e5d292f92c796db70bcbd5a40b -re3ea1f5251b7a7af6e47b9e013c3cfc11466e255 --- firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision 3cc784af591b14e5d292f92c796db70bcbd5a40b) +++ firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision e3ea1f5251b7a7af6e47b9e013c3cfc11466e255) @@ -137,7 +137,7 @@ U16 getFPGAD74CondTemp( void ); U32 getFPGAD74CondData( void ); -// Pumps (Concentrate and Gear pumps ) +// Pumps (Dosing and Gear pumps ) void setFPGAD11PumpSetStepSpeed( U16 stepSpeed ); void setFPGAD10PumpSetStepSpeed( U16 stepSpeed ); void setFPGAD76PumpSetStepSpeed( U16 stepSpeed ); @@ -154,7 +154,9 @@ U08 getFPGAD11PumpControlStatus( void ); U08 getFPGAD10PumpControlStatus( void ); U08 getFPGAD76PumpControlStatus( void ); -//TODO : UF pump park yet to defined in HDD +U08 getFPGAUFPumpFault( void ); +BOOL getFPGAD76PumpParkFault( void ); +BOOL getFPGAD76PumpIsParked( void ); U08 getFPGAConcentratePumpsFault( void ); BOOL getFPGAD11PumpIsParked( void ); BOOL getFPGAD10PumpIsParked( void );