Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -rb43c9f8a4e0338eed6c2f4b48740fc60d74deeb6 -red39129abdca4ec343369d83494530b23621e052 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision b43c9f8a4e0338eed6c2f4b48740fc60d74deeb6) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision ed39129abdca4ec343369d83494530b23621e052) @@ -35,22 +35,32 @@ #define CONCENTRATE_PUMP_FORWARD_DIR 0x1 ///< Concentrate pump forward direction configuration. #define CONCENTRATE_PUMP_REVERSE_DIR 0x0 ///< Concentrate pump reverse direction configuration. -#define CONCENTRATE_PUMP_SPEED_INCREMENT 2.0F ///< Speed increase (mL/min) when controlling concentrate pump to target step speed. -#define CONCENTRATE_PUMP_MIN_SPEED 0.1F ///< Minimum speed for concentrate pump in mL per min. +#define CONCENTRATE_PUMP_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_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. - +#ifndef __PUMPTEST__ #define CONCENTRATE_PUMP_VOLUME_PER_REV 0.1F ///< Volume output every revolution (mL). +#else +#define PISTON_PUMP_STEPS_PER_ML 342.0F ///< Revolution count for 1ml volume delivery. +#define CONCENTRATE_PUMP_VOLUME_PER_REV ( CONCENTRATE_PUMP_STEP_PER_REV / PISTON_PUMP_STEPS_PER_ML ) ///< Volume output every revolution (mL). +#endif #define CONCENTRATE_PUMP_PULSE_PER_REV 2.0F ///< Number of pulses generate for every revolution. #define CONCENTRATE_PUMP_STEP_PER_REV 200.0F ///< Number of steps for every revolution. #define CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION 100.0F ///< Hall sense period resolution in microseconds. #define CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT 1000 ///< Hall sensors minimum allowed value. #define CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS ( 5 * MS_PER_SECOND ) ///< Hall sensors out of range time in milliseconds. #define CONCENTRATE_PUMP_MICRO_STEPS_PER_STEP 8.0F ///< Number of micro-steps ( fractions of step) per step. -#define CONCENTRATE_PUMP_STEP_PERIOD_RESOLUTION ( 0.25F / ( US_PER_SECOND * SEC_PER_MIN ) ) ///< Convert step period resolution (0.25 us) to minute. +#define CONCENTRATE_PUMP_VOLUME_TO_REVOLUTION ( ( 1 / CONCENTRATE_PUMP_VOLUME_PER_REV ) * \ + ( CONCENTRATE_PUMP_STEP_PER_REV * \ + CONCENTRATE_PUMP_MICRO_STEPS_PER_STEP ) ) ///< Convert volume in to number of revolutions needed. +#ifdef __PUMPTEST__ +#define PISTON_PUMP_VOLUME_TO_REVOLUTION ( PISTON_PUMP_STEPS_PER_ML * CONCENTRATE_PUMP_MICRO_STEPS_PER_STEP ) ///< Convert volume in to number of revolutions needed. +#endif +#define CONCENTRATE_PUMP_STEP_PERIOD_RESOLUTION ( 0.50F / ( US_PER_SECOND * SEC_PER_MIN ) ) ///< Convert step period resolution (0.50 us) to minute. /// Volume output per pulse. #define CONCENTRATE_PUMP_VOLUME_PER_PULSE ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_PULSE_PER_REV ) @@ -64,7 +74,7 @@ #define DATA_PUBLISH_COUNTER_START_COUNT 0 ///< Data publish counter start count. #define CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD 500 ///< Concentrate pump fault persistence period in milliseconds. -#define CONCENTRATE_PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD_MLPM 5.0F ///< Concentrate pump transition to ramp to target speed threshold in mL/min. +#define CONCENTRATE_PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD_MLPM 20.0F ///< Concentrate pump transition to ramp to target speed threshold in mL/min. #define CONCENTRATE_PUMP_CONTROL_EIGHTH_STEP 0x07 ///< Concentrate pump control 1/8th step. #define CONCENTRATE_PUMP_CONTROL_REVERSE_DIR 0x00 ///< Concentrate pump control reverse direction. @@ -73,7 +83,9 @@ #define CONCENTRATE_PUMP_CONTROL_DISABLE 0x01 ///< Concentrate pump control disable pump. #define CONCENTRATE_PUMP_CONTROL_NOT_RESET 0x20 ///< Concentrate pump control not reset. #define CONCENTRATE_PUMP_CONTROL_SLEEP_OFF 0x40 ///< Concentrate pump control sleep off. +#define CONCENTRATE_PUMP_CONTROL_ENABLE_MASK 0x10 ///< Concentrate pump control enable bit mask. + static const U32 CONCENTRATE_PUMP_CONTROL_FORWARD = CONCENTRATE_PUMP_CONTROL_SLEEP_OFF | CONCENTRATE_PUMP_CONTROL_NOT_RESET | CONCENTRATE_PUMP_CONTROL_ENABLE | @@ -102,16 +114,11 @@ 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. - OVERRIDE_U32_T hasParkBeenRequested; ///< Flag indicates a request to park the pump. - OVERRIDE_F32_T 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. - OVERRIDE_U32_T parked; ///< Concentrate pump is currently parked (T/F). - OVERRIDE_U32_T parkFaulted; ///< Concentrate pump park command has faulted (T/F). BOOL isConcPumpParkInProgress; ///< Concentrate pump park progress boolean flag (T/F). } CONCENTRATE_PUMP_T; @@ -121,6 +128,7 @@ U32 pumpID; ///< Concentrate pump ID (0:Acid ,1:Bicarb) U32 startStop; ///< Concentrate pump start:1,stop :0. F32 speed; ///< Speed range from 0.1 ml/min to 48.0 ml/min. + F32 volume; ///< Target volume in ml } CONC_PUMP_START_STOP_CMD_PAYLOAD_T; // ********** private data ********** @@ -133,6 +141,14 @@ static OVERRIDE_U32_T concentratePumpDataPublishInterval = { CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL, CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL, 0, 0 }; static CONCENTRATE_PUMP_T concentratePumps[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Array of concentrate pumps' data structure. +static OVERRIDE_U32_T hasParkBeenRequested[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Flag indicates a request to park the pump. +static OVERRIDE_F32_T pumpTargetSpeed[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Target concentrate pumps' speed (mL/min). +static OVERRIDE_U32_T pumpTargetRevCnt[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Target concentrate pump revolution count +static OVERRIDE_U32_T pumpMesauredRevCnt[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Current measured concentrate pump revolution count +static OVERRIDE_F32_T measuredPumpSpeed[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Measured concentrate pump speed (mL/min). +static OVERRIDE_U32_T parked[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Concentrate pump is currently parked (T/F). +static OVERRIDE_U32_T parkFaulted[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Concentrate pump park command has faulted (T/F). + //static DD_ACID_CONCENTRATES_RECORD_T acidConcentrateCalRecord; ///< Acid concentrate calibration record. //static DD_BICARB_CONCENTRATES_RECORD_T bicarbConcentrateCalRecord; ///< Bicarb concentrate calibration record. //static DD_CONC_PUMPS_CAL_RECORD_T concentratePumpsCalRecord; ///< Concentrate pumps calibration record. @@ -164,29 +180,47 @@ acidConcentratePumpParkPersistenceClear = FALSE; bicarbConcentratePumpParkPersistenceClear = FALSE; - for ( pumpId = CONCENTRATEPUMPS_CP1_ACID; pumpId < NUM_OF_CONCENTRATE_PUMPS; pumpId++ ) + for ( pumpId = CONCENTRATEPUMPS_FIRST; pumpId < NUM_OF_CONCENTRATE_PUMPS; pumpId++ ) { concentratePumps[ pumpId ].controlTimerCounter = 0; concentratePumps[ pumpId ].execState = CONCENTRATE_PUMP_OFF_STATE; - concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0F; - concentratePumps[ pumpId ].measuredPumpSpeed.ovInitData = 0.0F; + measuredPumpSpeed[ pumpId ].data = 0.0F; + measuredPumpSpeed[ pumpId ].ovInitData = 0.0F; + measuredPumpSpeed[ pumpId ].ovData = 0.0F; + measuredPumpSpeed[ pumpId ].override = OVERRIDE_RESET; concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; - concentratePumps[ pumpId ].hasParkBeenRequested.data = FALSE; - concentratePumps[ pumpId ].hasParkBeenRequested.ovInitData = FALSE; - concentratePumps[ pumpId ].parked.data = FALSE; - concentratePumps[ pumpId ].parked.ovInitData = FALSE; - concentratePumps[ pumpId ].parkFaulted.data = FALSE; - concentratePumps[ pumpId ].parkFaulted.ovInitData = FALSE; - concentratePumps[ pumpId ].pumpTargetSpeed.data = 0.0F; - concentratePumps[ pumpId ].pumpTargetSpeed.ovInitData = 0.0F; + hasParkBeenRequested[ pumpId ].data = FALSE; + hasParkBeenRequested[ pumpId ].ovInitData = FALSE; + hasParkBeenRequested[ pumpId ].ovData = FALSE; + hasParkBeenRequested[ pumpId ].override = OVERRIDE_RESET; + parked[ pumpId ].data = FALSE; + parked[ pumpId ].ovInitData = FALSE; + parked[ pumpId ].ovData = FALSE; + parked[ pumpId ].override = OVERRIDE_RESET; + parkFaulted[ pumpId ].data = FALSE; + parkFaulted[ pumpId ].ovInitData = FALSE; + parkFaulted[ pumpId ].ovData = FALSE; + parkFaulted[ pumpId ].override = OVERRIDE_RESET; + pumpTargetSpeed[ pumpId ].data = 0.0F; + pumpTargetSpeed[ pumpId ].ovInitData = 0.0F; + pumpTargetSpeed[ pumpId ].ovData = 0.0F; + pumpTargetSpeed[ pumpId ].override = OVERRIDE_RESET; + pumpTargetRevCnt[ pumpId ].data = 0; + pumpTargetRevCnt[ pumpId ].ovInitData = 0; + pumpTargetRevCnt[ pumpId ].ovData = 0; + pumpTargetRevCnt[ pumpId ].override = OVERRIDE_RESET; + pumpMesauredRevCnt[ pumpId ].data = 0; + pumpMesauredRevCnt[ pumpId ].ovInitData = 0; + pumpMesauredRevCnt[ pumpId ].ovData = 0; + pumpMesauredRevCnt[ pumpId ].override = OVERRIDE_RESET; concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_FORWARD; concentratePumps[ pumpId ].isConcPumpParkInProgress = FALSE; stopConcentratePump( pumpId ); } - initPersistentAlarm( ALARM_ID_DD_CP1_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DD_CP2_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); + 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 ); 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 ); } @@ -218,50 +252,53 @@ // Calculate pump speed for each defined pump calcMeasuredPumpsSpeed(); - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parked.data = (U32)getFPGAAcidPumpIsParked(); - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parked.data = (U32)getFPGABicarbPumpIsParked(); - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parkFaulted.data = (U32)getFPGAAcidPumpParkFault(); - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parkFaulted.data = (U32)getFPGABicarbPumpParkFault(); + parked[ D11_PUMP ].data = (U32)getFPGAD11PumpIsParked(); + parked[ D10_PUMP ].data = (U32)getFPGAD10PumpIsParked(); + parkFaulted[ D11_PUMP ].data = (U32)getFPGAD11PumpParkFault(); + parkFaulted[ D10_PUMP ].data = (U32)getFPGAD10PumpParkFault(); - if ( ( TRUE == getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ) ) || ( TRUE == getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ) ) ) + pumpMesauredRevCnt[ D11_PUMP ].data = (U32)getFPGAD11PumpRevolutionCountStatus(); + pumpMesauredRevCnt[ D10_PUMP ].data = (U32)getFPGAD10PumpRevolutionCountStatus(); + + if ( ( TRUE == getConcPumpIsParked( D11_PUMP ) ) || ( TRUE == getConcPumpParkIsFaulted( D11_PUMP ) ) ) { // If the pump has parked or faulted during the park, then it is not in progress - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].isConcPumpParkInProgress = FALSE; + concentratePumps[ D11_PUMP ].isConcPumpParkInProgress = FALSE; } - if ( ( TRUE == getConcPumpIsParked( CONCENTRATEPUMPS_CP2_BICARB ) ) || ( TRUE == getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP2_BICARB ) ) ) + if ( ( TRUE == getConcPumpIsParked( D10_PUMP ) ) || ( TRUE == getConcPumpParkIsFaulted( D10_PUMP ) ) ) { - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].isConcPumpParkInProgress = FALSE; + concentratePumps[ D10_PUMP ].isConcPumpParkInProgress = FALSE; } // Don't monitor persistence for cp speed alarms if we are parked. if ( TRUE == acidConcentratePumpParkPersistenceClear ) { // Clear flag and resume persistence checking once park bit is set. - if ( TRUE == getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ) ) + if ( TRUE == getConcPumpIsParked( D11_PUMP ) ) { acidConcentratePumpParkPersistenceClear = FALSE; } else { - resetPersistentAlarmTimer( ALARM_ID_DD_CP1_SPEED_CONTROL_ERROR ); + resetPersistentAlarmTimer( ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR ); } } if ( TRUE == bicarbConcentratePumpParkPersistenceClear ) { // Clear flag and resume persistence checking once park bit is set. - if ( TRUE == getConcPumpIsParked( CONCENTRATEPUMPS_CP2_BICARB ) ) + if ( TRUE == getConcPumpIsParked( D10_PUMP ) ) { bicarbConcentratePumpParkPersistenceClear = FALSE; } else { - resetPersistentAlarmTimer( ALARM_ID_DD_CP2_SPEED_CONTROL_ERROR ); + resetPersistentAlarmTimer( ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR ); } } - monitorPumpSpeed( CONCENTRATEPUMPS_CP1_ACID, ALARM_ID_DD_CP1_SPEED_CONTROL_ERROR ); - monitorPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB, ALARM_ID_DD_CP2_SPEED_CONTROL_ERROR ); + monitorPumpSpeed( D11_PUMP, ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR ); + monitorPumpSpeed( D10_PUMP, ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR ); checkPersistentAlarm( ALARM_ID_DD_CONCENTRATE_PUMP_FAULT, isConcPumpFault, fpgaConcPumpsFault, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD ); @@ -374,14 +411,14 @@ DD_OP_MODE_T opMode = getCurrentOperationMode(); // pumps should be not ON and DD operation mode is not in fault mode - if ( ( concentratePumps[CONCENTRATEPUMPS_CP1_ACID].execState == CONCENTRATE_PUMP_OFF_STATE ) && - ( concentratePumps[CONCENTRATEPUMPS_CP2_BICARB].execState == CONCENTRATE_PUMP_OFF_STATE ) && + if ( ( concentratePumps[D11_PUMP].execState == CONCENTRATE_PUMP_OFF_STATE ) && + ( concentratePumps[D10_PUMP].execState == CONCENTRATE_PUMP_OFF_STATE ) && //( DD_MODE_FILL != opMode ) && ( DD_MODE_FAUL != opMode ) ) { // Park concentrate pump - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, PARK_CONC_PUMPS ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, PARK_CONC_PUMPS ); + requestConcentratePumpOff( D11_PUMP, PARK_CONC_PUMPS ); + requestConcentratePumpOff( D10_PUMP, PARK_CONC_PUMPS ); result = TRUE; } @@ -430,8 +467,7 @@ if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; - concentratePumps[ pumpId ].hasParkBeenRequested.data = park; - concentratePumps[ pumpId ].pumpTargetSpeed.data = 0.0F; + hasParkBeenRequested[ pumpId ].data = park; } else { @@ -450,7 +486,7 @@ * @param targetSpeed_ml_min target speed in mL/min * @return none *************************************************************************/ -void setConcentratePumpTargetSpeed( CONCENTRATE_PUMPS_T pumpId, F32 targetSpeed_ml_min ) +void setConcentratePumpTargetSpeed( CONCENTRATE_PUMPS_T pumpId, F32 targetSpeed_ml_min, F32 targetVolume_ml ) { if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { @@ -466,22 +502,40 @@ targetSpeed_ml_min *= -1.0; } + //Update target revolution count + if ( targetVolume_ml > 0.0 ) + { +#ifndef __PUMPTEST__ + pumpTargetRevCnt[ pumpId ].data = (U32)( targetVolume_ml * CONCENTRATE_PUMP_VOLUME_TO_REVOLUTION ); +#else + pumpTargetRevCnt[ pumpId ].data = (U32)( targetVolume_ml * PISTON_PUMP_VOLUME_TO_REVOLUTION ); +#endif + if ( D11_PUMP == pumpId ) + { + setFPGAD11PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); + } + else + { + setFPGAD10PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); + } + } + /* - * If 0.1 <= speed <= 48 set it - * If speed < 0.1 set to 0 + * If 3.0 <= speed <= 48 set it + * If speed < 3.0 set to 0 * else speed > 48 set to 48 */ if ( ( CONCENTRATE_PUMP_MIN_SPEED <= targetSpeed_ml_min ) && ( targetSpeed_ml_min <= CONCENTRATE_PUMP_MAX_SPEED ) ) { - concentratePumps[ pumpId ].pumpTargetSpeed.data = targetSpeed_ml_min; + pumpTargetSpeed[ pumpId ].data = targetSpeed_ml_min; } else if ( targetSpeed_ml_min < CONCENTRATE_PUMP_MIN_SPEED ) { - concentratePumps[ pumpId ].pumpTargetSpeed.data = 0.0; + pumpTargetSpeed[ pumpId ].data = 0.0; } else { - concentratePumps[ pumpId ].pumpTargetSpeed.data = CONCENTRATE_PUMP_MAX_SPEED; + pumpTargetSpeed[ pumpId ].data = CONCENTRATE_PUMP_MAX_SPEED; } } else @@ -532,7 +586,7 @@ if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { - speed = getF32OverrideValue( &concentratePumps[ pumpId ].pumpTargetSpeed ); + speed = getF32OverrideValue( &pumpTargetSpeed[ pumpId ] ); } else { @@ -561,7 +615,7 @@ if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { - speed = getF32OverrideValue( &concentratePumps[ pumpId ].measuredPumpSpeed ); + speed = getF32OverrideValue( &measuredPumpSpeed[ pumpId ] ); speed = ( CONCENTRATE_PUMP_REVERSE_DIR == concentratePumps[ pumpId ].direction ? speed * -1.0F : speed ); } else @@ -589,7 +643,7 @@ if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { - result = (BOOL)getU32OverrideValue( &concentratePumps[ pumpId ].hasParkBeenRequested ); + result = (BOOL)getU32OverrideValue( &hasParkBeenRequested[ pumpId ] ); } else { @@ -601,6 +655,58 @@ /*********************************************************************//** * @brief + * The getConcPumpTargetRevolutionCount function gets the concentrate pump + * target revolution count. + * @details \b Inputs: pumpTargetRevCnt + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid pump ID is seen. + * @param pumpId concentrate pump id to get target revolution count + * @return the target revolution count for the given concentrate pump + *************************************************************************/ +U16 getConcPumpTargetRevolutionCount( CONCENTRATE_PUMPS_T pumpId ) +{ + BOOL result = FALSE; + + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) + { + result = (U16)getU32OverrideValue( &pumpTargetRevCnt[ pumpId ] ); + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getConcPumpCurrentMeasuredRevolutionCount function gets the concentrate pump + * current measured revolution count. + * @details \b Inputs: pumpMesauredRevCnt + * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid pump ID is seen. + * @param pumpId concentrate pump id to get current measured revolution count + * @return the current revolution count for the given concentrate pump + *************************************************************************/ +U16 getConcPumpCurrentMeasuredRevolutionCount( CONCENTRATE_PUMPS_T pumpId ) +{ + BOOL result = FALSE; + + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) + { + result = (U16)getU32OverrideValue( &pumpMesauredRevCnt[ pumpId ] ); + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The getConcPumpIsParked function gets the current parked state for a * given pump. * @details \b Inputs: parked @@ -615,7 +721,7 @@ if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { - result = (BOOL)getU32OverrideValue( &concentratePumps[ pumpId ].parked ); + result = (BOOL)getU32OverrideValue( &parked[ pumpId ] ); } else { @@ -641,7 +747,7 @@ if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { - result = (BOOL)getU32OverrideValue( &concentratePumps[ pumpId ].parkFaulted ); + result = (BOOL)getU32OverrideValue( &parkFaulted[ pumpId ] ); } else { @@ -664,34 +770,43 @@ { BOOL parkPump = getConcPumpParkRequest( pumpId ); - concentratePumps[ pumpId ].hasParkBeenRequested.data = FALSE; // reset park request for next time + hasParkBeenRequested[ pumpId ].data = FALSE; // reset park request for next time + concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; // Just to make sure pump is in Off state. concentratePumps[ pumpId ].currentPumpSpeed = 0.0F; // set target rate to zero + pumpTargetSpeed[ pumpId ].data = 0.0F; + pumpTargetRevCnt[ pumpId ].data = 0; + // Disable the motor when stopping, to take next revolution count // Send zero rate command to stop the pump - if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) + if ( D11_PUMP == pumpId ) { - setFPGAAcidPumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); + setFPGAD11PumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); + //concentratePumps[ D11_PUMP ].controlSet |= CONCENTRATE_PUMP_CONTROL_ENABLE_MASK; + //setFPGAD11PumpControl( concentratePumps[ D11_PUMP ].controlSet ); } else { - setFPGABicarbSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); + setFPGAD10PumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); + //concentratePumps[ D10_PUMP ].controlSet |= CONCENTRATE_PUMP_CONTROL_ENABLE_MASK; + //setFPGAD10PumpControl( concentratePumps[ D10_PUMP ].controlSet ); } - +#ifndef __PUMPTEST__ // Park concentrate pump too if requested if ( TRUE == parkPump ) { - if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) + if ( D11_PUMP == pumpId ) { - setFPGAAcidPumpParkCmd(); + setFPGAD11PumpParkCmd(); acidConcentratePumpParkPersistenceClear = TRUE; } else { - setFPGABicarbPumpParkCmd(); + setFPGAD10PumpParkCmd(); bicarbConcentratePumpParkPersistenceClear = TRUE; } concentratePumps[ pumpId ].isConcPumpParkInProgress = TRUE; } +#endif } /*********************************************************************//** @@ -711,13 +826,13 @@ { U08 controlSet = concentratePumps[ pumpId ].controlSet; - if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) + if ( D11_PUMP == pumpId ) { - setFPGAAcidPumpControl( controlSet ); + setFPGAD11PumpControl( controlSet ); } else { - setFPGABicarbPumpControl( controlSet ); + setFPGAD10PumpControl( controlSet ); } state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; @@ -746,12 +861,14 @@ static CONCENTRATE_PUMP_STATE_T handleConcentratePumpRampToTargetSpeedState( CONCENTRATE_PUMPS_T pumpId ) { CONCENTRATE_PUMP_STATE_T state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; + //U16 currentMeasuredRev = getConcPumpCurrentMeasuredRevolutionCount( pumpId ); if ( TRUE == stepConcentratePumpToTargetSpeed( pumpId ) ) { state = CONCENTRATE_PUMP_CONTROL_TARGET_SPEED_STATE; } + //Stop the pump if measured rev count reaches zero if ( FALSE == concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested ) { state = CONCENTRATE_PUMP_OFF_STATE; @@ -774,6 +891,7 @@ static CONCENTRATE_PUMP_STATE_T handleConcentratePumpControlTargetSpeedState( CONCENTRATE_PUMPS_T pumpId ) { CONCENTRATE_PUMP_STATE_T state = CONCENTRATE_PUMP_CONTROL_TARGET_SPEED_STATE; + //U16 currentMeasuredRev = getConcPumpCurrentMeasuredRevolutionCount( pumpId ); F32 targetToCurreSpeedDiffMLPM = fabs( getPumpTargetSpeed( pumpId ) - concentratePumps[ pumpId ].currentPumpSpeed ); if ( ++concentratePumps[ pumpId ].controlTimerCounter >= CONCENTRATE_PUMP_CONTROL_INTERVAL ) @@ -790,6 +908,7 @@ state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; } + //Stop the pump if measured rev count reaches zero if ( FALSE == concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested ) { state = CONCENTRATE_PUMP_OFF_STATE; @@ -856,13 +975,13 @@ // Check if the control set bit is set as desired and if not, correct it checkConcentratePumpControlSet( pumpId ); - if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) + if ( D11_PUMP == pumpId ) { - setFPGAAcidPumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); + setFPGAD11PumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); } else { - setFPGABicarbSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); + setFPGAD10PumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); } return hasTgtBeenReached; @@ -893,12 +1012,12 @@ { switch ( pumpId ) { - case CONCENTRATEPUMPS_CP1_ACID: - pulseWidthCount = getFPGACPAHallSensePulseWidth(); + case D11_PUMP: + pulseWidthCount = getFPGAD11PumpHallSensePulseWidth(); break; - case CONCENTRATEPUMPS_CP2_BICARB: - pulseWidthCount = getFPGACPBHallSensePulseWidth(); + case D10_PUMP: + pulseWidthCount = getFPGAD10PumpHallSensePulseWidth(); break; #ifndef _VECTORCAST_ @@ -916,11 +1035,11 @@ // Determine measured speed for the pump if ( CONCENTRATE_PUMP_ZERO_FLOW_RATE == pulseWidthCount ) { - concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0F; + measuredPumpSpeed[ pumpId ].data = 0.0F; } else if ( FALSE == isPumpPulseWidthOut ) { - concentratePumps[ pumpId ].measuredPumpSpeed.data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; + measuredPumpSpeed[ pumpId ].data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; } // If pulse width is out of range capture pump out of range, pumpId and pulse width @@ -942,9 +1061,9 @@ * triggers the alarms if they are out of range. * @details \b Inputs: concentratePumps * @details \b Outputs: none - * @details \b Alarm: ALARM_ID_DD_CP1_SPEED_CONTROL_ERROR when the speed difference + * @details \b Alarm: ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR when the speed difference * between requested and measured is not in range. - * @details \b Alarm: ALARM_ID_DD_CP2_SPEED_CONTROL_ERROR when the speed difference + * @details \b Alarm: ALARM_ID_DD_D10_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 @@ -987,21 +1106,21 @@ switch ( pumpId ) { - case CONCENTRATEPUMPS_CP1_ACID: - controlSetBits = getFPGAAcidPumpControlStatus(); + case D11_PUMP: + controlSetBits = getFPGAD11PumpControlStatus(); if ( controlSetBits != concentratePumps[ pumpId ].controlSet ) { - setFPGAAcidPumpControl( concentratePumps[ pumpId ].controlSet ); + setFPGAD11PumpControl( concentratePumps[ pumpId ].controlSet ); } break; - case CONCENTRATEPUMPS_CP2_BICARB: - controlSetBits = getFPGABicarbPumpControlStatus(); + case D10_PUMP: + controlSetBits = getFPGAD10PumpControlStatus(); if ( controlSetBits != concentratePumps[ pumpId ].controlSet ) { - setFPGABicarbPumpControl( concentratePumps[ pumpId ].controlSet ); + setFPGAD10PumpControl( concentratePumps[ pumpId ].controlSet ); } break; @@ -1026,28 +1145,32 @@ { CONCENTRATE_PUMP_DATA_T data; - U08 cp1Direction = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].direction; - F32 cp1SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; - F32 cp1TgtSpeed = getPumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID ); - U08 cp2Direction = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].direction; - F32 cp2SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; - F32 cp2TgtSpeed = getPumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB ); + U08 d11_PumpDirection = concentratePumps[ D11_PUMP ].direction; + F32 d11_PumpSetSpeed = concentratePumps[ D11_PUMP ].currentPumpSpeed; + F32 d11_PumpTgtSpeed = getPumpTargetSpeed( D11_PUMP ); + U08 d10_PumpDirection = concentratePumps[ D10_PUMP ].direction; + F32 d10_PumpSetSpeed = concentratePumps[ D10_PUMP ].currentPumpSpeed; + F32 d10_PumpTgtSpeed = getPumpTargetSpeed( D10_PUMP ); // Use the above values to prepare the broadcast data - data.cp1CurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp1Direction ? cp1SetSpeed * -1.0F : cp1SetSpeed ); - data.cp1MeasuredSpeed = getMeasuredPumpSpeedMLPM( CONCENTRATEPUMPS_CP1_ACID ); - data.cp1TargetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp1Direction ? cp1TgtSpeed * -1.0F : cp1TgtSpeed ); - data.cp2CurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp2Direction ? cp2SetSpeed * -1.0F : cp2SetSpeed ); - data.cp2MeasuredSpeed = getMeasuredPumpSpeedMLPM( CONCENTRATEPUMPS_CP2_BICARB ); - data.cp2TargetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp2Direction ? cp2TgtSpeed * -1.0F : cp2TgtSpeed ); - data.cp1State = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].execState; - data.cp2State = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].execState; - data.cp1PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pulseWidthUS; - data.cp2PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pulseWidthUS; - data.cp1Parked = getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ); - data.cp2Parked = getConcPumpIsParked( CONCENTRATEPUMPS_CP2_BICARB ); - data.cp1ParkFault = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ); - data.cp2ParkFault = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP2_BICARB ); + data.d11_PumpCurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d11_PumpDirection ? d11_PumpSetSpeed * -1.0F : d11_PumpSetSpeed ); + data.d11_PumpMeasuredSpeed = getMeasuredPumpSpeedMLPM( D11_PUMP ); + data.d11_PumpTargetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d11_PumpDirection ? d11_PumpTgtSpeed * -1.0F : d11_PumpTgtSpeed ); + data.d10_PumpCurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d10_PumpDirection ? d10_PumpSetSpeed * -1.0F : d10_PumpSetSpeed ); + data.d10_PumpMeasuredSpeed = getMeasuredPumpSpeedMLPM( D10_PUMP ); + data.d10_PumpTargetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d10_PumpDirection ? d10_PumpTgtSpeed * -1.0F : d10_PumpTgtSpeed ); + data.d11_PumpTargetRevCount = (U32)getConcPumpTargetRevolutionCount( D11_PUMP ); + data.d11_PumpMeasuredRevCount= getFPGAD11PumpRevolutionCountStatus(); + data.d10_PumpTargetRevCount = (U32)getConcPumpTargetRevolutionCount( D10_PUMP ); + data.d11_PumpMeasuredRevCount= getFPGAD10PumpRevolutionCountStatus(); + data.d11_PumpState = concentratePumps[ D11_PUMP ].execState; + data.d10_PumpState = concentratePumps[ D10_PUMP ].execState; + data.d11_PumpPulseUS = concentratePumps[ D11_PUMP ].pulseWidthUS; + data.d10_PumpPulseUS = concentratePumps[ D10_PUMP ].pulseWidthUS; + data.d11_PumpParked = getConcPumpIsParked( D11_PUMP ); + data.d10_PumpParked = getConcPumpIsParked( D10_PUMP ); + data.d11_PumpParkFault = getConcPumpParkIsFaulted( D11_PUMP ); + data.d10_PumpParkFault = getConcPumpParkIsFaulted( D10_PUMP ); concentratePumpMonitorTimerCounter = 0; broadcastData( MSG_ID_DD_CONCENTRATE_PUMP_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( CONCENTRATE_PUMP_DATA_T ) ); @@ -1090,7 +1213,7 @@ *************************************************************************/ BOOL testConcentratePumpTargetSpeedOverride( MESSAGE_T *message ) { - BOOL result = f32ArrayOverride( message, &concentratePumps[0].pumpTargetSpeed, NUM_OF_CONCENTRATE_PUMPS - 1 ); + BOOL result = f32ArrayOverride( message, &pumpTargetSpeed[ 0 ], NUM_OF_CONCENTRATE_PUMPS - 1 ); return result; } @@ -1107,7 +1230,7 @@ *************************************************************************/ BOOL testConcentratePumpMeasuredSpeedOverride( MESSAGE_T *message ) { - BOOL result = f32ArrayOverride( message, &concentratePumps[0].measuredPumpSpeed, NUM_OF_CONCENTRATE_PUMPS - 1 ); + BOOL result = f32ArrayOverride( message, &measuredPumpSpeed[ 0 ], NUM_OF_CONCENTRATE_PUMPS - 1 ); return result; } @@ -1124,13 +1247,30 @@ *************************************************************************/ BOOL testConcentratePumpParkedOverride( MESSAGE_T *message ) { - BOOL result = u32ArrayOverride( message, &concentratePumps[0].parked, NUM_OF_CONCENTRATE_PUMPS - 1, FALSE, TRUE ); + BOOL result = u32ArrayOverride( message, &parked[ 0 ], NUM_OF_CONCENTRATE_PUMPS - 1, FALSE, TRUE ); return result; } /*********************************************************************//** * @brief + * The testConcentratePumpTargetRevCountOverride function overrides the + * target revolution count of given concentrate pump id. + * @details \b Inputs: none + * @details \b Outputs: pumpTargetRevCnt + * @param message Override message from Dialin which includes an ID of + * the pump to override and the target revolution count of the pump to. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testConcentratePumpTargetRevCountOverride( MESSAGE_T *message ) +{ + BOOL result = u32ArrayOverride( message, &pumpTargetRevCnt[ 0 ], NUM_OF_CONCENTRATE_PUMPS - 1, 0, 65535 ); + + return result; +} + +/*********************************************************************//** + * @brief * The testConcentratePumpParkCmdFaultedOverride function overrides the * park command fault status of given concentrate pump id. * @details \b Inputs: none @@ -1141,7 +1281,7 @@ *************************************************************************/ BOOL testConcentratePumpParkCmdFaultedOverride( MESSAGE_T *message ) { - BOOL result = u32ArrayOverride( message, &concentratePumps[0].parkFaulted, NUM_OF_CONCENTRATE_PUMPS - 1, FALSE, TRUE ); + BOOL result = u32ArrayOverride( message, &parkFaulted[ 0 ], NUM_OF_CONCENTRATE_PUMPS - 1, FALSE, TRUE ); return result; } @@ -1174,17 +1314,20 @@ { // Handle start command if ( ( TRUE == payload.startStop ) && - ( ( payload.speed >= CONCENTRATE_PUMP_MIN_SPEED ) && ( payload.speed <= CONCENTRATE_PUMP_MAX_SPEED ) ) ) +#ifndef __PUMPTEST__ + ( ( payload.speed >= CONCENTRATE_PUMP_MIN_SPEED ) && ( payload.speed <= CONCENTRATE_PUMP_MAX_SPEED ) ) && +#endif + ( payload.volume > 0.0 ) ) { - setConcentratePumpTargetSpeed( (CONCENTRATE_PUMPS_T)payload.pumpID, payload.speed ); + setConcentratePumpTargetSpeed( (CONCENTRATE_PUMPS_T)payload.pumpID, payload.speed, payload.volume ); requestConcentratePumpOn ( (CONCENTRATE_PUMPS_T)payload.pumpID ); result = TRUE; } //Handle stop command if ( FALSE == payload.startStop ) { - stopConcentratePump( (CONCENTRATE_PUMPS_T)payload.pumpID ); + requestConcentratePumpOff( (CONCENTRATE_PUMPS_T)payload.pumpID, FALSE ); result = TRUE; } } @@ -1222,10 +1365,10 @@ { U32 value = override.state.u32; - concentratePumps[ pumpId ].hasParkBeenRequested.ovData = value; - concentratePumps[ pumpId ].hasParkBeenRequested.override = OVERRIDE_KEY; + hasParkBeenRequested[ pumpId ].ovData = value; + hasParkBeenRequested[ pumpId ].override = OVERRIDE_KEY; - if ( TRUE == concentratePumps[ pumpId ].hasParkBeenRequested.ovData ) + if ( TRUE == hasParkBeenRequested[ pumpId ].ovData ) { // If pump is running, stop it w/ park option if ( TRUE == concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested ) @@ -1241,8 +1384,8 @@ } else { - concentratePumps[ pumpId ].hasParkBeenRequested.override = OVERRIDE_RESET; - concentratePumps[ pumpId ].hasParkBeenRequested.ovData = concentratePumps[ pumpId ].hasParkBeenRequested.ovInitData; + hasParkBeenRequested[ pumpId ].override = OVERRIDE_RESET; + hasParkBeenRequested[ pumpId ].ovData = hasParkBeenRequested[ pumpId ].ovInitData; } result = TRUE;