unknown 2 долоо хоног өмнө
parent
commit
fafed10d9a
1 өөрчлөгдсөн 146 нэмэгдсэн , 0 устгасан
  1. 146 0
      c/test/bt6721.c

+ 146 - 0
c/test/bt6721.c

@@ -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;
+}