Преглед на файлове

[BT-6711][ups_monitor] detect alarm by new method

balbekova преди 4 години
родител
ревизия
272e3f5aea
променени са 5 файла, в които са добавени 143 реда и са изтрити 59 реда
  1. 25 3
      modules/MegaTec/megatec.c
  2. 2 0
      modules/MegaTec/megatec.h
  3. 104 56
      modules/monitor/ups_monitor.c
  4. 11 0
      modules/parameters.c
  5. 1 0
      modules/parameters.h

+ 25 - 3
modules/MegaTec/megatec.c

@@ -90,6 +90,7 @@ const char *MegaTecCMD[] = {
     "PDA\r",
     "PDA\r",
     "QMOD\r",
     "QMOD\r",
     "SON\r",
     "SON\r",
+    "QWS\r",
 };
 };
 
 
 extern bool flUpdateLog;
 extern bool flUpdateLog;
@@ -108,6 +109,7 @@ void init_UPS_value(void)
     UPS.Status = 0;
     UPS.Status = 0;
     UPS.Mode = 0;
     UPS.Mode = 0;
     UPS.Alarm = 0;
     UPS.Alarm = 0;
+    UPS.warn_status = 0;
     UPS.Test_Status = 0;
     UPS.Test_Status = 0;
     UPS.cnt_err_ups = 0;
     UPS.cnt_err_ups = 0;
     UPS.Flag_Present = false;
     UPS.Flag_Present = false;
@@ -786,6 +788,22 @@ void ups_mode_response(char *data)
     UPS.Mode = data[0]; 
     UPS.Mode = data[0]; 
 }
 }
 
 
+#define BIT_OFFSET(c, offset) ((c - 0x30) << offset)
+
+char ups_warn_status_response(char *data)
+{
+    if (data[0] != '(') {
+        return;
+    }
+    UPS.Present = true;
+    UPS.Flag_Present = true;
+    UPS.cnt_err_ups = 0;
+
+    data++;
+
+    UPS.warn_status = BIT_OFFSET(data[0], 0) + BIT_OFFSET(data[5], 1) + BIT_OFFSET(data[6], 2) + BIT_OFFSET(data[7], 3) + BIT_OFFSET(data[8], 4) + BIT_OFFSET(data[12], 5) + BIT_OFFSET(data[13], 6); 
+}
+
 void ups_megatec_process_pdu(cmdMegaTecEnums_t command)
 void ups_megatec_process_pdu(cmdMegaTecEnums_t command)
 {
 {
     switch (command) {
     switch (command) {
@@ -828,6 +846,9 @@ void ups_megatec_process_pdu(cmdMegaTecEnums_t command)
         case ups_mode_req:
         case ups_mode_req:
             ups_mode_response(ups_pdu.data);
             ups_mode_response(ups_pdu.data);
             break;
             break;
+        case ups_warning_status:
+            ups_warn_status_response(ups_pdu.data);
+            break;
         default:
         default:
             break;
             break;
     }
     }
@@ -945,7 +966,7 @@ void kstar_mode(void)
 void request_task(void *params)
 void request_task(void *params)
 {
 {
     uint8_t kestar_req[3] = { ups_status_req, ups_remain_time_reg, ups_info};
     uint8_t kestar_req[3] = { ups_status_req, ups_remain_time_reg, ups_info};
-    uint8_t voltronic_req[7] = {ups_status_req, ups_akb_info, ups_model_req, ups_version_req, ups_version2_req, ups_serial_req, ups_mode_req};//
+    uint8_t voltronic_req[8] = {ups_status_req, ups_akb_info, ups_model_req, ups_version_req, ups_version2_req, ups_serial_req, ups_mode_req, ups_warning_status};//
     uint8_t num_req = 0;
     uint8_t num_req = 0;
     uint8_t *req;
     uint8_t *req;
 
 
@@ -967,6 +988,7 @@ void request_task(void *params)
                     UPS.Mode = 0;
                     UPS.Mode = 0;
                     UPS.Test_Status = 0;
                     UPS.Test_Status = 0;
                     UPS.Alarm = 0;
                     UPS.Alarm = 0;
+                    UPS.warn_status = 0;
                     UPS.Present = false;
                     UPS.Present = false;
 
 
                     //memset(UPS.model, 0, 11);
                     //memset(UPS.model, 0, 11);
@@ -1030,8 +1052,8 @@ void request_task(void *params)
                 megatec_send = true;
                 megatec_send = true;
             }
             }
         }
         }
