/********************************* (C) РОТЕК *********************************** * @module ups_monitor * @file ups_monitor.c * @version 1.0.0 * @date XX.XX.XXXX * $brief Template ******************************************************************************* * @history Version Author Comment * XX.XX.XXXX 1.0.0 Telenkov D.A. First release. ******************************************************************************* */ #include "stm32f4xx.h" #include "ups_monitor.h" #include "parameters.h" #include "settings_api.h" #include "megatec.h" #include "led.h" #include "FreeRTOS.h" #include "task.h" #include "trap_api.h" #include "snmp_api.h" #include #define UPS_LOAD 70.0 // Нагрука (граница) #define UPS_LOAD_HIST 1.0 // Гистерезис нагрузки #define UPS_TEMPERATURE 40.0 // Температура (граница) #define UPS_TEMPERATURE_HIST 1.0 // Гистерезис температуры bool flCriticalAlarm = false; bool flNonCriticalAlarm = false; /** * @brief Общая структура настроек */ extern SETTINGS_t sSettings; /** * @brief Задача мониторинга параметров UPS */ void UPS_Monitor(void *params) { for (;;) { flCriticalAlarm = false; flNonCriticalAlarm = false; // Проверяем флаг подключения UPS //if (UPS.Present) { UPS_LineFailMonitor(); UPS_LowBatMonitor(); UPS_PowerMonitor(); UPS_TemperatureMonitor(); UPS_BatteryConnectMonitor(); } UPS_ConnectMonitor(); UPS_DI0Monitor(); UPS_CriticalAlarmMonitor(); UPS_NonCriticalAlarmMonitor(); vTaskDelay(1000); } } /** * @brief Мониторинг бита DI0 state */ void UPS_DI0Monitor(void) { static bool isValueRecv = false; static uint8_t DI0OldState = 0; uint8_t DI0StateCurrent; DI0StateCurrent = get_state_din_outs(DIN1); if (!isValueRecv) { isValueRecv = true; DI0OldState = DI0StateCurrent; return; } if (!DI0StateCurrent) flCriticalAlarm = true; // Значение параметра изменилось if (DI0StateCurrent != DI0OldState) { if(sSettings.sInOuts.din_type_act[0] == SNMP_TRAP) { if (!DI0StateCurrent) SNMP_SendUserTrap(DI0_NORM); else SNMP_SendUserTrap(DI0_ALARM); } } DI0OldState = DI0StateCurrent; } /** * @brief Мониторинг бита CriticalAlarm */ void UPS_CriticalAlarmMonitor(void) { static bool isValueRecv = false; static uint8_t CriticalAlarmOldState = 0; uint8_t CriticalAlarmCurrent; static uint8_t OldRO0type_Sourse = 0; static uint8_t OldRO2type_Sourse = 0; uint8_t CurrRO2type_Sourse = 0; uint8_t CurrRO1type_Sourse = 0; CurrRO1type_Sourse = sSettings.sInOuts.ro_type_source[0]; CurrRO2type_Sourse = sSettings.sInOuts.ro_type_source[1]; CriticalAlarmCurrent = flCriticalAlarm; if (!isValueRecv) { isValueRecv = true; CriticalAlarmOldState = CriticalAlarmCurrent; OldRO0type_Sourse = CurrRO1type_Sourse; OldRO2type_Sourse = CurrRO2type_Sourse; return; } if(CriticalAlarmCurrent){ if (UPS.Present) LED_Toggle(LED_MAJOR_R); else LED_On(LED_MAJOR_R); } else{ LED_Off(LED_MAJOR_R); } // Значение параметра изменилось if (CriticalAlarmCurrent != CriticalAlarmOldState) { if(OldRO0type_Sourse == CRITICAL){ if(CriticalAlarmCurrent) SetROInt(1, 0); else SetROInt(0, 0); SNMP_SendUserTrap(DO0_TOGGLED); } if(OldRO2type_Sourse == CRITICAL){ if(CriticalAlarmCurrent) SetROInt(1, 1); else SetROInt(0, 1); SNMP_SendUserTrap(DO1_TOGGLED); } } else { if(OldRO0type_Sourse == CRITICAL && OldRO0type_Sourse != OldRO0type_Sourse){ if(CriticalAlarmCurrent) SetROInt(1, 0); else SetROInt(0, 0); SNMP_SendUserTrap(DO0_TOGGLED); } if(OldRO2type_Sourse == CRITICAL && OldRO2type_Sourse != OldRO2type_Sourse){ if(CriticalAlarmCurrent) SetROInt(1, 1); else SetROInt(0, 1); SNMP_SendUserTrap(DO1_TOGGLED); } } OldRO0type_Sourse = CurrRO1type_Sourse; OldRO2type_Sourse = CurrRO2type_Sourse; CriticalAlarmOldState = CriticalAlarmCurrent; } /** * @brief Мониторинг бита NonCriticalAlarm */ void UPS_NonCriticalAlarmMonitor(void) { static bool isValueRecv = false; static uint8_t NonCriticalAlarmOldState = 0; uint8_t NonCriticalAlarmCurrent; static uint8_t OldRO0type_Sourse = 0; static uint8_t OldRO2type_Sourse = 0; uint8_t CurrRO2type_Sourse = 0; uint8_t CurrRO1type_Sourse = 0; CurrRO1type_Sourse = sSettings.sInOuts.ro_type_source[0]; CurrRO2type_Sourse = sSettings.sInOuts.ro_type_source[1]; NonCriticalAlarmCurrent = flNonCriticalAlarm; if (!isValueRecv) { isValueRecv = true; NonCriticalAlarmOldState = NonCriticalAlarmCurrent; OldRO0type_Sourse = CurrRO1type_Sourse; OldRO2type_Sourse = CurrRO2type_Sourse; return; } // Значение параметра изменилось if (NonCriticalAlarmCurrent != NonCriticalAlarmOldState) { if(OldRO0type_Sourse == CRITICAL){ if(NonCriticalAlarmCurrent) SetROInt(1, 0); else SetROInt(0, 0); SNMP_SendUserTrap(DO0_TOGGLED); } if(OldRO2type_Sourse == CRITICAL){ if(NonCriticalAlarmCurrent) SetROInt(1, 1); else SetROInt(0, 1); SNMP_SendUserTrap(DO1_TOGGLED); } } else { if(OldRO0type_Sourse == CRITICAL && OldRO0type_Sourse != OldRO0type_Sourse){ if(NonCriticalAlarmCurrent) SetROInt(1, 0); else SetROInt(0, 0); SNMP_SendUserTrap(DO0_TOGGLED); } if(OldRO2type_Sourse == CRITICAL && OldRO2type_Sourse != OldRO2type_Sourse){ if(NonCriticalAlarmCurrent) SetROInt(1, 1); else SetROInt(0, 1); SNMP_SendUserTrap(DO1_TOGGLED); } } OldRO0type_Sourse = CurrRO1type_Sourse; OldRO2type_Sourse = CurrRO2type_Sourse; NonCriticalAlarmOldState = NonCriticalAlarmCurrent; } /** * @brief Мониторинг бита LainFail */ void UPS_LineFailMonitor(void) { static bool isValueRecv = false; static uint8_t lineFailOldState = 0; uint8_t lineFailCurrent; lineFailCurrent = (UPS.Status >> 7) & 0x01; if (!isValueRecv) { isValueRecv = true; lineFailOldState = lineFailCurrent; return; } if (lineFailCurrent) flCriticalAlarm = true; // Значение параметра изменилось if (lineFailCurrent != lineFailOldState) { if (lineFailCurrent) SNMP_SendUserTrap(LINE_ALARM); else SNMP_SendUserTrap(LINE_NORM); } lineFailOldState = lineFailCurrent; } /** * @brief Мониторинг бита LowBat */ void UPS_LowBatMonitor(void) { static bool isValueRecv = false; static uint8_t lowBatOldState = 0; uint8_t lowBatCurrent; if((UPS.Status >> 7) & 0x01) lowBatCurrent = (UPS.Status >> 6) & 0x01; else lowBatCurrent = 0; if (!isValueRecv) { isValueRecv = true; lowBatOldState = lowBatCurrent; return; } if (lowBatCurrent) flNonCriticalAlarm = true; // Значение параметра изменилось if (lowBatCurrent != lowBatOldState) { if (lowBatCurrent) SNMP_SendUserTrap(LOW_BAT_ALARM); else SNMP_SendUserTrap(LOW_BAT_NORM); } lowBatOldState = lowBatCurrent; } /** * @brief Мониторинг нагрузки */ void UPS_PowerMonitor(void) { float load; static uint8_t stateCurrent = HYST_IDLE; load = UPS.Load; /* Отслеживается переход через верхнюю границу */ if (load > UPS_LOAD) { flCriticalAlarm = true; if (stateCurrent == HYST_IDLE) { LED_On(LED_MINOR_R); LED_On(LED_MINOR_G); stateCurrent = HYST_UP; // Отправка трапа о завышении SNMP_SendUserTrap(POWER_ALARM); } } /* Отслеживается нормализация */ else if (load < (UPS_LOAD - UPS_LOAD_HIST)) { if (stateCurrent == HYST_UP) { LED_Off(LED_MINOR_R); LED_Off(LED_MINOR_G); stateCurrent = HYST_IDLE; // Отправка трапа о нормализации SNMP_SendUserTrap(POWER_NORM); } } } /** * @brief Мониторинг температуры */ void UPS_TemperatureMonitor(void) { float temperature; static uint8_t stateCurrent = HYST_IDLE; temperature = UPS.Temp; /* Отслеживается переход через верхнюю границу */ if (temperature > UPS_TEMPERATURE) { flCriticalAlarm = true; if (stateCurrent == HYST_IDLE) { stateCurrent = HYST_UP; // Отправка трапа о завышении SNMP_SendUserTrap(BATTERY_TEMPERATURE_ALARM); } } /* Отслеживается нормализация */ else if (temperature < (UPS_TEMPERATURE - UPS_TEMPERATURE_HIST)) { if (stateCurrent == HYST_UP) { stateCurrent = HYST_IDLE; // Отправка трапа о нормализации SNMP_SendUserTrap(BATTERY_TEMPERATURE_NORM); } } } /** * @brief Мониторинг параметра upsParams.connect */ void UPS_ConnectMonitor(void) { static bool isValueRecv = false; static uint8_t connectOldState = 0; uint8_t connectCurrent; connectCurrent = UPS.Present; if (!isValueRecv) { isValueRecv = true; connectOldState = connectCurrent; return; } if (connectCurrent) flCriticalAlarm = true; // Значение параметра изменилось if (connectCurrent != connectOldState) { if (connectCurrent) SNMP_SendUserTrap(CONNECT_MONITOR_NORM); else SNMP_SendUserTrap(CONNECT_MONITOR_ALARM); } connectOldState = connectCurrent; } /** * @brief Мониторинг параметра upsParams.connect */ void UPS_BatteryConnectMonitor(void) { static bool isValueRecv = false; static uint8_t AKBconnectOldState = 0; uint8_t AKBconnectCurrent; if(((UPS.Status >> 7) & 0x01) == 0) AKBconnectCurrent = (UPS.Status >> 6) & 0x01; else{ AKBconnectCurrent = 0; } if (!isValueRecv) { isValueRecv = true; AKBconnectOldState = AKBconnectCurrent; return; } if (AKBconnectCurrent) flCriticalAlarm = true; // Значение параметра изменилось if (AKBconnectCurrent != AKBconnectOldState) { if (AKBconnectCurrent) SNMP_SendUserTrap(BATTERY_CONNECT_NORM); else SNMP_SendUserTrap(BATTERY_CONNECT_ALARM); } AKBconnectOldState = AKBconnectCurrent; } /********************************* (C) РОТЕК **********************************/