Index: firmware/App/Controllers/SubstitutionPump.c =================================================================== diff -u -r999e55125e62af895a8b2bed425c0a61eb887a0a -r43c231c0f9a56e2481f94cdbc51f45ef1af23c46 --- firmware/App/Controllers/SubstitutionPump.c (.../SubstitutionPump.c) (revision 999e55125e62af895a8b2bed425c0a61eb887a0a) +++ firmware/App/Controllers/SubstitutionPump.c (.../SubstitutionPump.c) (revision 43c231c0f9a56e2481f94cdbc51f45ef1af23c46) @@ -15,6 +15,8 @@ * ***************************************************************************/ +#include // For fabs() + #include "FpgaDD.h" #include "MessageSupport.h" #include "Messaging.h" @@ -57,6 +59,9 @@ #define SUBSTITUTION_PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD_MLPM 10.0F ///< Substitution pump transition to ramp to target speed threshold in mL/min. #define SUBSTITUTION_PUMP_RAMP_SPEED_INCREMENT 5.0F ///< Speed increase (mL/min) when controlling Substitution pump to target step speed. +#define SUBSTITUTION_PUMP_CNT_TO_RPM(cnt) ( 60 / ( cnt * 0.0001 ) ) ///< Conversion function for hall sensor cnt to rpm. rpm = 60/(cnt*100uS). +#define MAX_ALLOWED_ML_OUT_OF_RANGE 20 ///< Maximum allowed mL/min out of range from target ml/min in open loop. +#define RPM_OUT_OF_RANGE_TIME_OUT ( 5 * MS_PER_SECOND ) ///< Open loop RPM out of range time out in ms. static const U32 SUBSTITUTION_PUMP_CONTROL_FORWARD = SUBSTITUTION_PUMP_CONTROL_SLEEP_OFF | SUBSTITUTION_PUMP_CONTROL_NOT_RESET | @@ -90,6 +95,7 @@ U32 togglePeriodCount; ///< Converted pump speed (mL/min) to toggle period counts (0.5 uS increment counts per step). U08 direction; ///< Substitution pump motor direction. U08 controlSet; ///< Substitution pump control set. + F32 measuredPumpSpeed; ///< Substitution pump measured pump speed. } SUBSTITUTION_PUMP_T; /// Payload record structure for Substitution pump start/stop request @@ -143,6 +149,8 @@ substitutionPumpDataPublishInterval.ovInitData = SUBSTITUTION_PUMP_DATA_PUBLISH_INTERVAL; substitutionPumpDataPublishInterval.ovData = 0; substitutionPumpDataPublishInterval.override = OVERRIDE_RESET; + + initPersistentAlarm( ALARM_ID_DD_D92_PUMP_RPM_OUT_OF_RANGE, RPM_OUT_OF_RANGE_TIME_OUT, RPM_OUT_OF_RANGE_TIME_OUT ); } /*********************************************************************//** @@ -173,7 +181,7 @@ // The switch case is in a for loop so the default case cannot be covered in VectorCAST default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_EXEC_INVALID_STATE, pumpId ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_SUBSTITUTION_PUMP_EXEC_INVALID_STATE, pumpId ) substitutionPumps[ pumpId ].execState = SUBSTITUTION_PUMP_OFF_STATE; break; } @@ -185,6 +193,29 @@ /*********************************************************************//** * @brief + * The execSubstitutionPumpMonitor function executes the substitution pump monitor. + * @details \b Inputs: execState + * @details \b Outputs: execState + * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid pump state is seen. + * @return none + *************************************************************************/ +void execSubstitutionPumpMonitor( void ) +{ + F32 rpmDiff = 0.0; + BOOL isRPMOutOfRange = FALSE; + U32 d92SpeedCnt = getFPGAD92PumpHallSenseCount(); + F32 d92SpeedmLmin = SUBSTITUTION_PUMP_CNT_TO_RPM( d92SpeedCnt ) * SUBSTITUTION_PUMP_VOLUME_PER_REV; + + substitutionPumps[ D92_PUMP ].measuredPumpSpeed = d92SpeedmLmin; + rpmDiff = fabs( substitutionPumps[ D92_PUMP ].measuredPumpSpeed - substitutionPumps[ D92_PUMP ].currentPumpSpeed ); + + isRPMOutOfRange = ( rpmDiff > MAX_ALLOWED_ML_OUT_OF_RANGE ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_DD_D92_PUMP_RPM_OUT_OF_RANGE, isRPMOutOfRange, d92SpeedmLmin, MAX_ALLOWED_ML_OUT_OF_RANGE ); +} + +/*********************************************************************//** + * @brief * The handleSubstitutionPumpOffState function turns on a given substitution * pumps and switch to on state upon request. * @details \b Inputs: none @@ -375,7 +406,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_SUBSTITUTION_PUMP_INVALID_ID, pumpId ); } return speed; @@ -399,7 +430,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_SUBSTITUTION_PUMP_INVALID_ID, pumpId ); } } @@ -422,7 +453,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_SUBSTITUTION_PUMP_INVALID_ID, pumpId ); } } @@ -457,7 +488,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_SUBSTITUTION_PUMP_INVALID_ID, pumpId ); } } @@ -479,6 +510,7 @@ pumpData.d92_PumpTargetSpeed = pumpTargetSpeed[ D92_PUMP ].data; pumpData.d92_PumpCurrentSetSpeed = substitutionPumps[ D92_PUMP ].currentPumpSpeed; pumpData.d92_PumpState = (U32)substitutionPumps[ D92_PUMP ].execState; + pumpData.d92_PumpMeasuredSpeed = substitutionPumps[ D92_PUMP ].measuredPumpSpeed; broadcastData( MSG_ID_DD_SUBSTITUTION_PUMP_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&pumpData, sizeof( SUBSTITUTION_PUMP_DATA_T ) ); substitutionPumpPublishTimerCounter = 0; Index: firmware/App/Controllers/SubstitutionPump.h =================================================================== diff -u -rf90c1eef73251d75ce49645eb05deb492a486ff0 -r43c231c0f9a56e2481f94cdbc51f45ef1af23c46 --- firmware/App/Controllers/SubstitutionPump.h (.../SubstitutionPump.h) (revision f90c1eef73251d75ce49645eb05deb492a486ff0) +++ firmware/App/Controllers/SubstitutionPump.h (.../SubstitutionPump.h) (revision 43c231c0f9a56e2481f94cdbc51f45ef1af23c46) @@ -50,6 +50,7 @@ F32 d92_PumpTargetSpeed; ///< Substitution pump D92_Pump target speed F32 d92_PumpCurrentSetSpeed; ///< Substitution pump D92_Pump current set speed U32 d92_PumpState; ///< Substitution pump D92_Pump current state + F32 d92_PumpMeasuredSpeed; ///< Substitution pump D92_Pump measured speed } SUBSTITUTION_PUMP_DATA_T; // ********** public function prototypes ********** @@ -65,7 +66,6 @@ BOOL testSubstitutionPumpDataPublishIntervalOverride( MESSAGE_T *message ); BOOL testSubstitutionPumpTargetSpeedOverride( MESSAGE_T *message ); - BOOL testSubstitutionPumpStartStopOverride( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r5f1b50a1d9a7bd6ea17bb666e28ccfeafe56432c -r43c231c0f9a56e2481f94cdbc51f45ef1af23c46 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 5f1b50a1d9a7bd6ea17bb666e28ccfeafe56432c) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 43c231c0f9a56e2481f94cdbc51f45ef1af23c46) @@ -158,6 +158,8 @@ SW_FAULT_ID_INVALID_TEMPERATURE_SENSOR_SELECTED3 = 127, SW_FAULT_ID_DIALYSATE_MIX_EXEC_INVALID_STATE = 128, SW_FAULT_ID_MODE_UPDATE_INVALID_STATE = 129, + SW_FAULT_ID_SUBSTITUTION_PUMP_INVALID_ID = 130, + SW_FAULT_ID_SUBSTITUTION_PUMP_EXEC_INVALID_STATE = 131, NUM_OF_SW_FAULT_IDS } DD_SW_FAULT_ID_T; Index: firmware/App/Services/FpgaDD.c =================================================================== diff -u -r84b30e2da7c4374d06ef068d3cb2b5c0c4fabccd -r43c231c0f9a56e2481f94cdbc51f45ef1af23c46 --- firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision 84b30e2da7c4374d06ef068d3cb2b5c0c4fabccd) +++ firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision 43c231c0f9a56e2481f94cdbc51f45ef1af23c46) @@ -318,7 +318,7 @@ U16 fpgaD18PresTemp; ///< Reg 534. D18 MPM pressure sensor RAW temperature data U16 fpgaD41PresPressure; ///< Reg 536. D41 MPM pressure sensor RAW pressure data U16 fpgaD41PresTemp; ///< Reg 538. D41 MPM pressure sensor RAW temperature data - U32 fpgaAvailableRegister1; ///< Reg 540. Available register 1 + U32 fpgaD92SpeedCnt; ///< Reg 540. D92 Substitution Pump Hall sensor speed counter. U08 fpgaHallSensInputs; ///< Reg 544. Hall sensor Inputs U08 fpgaD42TxFIFOCnt; ///< Reg 545. Blood leak sensor transmit FIFO count U16 fpgaD42RxErrorCnt; ///< Reg 546. Blood leak sensor Receive error count @@ -4000,4 +4000,17 @@ { return fpgaSensorReadings.fpgaP18CalMemCounter; } + +/*********************************************************************//** + * @brief + * The getFPGAD92PumpHallSenseCount function gets substitution pump, D92, + * hall sensor speed counter. + * @details \b Inputs: fpgaD92SpeedCnt + * @details \b Outputs: none + * @return substitution pump hall sense pulse width + *************************************************************************/ +U32 getFPGAD92PumpHallSenseCount( void ) +{ + return fpgaSensorReadings.fpgaD92SpeedCnt; +} /**@}*/ Index: firmware/App/Services/FpgaDD.h =================================================================== diff -u -r84b30e2da7c4374d06ef068d3cb2b5c0c4fabccd -r43c231c0f9a56e2481f94cdbc51f45ef1af23c46 --- firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision 84b30e2da7c4374d06ef068d3cb2b5c0c4fabccd) +++ firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision 43c231c0f9a56e2481f94cdbc51f45ef1af23c46) @@ -127,7 +127,7 @@ U32 getFPGAD74CondCalData( void ); U08 getFPGAD74CalMemCounter( void ); -// Pumps (Dosing and Gear pumps ) +// Pumps ( Dosing and Gear pumps ) void setFPGAD11PumpSetStepSpeed( U32 stepSpeed ); void setFPGAD10PumpSetStepSpeed( U32 stepSpeed ); void setFPGAD76PumpSetStepSpeed( U32 stepSpeed ); @@ -162,6 +162,7 @@ U32 getFPGAD11PumpRevolutionCountStatus( void ); U32 getFPGAD10PumpRevolutionCountStatus( void ); U32 getFPGAD76PumpRevolutionCountStatus( void ); +U32 getFPGAD92PumpHallSenseCount( void ); void setFPGAD48PumpSpeed( U16 speed ); void setFPGAD12PumpSpeed( U16 speed ); Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r046bc2b62cf942b7e846fa5bff698b94238edf24 -r43c231c0f9a56e2481f94cdbc51f45ef1af23c46 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 046bc2b62cf942b7e846fa5bff698b94238edf24) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 43c231c0f9a56e2481f94cdbc51f45ef1af23c46) @@ -106,6 +106,9 @@ // Monitor rinse pump execRinsePumpMonitor(); + // Monitor Substituion pump + execSubstitutionPumpMonitor(); + // Second pass for FPGA execFPGA( FALSE ); #endif