|
@@ -0,0 +1,146 @@
|
|
|
+#include <stdbool>
|
|
|
+
|
|
|
+/**
|
|
|
+ * @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;
|
|
|
+}
|