123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452 |
- /********************************* (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 <stdbool.h>
- #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) РОТЕК **********************************/
|