123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785 |
- /********************************* (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.
- *******************************************************************************
- */
- #pragma GCC diagnostic error "-Wall"
- #pragma GCC diagnostic error "-Wextra"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "fr_timers.h"
- #include "stm32f4xx.h"
- #include "ups_monitor.h"
- #include "parameters.h"
- #include "settings_api.h"
- #include "megatec.h"
- #include "led.h"
- #include "log.h"
- #include "rtc.h"
- #include "hal.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "trap_api.h"
- #include "snmp_api.h"
- #include "syslog.h"
- #include <stdbool.h>
- #ifdef PRINTF_STDLIB
- #include <stdio.h>
- #endif
- #ifdef PRINTF_CUSTOM
- #include "tinystdio.h"
- #endif
- bool flCriticalAlarm = false;
- bool flNonCriticalAlarm = false;
- bool flLedAlarm = false;
- /**
- * @brief Общая структура настроек
- */
- extern SETTINGS_t sSettings;
- extern bool flUpdateLog;
- extern int test_time;
- #if defined(INVERTERHIGHVOLTAGE_MONITOR) || defined(OVERTEMPRATURE_MONITOR)
- TimerHandle_t UPSRestartTimer;
- void UPSRestartCallback(TimerHandle_t pxTimer) {
- UPScmd(ups_remote_turn_on);
- }
- #endif
- #ifdef INVERTERHIGHVOLTAGE_MONITOR
- TimerHandle_t UPSTurnOffTimer;
- void UPSTurnOffCallback(TimerHandle_t pxTimer) {
- UPScmd(ups_remote_turn_off);
- xTimerStart(UPSRestartTimer, 0);
- }
- #endif
- /**
- * @brief Задача мониторинга параметров UPS
- */
- void UPS_Monitor(void *params)
- {
- (void)params;
- #if defined(INVERTERHIGHVOLTAGE_MONITOR) || defined(OVERTEMPRATURE_MONITOR)
- UPSRestartTimer = xTimerCreate("UPSRestartTmr", configTICK_RATE_HZ*10, pdFALSE, ( void * ) 0, UPSRestartCallback);
- #endif
- #ifdef INVERTERHIGHVOLTAGE_MONITOR
- UPSTurnOffTimer = xTimerCreate("UPSTurnOffTmr", configTICK_RATE_HZ*300, pdFALSE, ( void * ) 0, UPSTurnOffCallback);
- #endif
- vTaskDelay(5000);
- for (;;)
- {
- flCriticalAlarm = false;
- flNonCriticalAlarm = false;
- flLedAlarm = false;
- #define XMONITOR(monitor_func, present) if (present) { monitor_func(); }
- MONITOR_TABLE
- #undef XMONITOR
- #ifdef LED_ALARM
- if(flLedAlarm){
- if (UPS.Present == UPS_CONNECTED)
- LED_On(LED_ALARM);
- else
- LED_Toggle(LED_ALARM);
- }
- else{
- LED_Off(LED_ALARM);
- }
- #endif
- vTaskDelay(1000);
- }
- }
- #ifdef DINS_ENABLE
- /**
- * @brief Мониторинг бита DI0 state
- */
- void UPS_DI0Monitor(void)
- {
- #ifdef DIN_MONITOR
- static bool isValueRecv = false;
- static uint8_t DI0OldState[INPUTS_TOTAL_COUNT];
- uint8_t DI0StateCurrent;
- for(uint8_t i = 0; i < INPUTS_TOTAL_COUNT; i ++) {
- DI0StateCurrent = get_state_din_outs((DIN1+i)) ^ sSettings.sDINs[i].din_type_act;
- UPS.Alarm = (UPS.Alarm & ~(1 << (4 + i))) | (DI0StateCurrent << (4 + i));
- if (!isValueRecv) {
- DI0OldState[i] = DI0StateCurrent;
- if (DI0StateCurrent){
- log_event_data((LOG_ALARM_DIO + i), "Авария");
- SNMP_SendUserTrap(DI0_ALARM + 2*i);
- flUpdateLog = true;
- }
- else{
- log_event_data((LOG_ALARM_DIO + i), "Норма");
- SNMP_SendUserTrap(DI0_NORM + 2*i);
- flUpdateLog = true;
- }
- if (i == (INPUTS_TOTAL_COUNT - 1)) {
- isValueRecv = true;
- break;
- }
- continue;
- }
- if (DI0StateCurrent) {
- flLedAlarm = true;
- }
-
- // Значение параметра изменилось
- if (DI0StateCurrent != DI0OldState[i])
- {
- if (!DI0StateCurrent){
- log_event_data((LOG_ALARM_DIO + i), "Норма");
- SNMP_SendUserTrap((DI0_NORM + 2*i));
- flUpdateLog = true;
- }
- else{
- log_event_data((LOG_ALARM_DIO + i), "Авария");
- SNMP_SendUserTrap(DI0_ALARM + 2*i);
- flUpdateLog = true;
- }
- }
- DI0OldState[i] = DI0StateCurrent;
- }
- #endif
- }
- #endif
- #ifdef DOUTS_ENABLE
- void relay_setup_log(uint8_t *curr_source, ro_type_source_t src_act_ro, uint8_t state_relay)
- {
- uint8_t i = 0;
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
- if(curr_source[i] == src_act_ro){
- SetROInt(state_relay, i);
- SNMP_SendUserTrap((DO0_TOGGLED+i));
- if(state_relay){
- flUpdateLog = true;
- #if defined RELAY_NC
- log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
- #else
- log_event_data((LOG_DO0_STATE + i), "Замкнуто");
- #endif
- }
- else{
- flUpdateLog = true;
- #if defined RELAY_NC
- log_event_data((LOG_DO0_STATE + i), "Замкнуто");
- #else
- log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
- #endif
- }
- }
- }
- }
- void relay_setup_log_change(uint8_t *curr_source, uint8_t *prev_source, ro_type_source_t src_act_ro)
- {
- uint8_t i = 0;
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
- if(curr_source[i] != prev_source[i] && (prev_source[i] == src_act_ro || curr_source[i] == src_act_ro)){
- #if defined RELAY_NC
- if(curr_source[i] != src_act_ro){
- flUpdateLog = true;
- SetROInt(0, i);
- SNMP_SendUserTrap((DO0_TOGGLED+i));
- log_event_data((LOG_DO0_STATE + i), "Замкнуто");
- }
- else{
- flUpdateLog = true;
- SetROInt(1, i);
- SNMP_SendUserTrap((DO0_TOGGLED+i));
- log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
- }
- #else
- if(curr_source[i] != src_act_ro){
- flUpdateLog = true;
- SetROInt(0, i);
- SNMP_SendUserTrap((DO0_TOGGLED+i));
- log_event_data((LOG_DO0_STATE + i), "Разомкнуто");
- }
- else{
- flUpdateLog = true;
- SetROInt(1, i);
- SNMP_SendUserTrap((DO0_TOGGLED+i));
- log_event_data((LOG_DO0_STATE + i), "Замкнуто");
- }
- #endif
- }
- }
- }
- #endif
- #ifdef TYPE_CRITICAL_ALARM_MONITOR
- /**
- * @brief Мониторинг бита CriticalAlarm
- */
- void UPS_CriticalAlarmMonitor(void)
- {
- static bool isValueRecv = false;
- static uint8_t CriticalAlarmOldState = 0;
- uint8_t CriticalAlarmCurrent;
- uint8_t i = 0;
- static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
- CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
- CriticalAlarmCurrent = flCriticalAlarm;
- if (!isValueRecv) {
- isValueRecv = true;
- CriticalAlarmOldState = CriticalAlarmCurrent;
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- if(CriticalAlarmCurrent){
- relay_setup_log(CurrROtype_Sourse, CRITICAL, 1);
- }
- else{
- relay_setup_log(CurrROtype_Sourse, CRITICAL, 0);
- }
- return;
- }
- // Значение параметра изменилось
- if (CriticalAlarmCurrent != CriticalAlarmOldState)
- {
- if(CriticalAlarmCurrent){
- relay_setup_log(CurrROtype_Sourse, CRITICAL, 1);
- }
- else{
- relay_setup_log(CurrROtype_Sourse, CRITICAL, 0);
- }
- }
- else
- {
- if(CriticalAlarmCurrent)
- relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, CRITICAL);
- }
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- }
- CriticalAlarmOldState = CriticalAlarmCurrent;
- }
- /**
- * @brief Мониторинг бита NonCriticalAlarm
- */
- void UPS_NonCriticalAlarmMonitor(void)
- {
- static bool isValueRecv = false;
- static uint8_t NonCriticalAlarmOldState = 0;
- uint8_t NonCriticalAlarmCurrent;
- uint8_t i = 0;
- static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
- CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
- NonCriticalAlarmCurrent = flNonCriticalAlarm;
- if (!isValueRecv) {
- isValueRecv = true;
- NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- if(NonCriticalAlarmCurrent)
- relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 1);
- else
- relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 0);
- return;
- }
- // Значение параметра изменилось
- if (NonCriticalAlarmCurrent != NonCriticalAlarmOldState)
- {
- if(NonCriticalAlarmCurrent){
- relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 1);
- }
- else{
- relay_setup_log(CurrROtype_Sourse, NON_CRITICAL, 0);
- }
- }
- else
- {
- if(NonCriticalAlarmCurrent)
- relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, NON_CRITICAL);
- }
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- }
- NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
- }
- #endif
- static bool test_akb_flag = false;
- /**
- * @brief Мониторинг бита Test in progress
- */
- void UPS_TestFinishMonitor(void)
- {
- #ifdef TEST_AKB_FINISH_MONITOR
- static uint8_t TestFinishState = 0;
- uint8_t TestFinishStateCurrent;
- char log_string[50];
- static uint32_t start_time_test = 0;
- TestFinishStateCurrent = (UPS.Status >> 2) & 0x01;
- // Значение параметра изменилось
- if (TestFinishStateCurrent != TestFinishState)
- {
- if (!TestFinishStateCurrent){
- printf("Test finish\r\n");
- #ifdef TEST_ALARM_AKB_MONITOR
- float time_test_actual = ((float)(xTaskGetTickCount() - start_time_test)) / (1000*60);
- UPSReadTestStatus();
- #ifdef RELAY_ALARM_AKB
- static uint8_t AKBAlarmState = 0;
- uint8_t i = 0;
- static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
- CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
- #endif
- float Uakb_av = voltage_bat_average();
- float Pload_av = power_load_average();
- float k_eff;
- printf("Uakb_av: %0.2f", Uakb_av);
- printf("Pload_av: %0.2f", Pload_av);
- if(UPS.Test_Status != 2 && Pload_av >= 3) {
- GetUPSEfficiencyFactorInt(&k_eff);
- float Ccalc = (sSettings.UPS_Setting.ups_power*Pload_av*time_test_actual)/(100*60*Uakb_av*(k_eff));
- printf("Ccalc: %0.2f", Ccalc);
- float Ccalc_percent = (100*Ccalc)/sSettings.UPS_Setting.common_capacity;
- if (Ccalc_percent >= 80) {
- sprintf(log_string, "Авария(%0.2f Ач)", Ccalc);
- log_event_data(LOG_TEST_ALARM_AKB, log_string);
- syslog(SYSLOG_INFORMATIONAL, "Ёмкость АКБ: %s", log_string);
- #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
- SNMP_SendUserTrap(BATTERY_FAIL);
- #endif
- #ifdef RELAY_ALARM_AKB
- relay_setup_log(CurrROtype_Sourse, ALARM_AKB, 1);
- AKBAlarmState = 1;
- #endif
- } else {
- sprintf(log_string, "Норма(%0.2f Ач)", Ccalc);
- log_event_data(LOG_TEST_ALARM_AKB, log_string);
- syslog(SYSLOG_INFORMATIONAL, "Ёмкость АКБ: %s", log_string);
- #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
- SNMP_SendUserTrap(BATTERY_NORM);
- #endif
- #ifdef RELAY_ALARM_AKB
- relay_setup_log(CurrROtype_Sourse, ALARM_AKB, 0);
- AKBAlarmState = 0;
- #endif
- }
- }
- #ifdef RELAY_ALARM_AKB
- if (AKBAlarmState)
- relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, ALARM_AKB);
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- #endif
- memset(log_string, 0, sizeof(log_string));
- if(UPS.Test_Status == 2 ||( (time_test_actual <= 0.9*test_time || time_test_actual >= 1.1*test_time) && (test_time != 0 && test_time != 100))){//
- strcpy(log_string, "Ошибка");
- } else {
- strcpy(log_string, "Завершен");
- }
- uint8_t len1 = strlen(log_string);
- sprintf(&log_string[len1], "(%0.1f мин)", time_test_actual);
- log_event_data(LOG_TEST_UPS, log_string);
- syslog(SYSLOG_INFORMATIONAL, "Тест батареи: %s", log_string);
- test_time = 0;
- #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
- SNMP_SendUserTrap(TEST_BAT_STOP);
- #endif
- #else
- log_event_data(LOG_TEST_UPS, "Завершен");
- syslog_str(SYSLOG_INFORMATIONAL, "Тест батареи: Завершён");
- #endif
- flUpdateLog = true;
- } else {
- test_akb_flag = true;
- memset(log_string, 0, sizeof(log_string));
- switch (get_act_source()) {
- case WEB_ACT:
- strcpy(log_string, name_login);
- break;
- case SNMP_ACT:
- case OTHER_ACT:
- strcpy(log_string, "Администратор");
- break;
- #ifdef CLI_ENABLE
- case CLI_ACT:
- strcpy(log_string, "Администратор");
- break;
- #endif
- case AUTO_ACT:
- strcpy(log_string, "Автоматический");
- break;
- default:
- break;
- }
- #ifdef TEST_ALARM_AKB_MONITOR
- start_time_test = xTaskGetTickCount();
- if (test_time == 0) {
- strcat(log_string, " (авто)");
- } else if (test_time == 100) {
- strcat(log_string, " (до разряда)");
- } else {
- uint8_t len = strlen(log_string);
- sprintf(&log_string[len], "(%i мин)", test_time);
- }
- #else
- strcat(log_string, " (Запущен)");
- #endif
- printf("Test start\r\n");
- log_event_data(LOG_TEST_UPS, log_string);
- syslog(SYSLOG_INFORMATIONAL, "Тест батареи: %s", log_string);
- #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
- SNMP_SendUserTrap(TEST_BAT_RUN);
- #endif
- flUpdateLog = true;
- }
- }
- TestFinishState = TestFinishStateCurrent;
- #endif
- }
- uint8_t UPS_VACinputRangeAlarm(void)
- {
- #ifdef VAC_IN_MONITOR
- uint8_t flag = 0;
- static uint8_t stateCurrentVACinput_low = HYST_IDLE;
- static uint8_t stateCurrentVACinput_high = HYST_IDLE;
- float VACinputCurrent = UPS.VAC_in;
- static uint8_t cnt = 0;
- if(test_akb_flag) {
-
- if (UPS.VAC_in>255) {
- test_akb_flag = false;
- cnt = 0;
- ups_metac_service_pdu(ups_cancel_test);
- log_event_data(LOG_TEST_UPS, "Ошибка");
- } else {
- if(cnt < 20){
- cnt++;
- } else {
- if (UPS.Mode == 'L') {
- test_akb_flag = false;
- }
- cnt = 0;
- }
- }
- }
- /* Отслеживается переход через нижнию границу */
- if (VACinputCurrent < sSettings.sAlarmManager.ac_input_range.low)
- {
- if (stateCurrentVACinput_low == HYST_IDLE || stateCurrentVACinput_low == HYST_DOWN) {
- stateCurrentVACinput_low = HYST_DOWN;
- flag |= (1 << 1);
- }
- } else if (VACinputCurrent > (sSettings.sAlarmManager.ac_input_range.low + sSettings.sAlarmManager.ac_input_range.hyst))
- {
- if (stateCurrentVACinput_low == HYST_DOWN)
- {
- stateCurrentVACinput_low = HYST_IDLE;
- flag &= 0xfd;
- }
- } else {
- if (stateCurrentVACinput_low == HYST_DOWN) {
- flag |= (1 << 1);
- }
- }
- /* Отслеживается переход через верхнюю границу */
- if (VACinputCurrent > sSettings.sAlarmManager.ac_input_range.high)
- {
- if (stateCurrentVACinput_high == HYST_IDLE || stateCurrentVACinput_high == HYST_UP) {
- stateCurrentVACinput_high = HYST_UP;
- flag |= (1 << 2);
- }
- } else if (VACinputCurrent < (sSettings.sAlarmManager.ac_input_range.high - sSettings.sAlarmManager.ac_input_range.hyst))
- {
- if (stateCurrentVACinput_high == HYST_UP)
- {
- stateCurrentVACinput_high = HYST_IDLE;
- flag &= 0xfb;
- }
- } else {
- if (stateCurrentVACinput_high == HYST_UP) {
- flag |= (1 << 2);
- }
- }
- return flag;
- #endif
- }
- /**
- * @brief Мониторинг бита LainFail
- */
- void UPS_LineFailMonitor(void)
- {
- #ifdef LINE_FAIL_MONITOR
- static bool isValueRecv = false;
- static uint8_t lineFailOldState = 0;
- uint8_t lineFailCurrent;
- char log_string[50];
- uint8_t len;
- #if defined RELAY_AC_PRESENT
- uint8_t i = 0;
- static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
- CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
- #endif
- #ifdef VAC_IN_MONITOR
- lineFailCurrent = ((UPS.Status >> 7) & 0x01);
- lineFailCurrent |= UPS_VACinputRangeAlarm();
- #else
- lineFailCurrent = (UPS.Status >> 7) & 0x01;
- #endif
-
- if (!isValueRecv) {
- isValueRecv = true;
- lineFailOldState = lineFailCurrent;
- if (lineFailCurrent != 0){
- memset(log_string, 0, sizeof(log_string));
- strcat(log_string, "Авария");
- len = strlen(log_string);
- sprintf(&log_string[len], " (%0.1f В)", UPS.VAC_in);
- log_event_data(LOG_ALARM_LINE, log_string);
- SNMP_SendUserTrap(LINE_ALARM);
- syslog(SYSLOG_ERROR, "Авария сети (%0.1f В)", UPS.VAC_in);
- flUpdateLog = true;
- #if defined RELAY_AC_PRESENT
- relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1);
- #endif
- }
- else{
- #if defined RELAY_AC_PRESENT
- relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 0);
- #endif
- log_event_data(LOG_ALARM_LINE, "Норма");
- SNMP_SendUserTrap(LINE_NORM);
- syslog(SYSLOG_NOTICE, "Сеть в норме (%0.1f В)", UPS.VAC_in);
- flUpdateLog = true;
- }
- return;
- }
- if (lineFailCurrent != 0){
- flCriticalAlarm = true;
- flLedAlarm = true;
- }
-
- // Значение параметра изменилось
- if (lineFailCurrent != lineFailOldState)
- {
- if (lineFailCurrent != 0){
- #if defined RELAY_AC_PRESENT
- relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1);
- #endif
- memset(log_string, 0, sizeof(log_string));
- strcat(log_string, "Авария");
- len = strlen(log_string);
- sprintf(&log_string[len], " (%0.1f В)", UPS.VAC_in);
- log_event_data(LOG_ALARM_LINE, log_string);
- SNMP_SendUserTrap(LINE_ALARM);
- syslog(SYSLOG_ERROR, "Авария сети (%0.1f В)", UPS.VAC_in);
- #ifdef AKB_CHANGE_MONITOR
- if(UPS.Alarm & 0x40) {
- log_event_data(LOG_ALARM_CHANGE_AKB, "Авария");
- SNMP_SendUserTrap(BATTERY_CHANGE_ALARM);
- }
- #endif
- flUpdateLog = true;
- }
- else{
- if (UPS.VAC_in == 0) {
- return;
- }
- #if defined RELAY_AC_PRESENT
- relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 0);
- #endif
- log_event_data(LOG_ALARM_LINE, "Норма");
- SNMP_SendUserTrap(LINE_NORM);
- syslog(SYSLOG_NOTICE, "Сеть в норме (%0.1f В)", UPS.VAC_in);
- flUpdateLog = true;
- }
- }
- #if defined RELAY_AC_PRESENT
- else{
- if (lineFailCurrent != 0)
- relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, AC_PRESENT);
- }
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- }
- #endif
- lineFailOldState = lineFailCurrent;
- #endif
- }
- #ifdef VAC_OUT_MONITOR
- /**
- * @brief Мониторинг аварии выходного напряжения по нижней границе
- */
- void UPS_VACoutputLowRangeMonitor(void)
- {
- static uint8_t stateCurrentVACoutput = HYST_IDLE;
- float VACoutputCurrent;
- #if defined RELAY_DC_PRESENT
- uint8_t i = 0;
- static bool isValueRecv = false;
- static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
- CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
- if(!isValueRecv)
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- }
- #endif
- VACoutputCurrent = UPS.VAC_out;
- /* Отслеживается переход через нижнию границу */
- if (VACoutputCurrent < sSettings.sAlarmManager.ac_output_range.low)
- {
- if (stateCurrentVACoutput == HYST_IDLE)
- {
- UPS.Alarm |= (1 << 7);
- stateCurrentVACoutput = HYST_DOWN;
- #if defined RELAY_DC_PRESENT
- relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 1);
- #endif
- log_event_data(LOG_ALARM_VAC_LOW_OUTPUT, "Авария");
- #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
- // Отправка трапа о занижении
- SNMP_SendUserTrap(VAC_LOW_OUTPUT_ALARM);
- syslog(SYSLOG_ERROR, "Низкое выходное напряжение (%0.1f В)", VACoutputCurrent);
- #endif
- flUpdateLog = true;
- } else {
- #if defined RELAY_DC_PRESENT
- relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, DC_PRESENT);
- #endif
- }
- }
- /* Отслеживается нормализация */
- else if (VACoutputCurrent > (sSettings.sAlarmManager.ac_output_range.low + sSettings.sAlarmManager.ac_output_range.hyst))
- {
- if (stateCurrentVACoutput == HYST_DOWN)
- {
- UPS.Alarm &= 0xffffff7f;
- stateCurrentVACoutput = HYST_IDLE;
- #if defined RELAY_DC_PRESENT
- relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 0);
- #endif
- log_event_data(LOG_ALARM_VAC_LOW_OUTPUT, "Норма");
- #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(VAC_LOW_OUTPUT_NORM);
- syslog(SYSLOG_NOTICE, "Выходное напряжение в норме (%0.1f В)", VACoutputCurrent);
- #endif
- flUpdateLog = true;
- }
- }
- if (UPS.Alarm & 0x80) {
- flLedAlarm = true;
- }
- #if defined RELAY_DC_PRESENT
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- }
- #endif
- }
- /**
- * @brief Мониторинг аварии выходного напряжения по верхней границе
- */
- void UPS_VACoutputHighRangeMonitor(void)
- {
- static uint8_t stateCurrentVACoutput = HYST_IDLE;
- float VACoutputCurrent;
- #if defined RELAY_DC_PRESENT
- uint8_t i = 0;
- static bool isValueRecv = false;
- static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
- CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
- if(!isValueRecv)
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- }
- #endif
- VACoutputCurrent = UPS.VAC_out;
- /* Отслеживается переход через верхнюю границу */
- if (VACoutputCurrent > sSettings.sAlarmManager.ac_output_range.high)
- {
- if (stateCurrentVACoutput == HYST_IDLE) {
- UPS.Alarm |= (1 << 7);
- stateCurrentVACoutput = HYST_UP;
- #if defined RELAY_DC_PRESENT
- relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 1);
- #endif
- log_event_data(LOG_ALARM_VAC_HIGH_OUTPUT, "Авария");
- #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
- // Отправка трапа о завышении
- SNMP_SendUserTrap(VAC_HIGH_OUTPUT_ALARM);
- syslog(SYSLOG_ERROR, "Высокое входное напряжение (%0.1f В)", VACoutputCurrent);
- #endif
- flUpdateLog = true;
- } else {
- #if defined RELAY_DC_PRESENT
- relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, DC_PRESENT);
- #endif
- }
- }
- /* Отслеживается нормализация */
- else if (VACoutputCurrent < (sSettings.sAlarmManager.ac_output_range.high - sSettings.sAlarmManager.ac_output_range.hyst))
- {
- if (stateCurrentVACoutput == HYST_UP) {
- UPS.Alarm &= 0xffffff7f;
- stateCurrentVACoutput = HYST_IDLE;
- #if defined RELAY_DC_PRESENT
- relay_setup_log(CurrROtype_Sourse, DC_PRESENT, 0);
- #endif
- log_event_data(LOG_ALARM_VAC_HIGH_OUTPUT, "Норма");
- #if HARDWARE_BT6711 || HARDWARE_BT6711_V1 || HARDWARE_BT6721
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(VAC_HIGH_OUTPUT_NORM);
- syslog(SYSLOG_NOTICE, "Выходное напряжение в норме (%0.1f В)", VACoutputCurrent);
- #endif
- flUpdateLog = true;
- }
- }
- if (UPS.Alarm & 0x80) {
- flLedAlarm = true;
- }
- #if defined RELAY_DC_PRESENT
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- }
- #endif
- }
- #endif
- /**
- * @brief Мониторинг бита LowBat
- */
- void UPS_LowBatMonitor(void)
- {
- #ifdef LOW_BAT_MONITOR
- static bool isValueRecv = false;
- static uint8_t lowBatOldState = 0;
- static bool flag_alarm_time = false;
- uint8_t lowBatCurrent;
- #if defined RELAY_CHARGE_AKB
- uint8_t i = 0;
- static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
- CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
- #endif
- if((UPS.Status >> 7) & 0x01)
- lowBatCurrent = (UPS.Status >> 6) & 0x01;
- else
- lowBatCurrent = 0;
-
- if (!isValueRecv) {
- isValueRecv = true;
- lowBatOldState = lowBatCurrent;
- if (lowBatCurrent){
- log_event_data(LOG_ALARM_LOW_BAT, "Авария");
- SNMP_SendUserTrap(LOW_BAT_ALARM);
- syslog(SYSLOG_ERROR, "Низкий заряд АКБ (%d%%)", UPS.SOC);
- flUpdateLog = true;
- #if defined RELAY_CHARGE_AKB
- relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1);
- #endif
- }
- else{
- SNMP_SendUserTrap(LOW_BAT_NORM);
- log_event_data(LOG_ALARM_LOW_BAT, "Норма");
- syslog(SYSLOG_NOTICE, "Заряд АКБ в норме (%d%%)", UPS.SOC);
- flUpdateLog = true;
- #if defined RELAY_CHARGE_AKB
- relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0);
- #endif
- }
- return;
- }
- // Значение параметра изменилось
- if (lowBatCurrent != lowBatOldState)
- {
- if(flag_alarm_time){
- flag_alarm_time = false;
- if (lowBatCurrent){
- SNMP_SendUserTrap(LOW_BAT_ALARM);
- syslog(SYSLOG_ERROR, "Низкий заряд АКБ (%d%%)", UPS.SOC);
- log_event_data(LOG_ALARM_LOW_BAT, "Авария");
- flUpdateLog = true;
- #ifdef RELAY_CHARGE_AKB
- relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1);
- #endif
- }
- else{
- SNMP_SendUserTrap(LOW_BAT_NORM);
- syslog(SYSLOG_NOTICE, "Заряд АКБ в норме (%d%%)", UPS.SOC);
- log_event_data(LOG_ALARM_LOW_BAT, "Норма");
- flUpdateLog = true;
- #if defined RELAY_CHARGE_AKB
- relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0);
- #endif
- }
- }
- else{
- flag_alarm_time = true;
- }
- }
- #if defined RELAY_CHARGE_AKB
- else{
- flag_alarm_time = false;
- if (lowBatCurrent)
- relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, CHARGE_AKB);
- }
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- }
- #endif
-
- if(!flag_alarm_time){
- if (lowBatCurrent){
- flNonCriticalAlarm = true;
- flLedAlarm = true;
- }
- lowBatOldState = lowBatCurrent;
- }
- else{
- if (lowBatOldState){
- flNonCriticalAlarm = true;
- flLedAlarm = true;
- }
- }
- #endif
- }
- static uint8_t UPS_LoadRangeAlarm(void)
- {
- #ifdef LOAD_MONITOR
- uint8_t flag = 0;
- static uint8_t stateCurrent = HYST_IDLE;
- float load = UPS.Load;
- /* Отслеживается переход через верхнюю границу */
- if (load > sSettings.sAlarmManager.load_range.high)
- {
- if (stateCurrent == HYST_IDLE || stateCurrent == HYST_UP) {
- stateCurrent = HYST_UP;
- flag = 1;
- }
- } else if (load < (sSettings.sAlarmManager.load_range.high - sSettings.sAlarmManager.load_range.hyst))
- {
- if (stateCurrent == HYST_UP)
- {
- stateCurrent = HYST_IDLE;
- flag = 0;
- }
- } else {
- if (stateCurrent == HYST_UP) {
- flag = 1;
- }
- }
- return flag;
- #endif
- }
- /**
- * @brief Мониторинг нагрузки
- */
- void UPS_PowerMonitor(void)
- {
- #ifdef LOAD_MONITOR
- uint8_t powerStatusCurrent;
- static uint8_t powerStatusOld = 0;
- if(!get_sync_data()) {
- return;
- }
- powerStatusCurrent = ((UPS.warn_status >> 5) & 0x01);
- powerStatusCurrent |= UPS_LoadRangeAlarm();
- if (powerStatusCurrent)
- {
- UPS.Alarm = (UPS.Alarm & 0xfffffffe) | (1 << 0);
- if (powerStatusCurrent != powerStatusOld)
- {
- #ifdef LED_RED_MINOR
- LED_On(LED_RED_MINOR);
- #endif
- #ifdef LED_GREEN_MINOR
- LED_On(LED_GREEN_MINOR);
- #endif
-
- log_event_data(LOG_ALARM_POWER, "Авария");
- // Отправка трапа о завышении
- SNMP_SendUserTrap(POWER_ALARM);
- syslog(SYSLOG_ERROR, "Авария нагрузки (%d%%)", UPS.Load);
- flUpdateLog = true;
- }
- }
- /* Отслеживается нормализация */
- else {
- UPS.Alarm = (UPS.Alarm & 0xfffffffe);
- if (powerStatusCurrent != powerStatusOld)
- {
- #ifdef LED_RED_MINOR
- LED_Off(LED_RED_MINOR);
- #endif
- #ifdef LED_GREEN_MINOR
- LED_Off(LED_GREEN_MINOR);
- #endif
- log_event_data(LOG_ALARM_POWER, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(POWER_NORM);
- syslog(SYSLOG_NOTICE, "Авария нагрузки нормализовалась (%d%%)", UPS.Load);
- flUpdateLog = true;
- }
- }
- powerStatusOld = powerStatusCurrent;
- if (UPS.Alarm & 0x00000001) {
- flCriticalAlarm = true;
- flLedAlarm = true;
- }
- #endif
- }
- #ifdef SENSOR_TEMP_MONITOR
- /**
- * @brief Мониторинг аварии датчика температуры
- */
- void sensorTemperatureMonitor(void)
- {
- float temperature;
- static uint8_t type_sensor[MAX_T_SENSORS];
- static uint8_t alarm[MAX_T_SENSORS];
- static uint8_t start_monitor = 0;
- if (start_monitor == 0) {
- start_monitor = 1;
- for(uint8_t i = 0; i < MAX_T_SENSORS; i ++){
- type_sensor[i] = sSettings.sTempControl[i].type_sensor;
- }
- }
- for(uint8_t i = 0; i < MAX_T_SENSORS; i ++){
- if (alarm[i] && sSettings.sTempControl[i].type_sensor != type_sensor[i]) {
- alarm[i] = 0;
- if (type_sensor[i] == TS_AKB) {
- log_event_data(LOG_ALARM_SENSOR_AKB, "Норма");
- flUpdateLog = true;
- } else if (type_sensor[i] == TS_CABINET) {
- log_event_data(LOG_ALARM_SENSOR_CABINET, "Норма");
- flUpdateLog = true;
- }
- }
- if (sSettings.sTempControl[i].type_sensor == TS_AKB) {
- GetInternalTempInt(&temperature);
- if(temperature == 85) {
- if(!alarm[i]) {
- log_event_data(LOG_ALARM_SENSOR_AKB, "Авария");
- flUpdateLog = true;
- flLedAlarm = true;
- alarm[i] = 1;
- }
- } else {
- if(alarm[i]) {
- log_event_data(LOG_ALARM_SENSOR_AKB, "Норма");
- flUpdateLog = true;
- alarm[i] = 0;
- }
- }
- } else if (sSettings.sTempControl[i].type_sensor == TS_CABINET) {
- GetTempCaseInt(&temperature);
- if(temperature == 85) {
- if(!alarm[i]) {
- log_event_data(LOG_ALARM_SENSOR_CABINET, "Авария");
- flUpdateLog = true;
- flLedAlarm = true;
- alarm[i] = 1;
- }
- } else {
- if(alarm[i]) {
- log_event_data(LOG_ALARM_SENSOR_CABINET, "Норма");
- flUpdateLog = true;
- alarm[i] = 0;
- }
- }
- }
- type_sensor[i] = sSettings.sTempControl[i].type_sensor;
- }
- }
- #endif
- #ifdef TEMP_AKB_MONITOR
- static uint8_t UPS_TempHighRangeAlarm(void)
- {
- uint8_t flag = 0;
- float temperature;
- static uint8_t stateCurrent = HYST_IDLE;
-
- GetInternalTempInt(&temperature);
- if(temperature == 85) {
- if (stateCurrent == HYST_UP) {
- stateCurrent = HYST_IDLE;
- flag = 0;
- }
- return flag;
- }
- /* Отслеживается переход через верхнюю границу */
- if (temperature > sSettings.sAlarmManager.Temprature_range.high)
- {
- if (stateCurrent == HYST_IDLE || stateCurrent == HYST_UP) {
- stateCurrent = HYST_UP;
- flag = 1;
- }
- } else if (temperature < (sSettings.sAlarmManager.Temprature_range.high - sSettings.sAlarmManager.Temprature_range.hyst))
- {
- if (stateCurrent == HYST_UP)
- {
- stateCurrent = HYST_IDLE;
- flag = 0;
- }
- } else {
- if (stateCurrent == HYST_UP) {
- flag = 1;
- }
- }
- return flag;
- }
- /**
- * @brief Мониторинг температуры по верхней границе
- */
- void UPS_TemperatureHighRangeMonitor(void)
- {
- float temperature;
- uint8_t tempStatusCurrent;
- static uint8_t tempStatusOld = 0;
-
- GetInternalTempInt(&temperature);
- tempStatusCurrent = ((UPS.warn_status >> 6) & 0x01);
- tempStatusCurrent |= UPS_TempHighRangeAlarm();
- if (tempStatusCurrent)
- {
- UPS.Alarm = (UPS.Alarm & 0xfffffffd) | (1 << 1);
- if (tempStatusCurrent != tempStatusOld) {
- log_event_data(LOG_ALARM_HIGH_TEMP, "Авария");
- // Отправка трапа о завышении
- SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_ALARM);
- syslog(SYSLOG_ERROR, "Высокая температура (%0.1f C)", temperature);
- flUpdateLog = true;
- }
- }
- /* Отслеживается нормализация */
- else {
- UPS.Alarm = (UPS.Alarm & 0xfffffffd);
- if (tempStatusCurrent != tempStatusOld) {
- log_event_data(LOG_ALARM_HIGH_TEMP, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_NORM);
- syslog(SYSLOG_NOTICE, "Температура в норме (%0.1f C)", temperature);
- flUpdateLog = true;
- }
- }
- tempStatusOld = tempStatusCurrent;
- if (UPS.Alarm & 0x00000002) {
- flCriticalAlarm = true;
- flLedAlarm = true;
- }
- }
- /**
- * @brief Мониторинг температуры по нижней границе
- */
- void UPS_TemperatureLowRangeMonitor(void)
- {
- float temperature;
- static uint8_t stateCurrent = HYST_IDLE;
- GetInternalTempInt(&temperature);
- if(temperature == 85) {
- UPS.Alarm = (UPS.Alarm & 0xfffffeff) | (1 << 8);
- if (stateCurrent == HYST_DOWN) {
- stateCurrent = HYST_IDLE;
- log_event_data(LOG_ALARM_LOW_TEMP, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(BATTERY_LOW_TEMPERATURE_NORM);
- syslog(SYSLOG_NOTICE, "Температура в норме (%0.1f C)", temperature);
- flUpdateLog = true;
- }
- return;
- } else {
- if (stateCurrent == HYST_IDLE) {
- UPS.Alarm = (UPS.Alarm & 0xfffffeff);
- }
- }
- /* Отслеживается переход через нипжнюю границу */
- if (temperature < sSettings.sAlarmManager.Temprature_range.low)
- {
- if (stateCurrent == HYST_IDLE)
- {
- stateCurrent = HYST_DOWN;
- UPS.Alarm = (UPS.Alarm & 0xfffffeff) | (1 << 8);
- log_event_data(LOG_ALARM_LOW_TEMP, "Авария");
- // Отправка трапа о занижении
- SNMP_SendUserTrap(BATTERY_LOW_TEMPERATURE_ALARM);
- syslog(SYSLOG_ERROR, "Низкая температура (%0.1f C)", temperature);
- flUpdateLog = true;
- }
- }
- /* Отслеживается нормализация */
- else if (temperature > (sSettings.sAlarmManager.Temprature_range.low + sSettings.sAlarmManager.Temprature_range.hyst))
- {
- if (stateCurrent == HYST_DOWN)
- {
- stateCurrent = HYST_IDLE;
- UPS.Alarm = (UPS.Alarm & 0xfffffeff);
- log_event_data(LOG_ALARM_LOW_TEMP, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(BATTERY_LOW_TEMPERATURE_NORM);
- syslog(SYSLOG_NOTICE, "Температура в норме (%0.1f C)", temperature);
- flUpdateLog = true;
- }
- }
- if (UPS.Alarm & 0x00000100) {
- flCriticalAlarm = true;
- flLedAlarm = true;
- }
- }
- #endif
- #ifdef TEMP_CABINET_MONITOR
- /**
- * @brief Мониторинг температуры шкафа по верхней границе
- */
- void Cabinet_TemperatureHighRangeMonitor(void)
- {
- float temperature;
- static uint8_t stateCurrent = HYST_IDLE;
-
- GetTempCaseInt(&temperature);
- if(temperature == 85) {
- UPS.Alarm = (UPS.Alarm & 0xfffffdff) | (1 << 9);
- if (stateCurrent == HYST_UP) {
- stateCurrent = HYST_IDLE;
- log_event_data(LOG_ALARM_HIGH_CABINET_TEMP, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(CABINET_HIGH_TEMPERATURE_NORM);
- flUpdateLog = true;
- }
- return;
- } else {
- if (stateCurrent == HYST_IDLE) {
- UPS.Alarm = (UPS.Alarm & 0xfffffdff);
- }
- }
- /* Отслеживается переход через верхнюю границу */
- if (temperature > sSettings.sAlarmManager.Temprature_cabinet_range.high)
- {
-
- if (stateCurrent == HYST_IDLE)
- {
- UPS.Alarm = (UPS.Alarm & 0xfffffdff) | (1 << 9);
- stateCurrent = HYST_UP;
-
- log_event_data(LOG_ALARM_HIGH_CABINET_TEMP, "Авария");
- // Отправка трапа о завышении
- SNMP_SendUserTrap(CABINET_HIGH_TEMPERATURE_ALARM);
- flUpdateLog = true;
- }
- }
- /* Отслеживается нормализация */
- else if (temperature < (sSettings.sAlarmManager.Temprature_cabinet_range.high - sSettings.sAlarmManager.Temprature_cabinet_range.hyst))
- {
- if (stateCurrent == HYST_UP)
- {
- UPS.Alarm = (UPS.Alarm & 0xfffffdff);
- stateCurrent = HYST_IDLE;
-
- log_event_data(LOG_ALARM_HIGH_CABINET_TEMP, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(CABINET_HIGH_TEMPERATURE_NORM);
- flUpdateLog = true;
- }
- }
- if (UPS.Alarm & 0x00000200) {
- flLedAlarm = true;
- }
- }
- /**
- * @brief Мониторинг температуры шкафа по нижней границе
- */
- void Cabinet_TemperatureLowRangeMonitor(void)
- {
- float temperature;
- static uint8_t stateCurrent = HYST_IDLE;
- GetTempCaseInt(&temperature);
- if(temperature == 85) {
- UPS.Alarm = (UPS.Alarm & 0xfffffbff) | (1 << 10);
- if (stateCurrent == HYST_DOWN) {
- stateCurrent = HYST_IDLE;
- log_event_data(LOG_ALARM_LOW_CABINET_TEMP, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(CABINET_LOW_TEMPERATURE_NORM);
- flUpdateLog = true;
- }
- return;
- } else {
- if (stateCurrent == HYST_IDLE) {
- UPS.Alarm = (UPS.Alarm & 0xfffffbff);
- }
- }
- /* Отслеживается переход через нипжнюю границу */
- if (temperature < sSettings.sAlarmManager.Temprature_cabinet_range.low)
- {
- if (stateCurrent == HYST_IDLE)
- {
- stateCurrent = HYST_DOWN;
- UPS.Alarm = (UPS.Alarm & 0xfffffbff) | (1 << 10);
- log_event_data(LOG_ALARM_LOW_CABINET_TEMP, "Авария");
- // Отправка трапа о занижении
- SNMP_SendUserTrap(CABINET_LOW_TEMPERATURE_ALARM);
- flUpdateLog = true;
- }
- }
- /* Отслеживается нормализация */
- else if (temperature > (sSettings.sAlarmManager.Temprature_cabinet_range.low + sSettings.sAlarmManager.Temprature_cabinet_range.hyst))
- {
- if (stateCurrent == HYST_DOWN)
- {
- UPS.Alarm = (UPS.Alarm & 0xfffffbff);
- stateCurrent = HYST_IDLE;
- log_event_data(LOG_ALARM_LOW_CABINET_TEMP, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(CABINET_LOW_TEMPERATURE_NORM);
- flUpdateLog = true;
- }
- }
- if (UPS.Alarm & 0x00000400) {
- flLedAlarm = true;
- }
- }
- #endif
- /**
- * @brief Мониторинг параметра upsParams.connect
- */
- void UPS_ConnectMonitor(void)
- {
- #ifdef UPS_CONNECT_MONITOR
- static bool isValueRecv = false;
- static ups_state_connection_t connectOldState;
- ups_state_connection_t connectCurrent;
-
- connectCurrent = UPS.Present;
- if(connectCurrent == UPS_WAIT_CONNECT) {
- return;
- }
-
- UPS.Alarm = (UPS.Alarm & 0xfffffffb) | ((connectCurrent^1) << 2);
- if (!isValueRecv) {
- isValueRecv = true;
- connectOldState = connectCurrent;
- if (connectCurrent == UPS_FAIL_CONNECT){
- log_event_data(LOG_ALARM_UPS, "Авария");
- SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);
- syslog_str(SYSLOG_ERROR, "Потеряна связь с ИБП");
- }
- else{
- log_event_data(LOG_ALARM_UPS, "Норма");
- SNMP_SendUserTrap(CONNECT_MONITOR_NORM);
- syslog_str(SYSLOG_NOTICE, "Восстановлена связь с ИБП");
- flUpdateLog = true;
- }
- return;
- }
- if (connectCurrent == UPS_FAIL_CONNECT){
- flCriticalAlarm = true;
- flLedAlarm = true;
- }
- // Значение параметра изменилось
- if (connectCurrent != connectOldState)
- {
- if (connectCurrent == UPS_CONNECTED){
- log_event_data(LOG_ALARM_UPS, "Норма");
- SNMP_SendUserTrap(CONNECT_MONITOR_NORM);
- syslog_str(SYSLOG_NOTICE, "Восстановлена связь с ИБП");
- flUpdateLog = true;
- }
- else{
- log_event_data(LOG_ALARM_UPS, "Авария");
- SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);
- syslog_str(SYSLOG_ERROR, "Потеряна связь с ИБП");
- }
- }
-
- connectOldState = connectCurrent;
- #endif
- }
- /**
- * @brief Мониторинг параметра upsParams.connect
- */
- void UPS_BatteryConnectMonitor(void)
- {
- #ifdef BAT_CONNECT_MONITOR
- static bool isValueRecv = false;
- static bool flag_alarm_time = false;
- static uint8_t AKBconnectOldState = 0;
- uint8_t AKBconnectCurrent;
- #if defined RELAY_OFF_AKB
- uint8_t i = 0;
- static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
- CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
- #endif
- if(((UPS.Status >> 7) & 0x01) == 0)
- AKBconnectCurrent = (UPS.Status >> 6) & 0x01;
- else{
- AKBconnectCurrent = 0;
- }
- AKBconnectCurrent |= UPS.warn_status & 0x01;
- UPS.Alarm = (UPS.Alarm & 0xfffffff7) | (AKBconnectCurrent << 3);
- if (!isValueRecv) {
- isValueRecv = true;
- AKBconnectOldState = AKBconnectCurrent;
- if (AKBconnectCurrent){
- log_event_data(LOG_ALARM_AKB, "Авария");
- SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);
- syslog_str(SYSLOG_ERROR, "Авария связи с АКБ");
- flUpdateLog = true;
- #if defined RELAY_OFF_AKB
- relay_setup_log(CurrROtype_Sourse, OFF_AKB, 1);
- #endif
- }
- else{
- log_event_data(LOG_ALARM_AKB, "Норма");
- SNMP_SendUserTrap(BATTERY_CONNECT_NORM);
- syslog_str(SYSLOG_NOTICE, "Связь с АКБ восстановлена");
- flUpdateLog = true;
- #if defined RELAY_OFF_AKB
- relay_setup_log(CurrROtype_Sourse, OFF_AKB, 0);
- #endif
- }
- return;
- }
- // Значение параметра изменилось
- if (AKBconnectCurrent != AKBconnectOldState)
- {
- if(flag_alarm_time){
- flag_alarm_time = false;
- if (!AKBconnectCurrent){
- log_event_data(LOG_ALARM_AKB, "Норма");
- SNMP_SendUserTrap(BATTERY_CONNECT_NORM);
- syslog_str(SYSLOG_NOTICE, "Связь с АКБ восстановлена");
- flUpdateLog = true;
- #if defined RELAY_OFF_AKB
- relay_setup_log(CurrROtype_Sourse, OFF_AKB, 0);
- #endif
- }
- else{
- log_event_data(LOG_ALARM_AKB, "Авария");
- SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);
- syslog_str(SYSLOG_ERROR, "Авария связи с АКБ");
- flUpdateLog = true;
- #if defined RELAY_OFF_AKB
- relay_setup_log(CurrROtype_Sourse, OFF_AKB, 1);
- #endif
- }
- }
- else{
- flag_alarm_time = true;
- }
- }
- #if defined RELAY_OFF_AKB
- else{
- flag_alarm_time = false;
- if (AKBconnectCurrent)
- relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, OFF_AKB);
- }
- for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){
- OldROtype_Sourse[i] = CurrROtype_Sourse[i];
- }
- #endif
- if(!flag_alarm_time){
- if (AKBconnectCurrent){
- flCriticalAlarm = true;
- flLedAlarm = true;
- }
- AKBconnectOldState = AKBconnectCurrent;
- }
- else{
- if (AKBconnectOldState){
- flCriticalAlarm = true;
- flLedAlarm = true;
- }
- }
- #endif
- }
- #ifdef AKB_CHANGE_MONITOR
- /**
- * @brief Мониторинг параметра замены АКБ
- */
- void AKB_Change_Monitor(void)
- {
- uint32_t data_change = sSettings.UPS_Setting.set_data + (31536000*sSettings.UPS_Setting.life_time);
- TM_RTC_t tmp_data;
- static bool isValueRecv = false;
- static uint8_t status_change_akb = 0;
- uint8_t curr_status_change_akb = 0;
-
- TM_RTC_GetDateTime(&tmp_data, TM_RTC_Format_BIN);
-
- if (tmp_data.unix >= data_change) {
- UPS.Alarm |= (1 << 6);
- curr_status_change_akb = 1;
- flCriticalAlarm = true;
- flLedAlarm = true;
- }
- else {
- UPS.Alarm &= 0xffffffbf;
- curr_status_change_akb = 0;
- }
- if (!isValueRecv) {
- isValueRecv = true;
- status_change_akb = curr_status_change_akb;
- if (curr_status_change_akb){
- log_event_data(LOG_ALARM_CHANGE_AKB, "Авария");
- SNMP_SendUserTrap(BATTERY_CHANGE_ALARM);
- flUpdateLog = true;
- }
- else{
- log_event_data(LOG_ALARM_CHANGE_AKB, "Норма");
- SNMP_SendUserTrap(BATTERY_CHANGE_MORM);
- flUpdateLog = true;
- }
- return;
- }
- // Значение параметра изменилось
- if (status_change_akb != curr_status_change_akb)
- {
- if (curr_status_change_akb){
- log_event_data(LOG_ALARM_CHANGE_AKB, "Авария");
- SNMP_SendUserTrap(BATTERY_CHANGE_ALARM);
- flUpdateLog = true;
- } else {
- log_event_data(LOG_ALARM_CHANGE_AKB, "Норма");
- SNMP_SendUserTrap(BATTERY_CHANGE_MORM);
- flUpdateLog = true;
- }
- }
- status_change_akb = curr_status_change_akb;
- }
- #endif
- #ifdef UPS_FAILED_MONITOR
- void UPS_Failed_Monitor(void)
- {
- static bool isValueRecv = false;
- static uint8_t UPSFailOldState = 0;
- uint8_t UPSFailCurrent;
- UPSFailCurrent = (UPS.Status >> 4) & 0x01;
-
- if (!isValueRecv) {
- isValueRecv = true;
- UPSFailOldState = UPSFailCurrent;
- if (UPSFailCurrent){
- log_event_data(LOG_ALARM_UPS_FAILED, "Авария");
- SNMP_SendUserTrap(UPS_ALARM);
- flUpdateLog = true;
- }
- else{
- log_event_data(LOG_ALARM_UPS_FAILED, "Норма");
- SNMP_SendUserTrap(UPS_NORM);
- flUpdateLog = true;
- }
- return;
- }
- if (UPSFailCurrent){
- flCriticalAlarm = true;
- flLedAlarm = true;
- }
-
- // Значение параметра изменилось
- if (UPSFailCurrent != UPSFailOldState)
- {
- if (UPSFailCurrent){
- log_event_data(LOG_ALARM_UPS_FAILED, "Авария");
- SNMP_SendUserTrap(UPS_ALARM);
- flUpdateLog = true;
- }
- else{
- log_event_data(LOG_ALARM_UPS_FAILED, "Норма");
- SNMP_SendUserTrap(UPS_NORM);
- flUpdateLog = true;
- }
- }
- UPSFailOldState = UPSFailCurrent;
- }
- #endif
- #ifdef PHASE_FAIL_MONITOR
- void UPS_PhaseFailMonitor(void)
- {
- static bool isValueRecv = false;
- uint8_t phaseStatusCurrent;
- static uint8_t phaseStatusOld = 0;
- phaseStatusCurrent = ((UPS.warn_status >> 1) & 0x01);
- if (phaseStatusCurrent != 0){
- flCriticalAlarm = true;
- flLedAlarm = true;
- UPS.Alarm = (UPS.Alarm & 0xfffffeff) | (1 << 8);
- } else {
- UPS.Alarm = (UPS.Alarm & 0xfffffeff);
- }
- if (!isValueRecv) {
- isValueRecv = true;
- phaseStatusOld = phaseStatusCurrent;
- if (phaseStatusCurrent != 0){
- log_event_data(LOG_PHASE_FAIL, "Авария");
- // Отправка трапа о завышении
- SNMP_SendUserTrap(PHASE_FAIL);
- syslog(SYSLOG_ERROR, "Ошибка подкл. вх. напряжения");
- flUpdateLog = true;
- }
- else{
- log_event_data(LOG_PHASE_FAIL, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(PHASE_NORM);
- syslog(SYSLOG_NOTICE, "Подкл. вх. напряжения в норме");
- flUpdateLog = true;
- }
- return;
- }
- if (phaseStatusCurrent)
- {
- if (phaseStatusCurrent != phaseStatusOld)
- {
- log_event_data(LOG_PHASE_FAIL, "Авария");
- // Отправка трапа о завышении
- SNMP_SendUserTrap(PHASE_FAIL);
- syslog(SYSLOG_ERROR, "Ошибка подкл. вх. напряжения");
- flUpdateLog = true;
- }
- }
- /* Отслеживается нормализация */
- else {
- if (phaseStatusCurrent != phaseStatusOld)
- {
- log_event_data(LOG_PHASE_FAIL, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(PHASE_NORM);
- syslog(SYSLOG_NOTICE, "Подкл. вх. напряжения в норме");
- flUpdateLog = true;
- }
- }
- phaseStatusOld = phaseStatusCurrent;
- }
- #endif
- #ifdef EPO_MONITOR
- void UPS_EPOMonitor(void)
- {
- static bool isValueRecv = false;
- uint8_t EPOStatusCurrent;
- static uint8_t EPOStatusOld = 0;
- EPOStatusCurrent = ((UPS.warn_status >> 8) & 0x01);
- if (EPOStatusCurrent != 0){
- flCriticalAlarm = true;
- flLedAlarm = true;
- UPS.Alarm = (UPS.Alarm & 0xfffffdff) | (1 << 9);
- } else {
- UPS.Alarm = (UPS.Alarm & 0xfffffdff);
- }
- if (!isValueRecv) {
- isValueRecv = true;
- EPOStatusOld = EPOStatusCurrent;
- if (EPOStatusCurrent != 0){
- log_event_data(LOG_EPO_FAIL, "Авария");
- // Отправка трапа о завышении
- SNMP_SendUserTrap(EPO_FAIL);
- syslog(SYSLOG_ERROR, "Срабатывание EPO");
- flUpdateLog = true;
- }
- else{
- log_event_data(LOG_EPO_FAIL, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(EPO_NORM);
- syslog(SYSLOG_NOTICE, "EPO в норме");
- flUpdateLog = true;
- }
- return;
- }
- if (EPOStatusCurrent)
- {
- if (EPOStatusCurrent != EPOStatusOld)
- {
- log_event_data(LOG_EPO_FAIL, "Авария");
- // Отправка трапа о завышении
- SNMP_SendUserTrap(EPO_FAIL);
- syslog(SYSLOG_ERROR, "Ошибка EPO");
- flUpdateLog = true;
- }
- }
- /* Отслеживается нормализация */
- else {
- if (EPOStatusCurrent != EPOStatusOld)
- {
- log_event_data(LOG_EPO_FAIL, "Норма");
- // Отправка трапа о нормализации
- SNMP_SendUserTrap(EPO_NORM);
- syslog(SYSLOG_NOTICE, "EPO в норме");
- flUpdateLog = true;
- }
- }
- EPOStatusOld = EPOStatusCurrent;
- }
- #endif
- #ifdef OVERTEMPRATURE_MONITOR
- void UPS_OverTempratureMonitor(void)
- {
- if (((UPS.fault_type == 0x41) || (UPS.fault_type == 0x13)) && (UPS.Temp < 55) && ((UPS.Status >> 7) & 0x01)) {
- UPScmd(ups_remote_turn_off);
- xTimerStart(UPSRestartTimer, 0);
- UPS.fault_type = 0;
- }
- }
- #endif
- #ifdef INVERTERHIGHVOLTAGE_MONITOR
- void UPS_InventerHighVoltageMonitor(void)
- {
- if(UPS.fault_type == 0x12) {
- xTimerStart(UPSTurnOffTimer, 0);
- UPS.fault_type = 0;
- }
- }
- #endif
- /********************************* (C) РОТЕК **********************************/
|