Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r33d5acc68ffe045546a4fa9a7d381950619ea45d -rfeec9f68e1585117996fc0e025633fe215120a4f --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 33d5acc68ffe045546a4fa9a7d381950619ea45d) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision feec9f68e1585117996fc0e025633fe215120a4f) @@ -444,36 +444,42 @@ *************************************************************************/ static void monitorFans( void ) { - FAN_NAMES_T fan; - if ( ++fansMonitorCounter >= FANS_MONITOR_INTERVAL_COUNT ) { + FAN_NAMES_T fan; + F32 rpm = 0.0; + BOOL isAlarmTriggered = FALSE; + BOOL isFanRPMOutOfRange = FALSE; + + // The RPM is expected to be 5500 @ 100% duty cycle + // The nominal RPM = duty cycle * 5500 / 1.0 + // The RPM tolerance is -25% to +50% of the nominal RPM + F32 fansNominalRPM = fansStatus.dutyCycle * FANS_MAX_ALLOWED_RPM; + F32 fansMinAllowedRPM = fansNominalRPM - ( fansNominalRPM * FANS_MIN_RPM_OUT_OF_RANGE_TOL ); + F32 fansMaxAllowedRPM = fansNominalRPM + ( fansNominalRPM * FANS_MAX_RPM_OUT_OF_RANGE_TOL ); + + for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) + { + rpm = getMeasuredFanRPM( fan ); + isFanRPMOutOfRange |= ( ( rpm < fansMinAllowedRPM ) || ( rpm > fansMaxAllowedRPM ) ? TRUE : FALSE ); + } + // If the fans alarm has been raise already, do not raise again if ( FALSE == hasAlarmBeenRaised ) { - BOOL isFanRPMOutOfRange; + isAlarmTriggered = isPersistentAlarmTriggered( ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE, isFanRPMOutOfRange ); - // The RPM is expected to be 5500 @ 100% duty cycle - // The nominal RPM = duty cycle * 5500 / 1.0 - // The RPM tolerance is -25% to +50% of the nominal RPM - F32 fansNominalRPM = fansStatus.dutyCycle * FANS_MAX_ALLOWED_RPM; - F32 fansMinAllowedRPM = fansNominalRPM - ( fansNominalRPM * FANS_MIN_RPM_OUT_OF_RANGE_TOL ); - F32 fansMaxAllowedRPM = fansNominalRPM + ( fansNominalRPM * FANS_MAX_RPM_OUT_OF_RANGE_TOL ); - - for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) + if ( TRUE == isAlarmTriggered ) { - isFanRPMOutOfRange = ( getMeasuredFanRPM( fan ) < fansMinAllowedRPM ) || ( getMeasuredFanRPM( fan ) > fansMaxAllowedRPM ); - checkPersistentAlarm( ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE, isFanRPMOutOfRange, getMeasuredFanRPM( fan ), FANS_MAX_ALLOWED_RPM ); - - // If the RPM out of range alarm has been raised, do not raise it again, until its alarm silence time has been elapsed - hasAlarmBeenRaised = ( TRUE == isAlarmActive( ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE ) ? TRUE : FALSE ); - - // If the alarm has been raised and the alarm start timer is 0, start the timer - if ( ( TRUE == hasAlarmBeenRaised ) && ( 0 == rpmAlarmStartTime ) ) - { - rpmAlarmStartTime = getMSTimerCount(); - } + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE, rpm ) + // Set the alarm flag to TRUE + hasAlarmBeenRaised = TRUE; } + // If the alarm has been raised but the start time of the alarm has not been set, set the alarm start timer + if ( ( TRUE == hasAlarmBeenRaised ) && ( 0 == rpmAlarmStartTime ) ) + { + rpmAlarmStartTime = getMSTimerCount(); + } } // If the alarm has been raised the silence the alarm time has elapsed, get ready to raise the alarm in case the RPM was out of range // Once the alarm is raised, it is not raised again for 24 hours @@ -482,6 +488,15 @@ hasAlarmBeenRaised = FALSE; rpmAlarmStartTime = 0; } + else + { + // If the alarm has been raised and 24 hours has not elapsed, check if the fans RPM is back in range again + // If the fans RPM is in range again, clear the alarm + if ( FALSE == isFanRPMOutOfRange ) + { + clearAlarmCondition( ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE ); + } + } fansMonitorCounter = 0; }