#include /**   * @brief  Мониторинг бита LainFail   */ void UPS_LineFailMonitor(void) { static bool isValueRecv = false; static uint8_t lineFailOldState = 0; uint8_t lineFailCurrent; char log_string[50]; uint8_t len; lineFailCurrent = ((UPS.Status >> 7) & 0x01); lineFailCurrent |= UPS_VACinputRangeAlarm(); // Заходит в условие только 1 раз. 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; } else { 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) { 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; } else { if (UPS.VAC_in == 0) { return; } log_event_data(LOG_ALARM_LINE, "Норма"); SNMP_SendUserTrap(LINE_NORM); syslog(SYSLOG_NOTICE, "Сеть в норме (%0.1f В)", UPS.VAC_in); flUpdateLog = true; } } lineFailOldState = lineFailCurrent; } uint8_t UPS_VACinputRangeAlarm(void) { 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; }