-        if(sSettings.UPS_Setting.type_ups == ups_kestar 
-            || sSettings.UPS_Setting.type_ups == ups_offline) {
+        if(UPS.Flag_Present && (sSettings.UPS_Setting.type_ups == ups_kestar 
+            || sSettings.UPS_Setting.type_ups == ups_offline)) {
                 kstar_mode();
                 kstar_mode();
         }
         }
     }
     }

+ 2 - 0
modules/MegaTec/megatec.h

@@ -51,6 +51,7 @@ typedef enum{
 	ups_buzzer_cntrl,
 	ups_buzzer_cntrl,
 	ups_mode_req,
 	ups_mode_req,
 	ups_remote_turn_on,
 	ups_remote_turn_on,
+	ups_warning_status,
 
 
 	MegaTec_cmd_max
 	MegaTec_cmd_max
 } cmdMegaTecEnums_t;
 } cmdMegaTecEnums_t;
@@ -70,6 +71,7 @@ typedef struct{
 	uint8_t Status;
 	uint8_t Status;
 	uint8_t Mode;
 	uint8_t Mode;
 	uint8_t Test_Status;
 	uint8_t Test_Status;
+	uint8_t warn_status;
 	char model[16];
 	char model[16];
 	char vertion[22];
 	char vertion[22];
 	char serial[15];
 	char serial[15];

+ 104 - 56
modules/monitor/ups_monitor.c

@@ -864,22 +864,53 @@ void UPS_LowBatMonitor(void)
 #endif
 #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;
+        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  Мониторинг нагрузки 
   * @brief  Мониторинг нагрузки 
   */
   */
 void UPS_PowerMonitor(void)
 void UPS_PowerMonitor(void)
 {
 {
 #ifdef LOAD_MONITOR
 #ifdef LOAD_MONITOR
-  float load;
-  static uint8_t stateCurrent = HYST_IDLE;
-    
-  load = UPS.Load;
+  uint8_t powerStatusCurrent;
+  static uint8_t powerStatusOld = 0;
 
 
-  /* Отслеживается переход через верхнюю границу */
-  if (load > sSettings.sAlarmManager.load_range.high)
+  powerStatusCurrent = ((UPS.warn_status >> 4) & 0x01);
+  powerStatusCurrent |= UPS_LoadRangeAlarm();
+
+  if (powerStatusCurrent)
   {
   {
 	  UPS.Alarm = (UPS.Alarm & 0xfffffffe) | (1 << 0);
 	  UPS.Alarm = (UPS.Alarm & 0xfffffffe) | (1 << 0);
-    if (stateCurrent == HYST_IDLE)
+    if (powerStatusCurrent != powerStatusOld)
 	{
 	{
 #ifdef LED_RED_MINOR
 #ifdef LED_RED_MINOR
       LED_On(LED_RED_MINOR);
       LED_On(LED_RED_MINOR);
@@ -887,37 +918,35 @@ void UPS_PowerMonitor(void)
 #ifdef LED_GREEN_MINOR
 #ifdef LED_GREEN_MINOR
       LED_On(LED_GREEN_MINOR);
       LED_On(LED_GREEN_MINOR);
 #endif
 #endif
-	  stateCurrent = HYST_UP;
       
       
 	  log_event_data(LOG_ALARM_POWER, "Авария");
 	  log_event_data(LOG_ALARM_POWER, "Авария");
 	  // Отправка трапа о завышении 
 	  // Отправка трапа о завышении 
 	  SNMP_SendUserTrap(POWER_ALARM);
 	  SNMP_SendUserTrap(POWER_ALARM);
-	  syslog(SYSLOG_ERROR, "Авария нагрузки (%d%%)", load);
+	  syslog(SYSLOG_ERROR, "Авария нагрузки (%d%%)", UPS.Load);
 	  flUpdateLog = true;
 	  flUpdateLog = true;
 	}
 	}
   }
   }
   /* Отслеживается нормализация */
   /* Отслеживается нормализация */
-  else if (load < (sSettings.sAlarmManager.load_range.high - sSettings.sAlarmManager.load_range.hyst))
-  {
-	UPS.Alarm = (UPS.Alarm & 0xfffffffe);
-  if (stateCurrent == HYST_UP)
-	{
+  else {
+    UPS.Alarm = (UPS.Alarm & 0xfffffffe);
+    if (powerStatusCurrent != powerStatusOld)
+    {
 #ifdef LED_RED_MINOR
 #ifdef LED_RED_MINOR
-    	LED_Off(LED_RED_MINOR);
+        LED_Off(LED_RED_MINOR);
 #endif
 #endif
 #ifdef LED_GREEN_MINOR
 #ifdef LED_GREEN_MINOR
-    	LED_Off(LED_GREEN_MINOR);
-#endif
-	  stateCurrent = HYST_IDLE;
-      
-	  log_event_data(LOG_ALARM_POWER, "Норма");
-	  // Отправка трапа о нормализации 
-	  SNMP_SendUserTrap(POWER_NORM);
-	  syslog(SYSLOG_NOTICE, "Авария нагрузки нормализовалась (%d%%)", load);
-	  flUpdateLog = true;
-	}
+        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) {
   if (UPS.Alarm & 0x00000001) {
     flCriticalAlarm = true;
     flCriticalAlarm = true;
     flLedAlarm = true;
     flLedAlarm = true;
@@ -994,55 +1023,73 @@ void sensorTemperatureMonitor(void)
 #endif
 #endif
 
 
 #ifdef TEMP_AKB_MONITOR
 #ifdef TEMP_AKB_MONITOR
-/**
-  * @brief  Мониторинг температуры по верхней границе
-  */
-void UPS_TemperatureHighRangeMonitor(void)
+
+static uint8_t UPS_TempHighRangeAlarm(void)
 {
 {
+  uint8_t flag = 0;
   float temperature;
   float temperature;
   static uint8_t stateCurrent = HYST_IDLE;
   static uint8_t stateCurrent = HYST_IDLE;
     
     
   GetInternalTempInt(&temperature);
   GetInternalTempInt(&temperature);
 
 
   if(temperature == 85) {
   if(temperature == 85) {
-    UPS.Alarm = (UPS.Alarm & 0xfffffffd) | (1 << 1);
     if (stateCurrent == HYST_UP) {
     if (stateCurrent == HYST_UP) {
       stateCurrent = HYST_IDLE;
       stateCurrent = HYST_IDLE;
-      log_event_data(LOG_ALARM_HIGH_TEMP, "Норма");
-      // Отправка трапа о нормализации
-	    SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_NORM);
-      syslog(SYSLOG_NOTICE, "Температура в норме (%0.1f C)", temperature);
-      flUpdateLog = true;
-    }
-    return;
-  } else {
-    if (stateCurrent == HYST_IDLE) {
-      UPS.Alarm = (UPS.Alarm & 0xfffffffd);
+      flag = 0;
     }
     }
+    return flag;
   }
   }
 
 
   /* Отслеживается переход через верхнюю границу */
   /* Отслеживается переход через верхнюю границу */
   if (temperature > sSettings.sAlarmManager.Temprature_range.high)
   if (temperature > sSettings.sAlarmManager.Temprature_range.high)
   {
   {
-    if (stateCurrent == HYST_IDLE)
-	  {
-	    stateCurrent = HYST_UP;
-      UPS.Alarm = (UPS.Alarm & 0xfffffffd) | (1 << 1);
+     if (stateCurrent == HYST_IDLE) {
+        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);
 
 
-	  log_event_data(LOG_ALARM_HIGH_TEMP, "Авария");
-	  // Отправка трапа о завышении 
-	  SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_ALARM);
-	  syslog(SYSLOG_ERROR, "Высокая температура (%0.1f C)", temperature);
-	  flUpdateLog = true;
-	}
+  tempStatusCurrent = ((UPS.warn_status >> 5) & 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 if (temperature < (sSettings.sAlarmManager.Temprature_range.high - sSettings.sAlarmManager.Temprature_range.hyst))
-  {
-    if (stateCurrent == HYST_UP)
-	  {
-	    stateCurrent = HYST_IDLE;
-      UPS.Alarm = (UPS.Alarm & 0xfffffffd);
+  else {
+    UPS.Alarm = (UPS.Alarm & 0xfffffffd);
+    if (tempStatusCurrent != tempStatusOld) {
 	    log_event_data(LOG_ALARM_HIGH_TEMP, "Норма");
 	    log_event_data(LOG_ALARM_HIGH_TEMP, "Норма");
 	  // Отправка трапа о нормализации 
 	  // Отправка трапа о нормализации 
 	    SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_NORM);
 	    SNMP_SendUserTrap(BATTERY_HIGH_TEMPERATURE_NORM);
@@ -1050,6 +1097,7 @@ void UPS_TemperatureHighRangeMonitor(void)
 	    flUpdateLog = true;
 	    flUpdateLog = true;
 	  }
 	  }
   }
   }
+  tempStatusOld = tempStatusCurrent;
   if (UPS.Alarm & 0x00000002) {
   if (UPS.Alarm & 0x00000002) {
     flCriticalAlarm = true;
     flCriticalAlarm = true;
     flLedAlarm = true;
     flLedAlarm = true;

+ 11 - 0
modules/parameters.c

@@ -1639,6 +1639,17 @@ void GetSyslogEnable(char *str, uint8_t *len)
   str[0] = sSettings.sSyslog.enabled ? '1' : '0';
   str[0] = sSettings.sSyslog.enabled ? '1' : '0';
   *len = 1;
   *len = 1;
 }
 }
+
+void GetSyslogEnableStrRU(char *str, uint8_t *len)
+{
+  if(sSettings.sSyslog.enabled) {
+    strcpy(str, "Включена");
+  } else {
+    strcpy(str, "Выключена");
+  } 
+  *len = strlen(str);
+}
+
 void GetSyslogServer(char *str, uint8_t *len)
 void GetSyslogServer(char *str, uint8_t *len)
 {
 {
   *len = sprintf(str, "%s", ipaddr_ntoa(&sSettings.sSyslog.server_ip));
   *len = sprintf(str, "%s", ipaddr_ntoa(&sSettings.sSyslog.server_ip));

+ 1 - 0
modules/parameters.h

@@ -620,6 +620,7 @@ void GetFTPPassword(char *str, uint8_t *len);
 //                             Параметры Syslog
 //                             Параметры Syslog
 
 
 void GetSyslogEnable(char *str, uint8_t *len);
 void GetSyslogEnable(char *str, uint8_t *len);
+void GetSyslogEnableStrRU(char *str, uint8_t *len);
 void GetSyslogServer(char *str, uint8_t *len);
 void GetSyslogServer(char *str, uint8_t *len);
 void GetSyslogPort(char *str, uint8_t *len);
 void GetSyslogPort(char *str, uint8_t *len);
 #endif // FTP_ENABLE
 #endif // FTP_ENABLE