Browse Source

add monitor alarm

balbekova 8 years ago
parent
commit
8ab7aaae27
2 changed files with 529 additions and 0 deletions
  1. 452 0
      modules/monitor/ups_monitor.c
  2. 77 0
      modules/monitor/ups_monitor.h

+ 452 - 0
modules/monitor/ups_monitor.c

@@ -0,0 +1,452 @@
+/********************************* (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.
+ *******************************************************************************
+ */
+   
+#include "stm32f4xx.h"
+#include "ups_monitor.h"
+#include "parameters.h"
+#include "settings_api.h"
+#include "megatec.h"
+#include "led.h"
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+#include "trap_api.h"
+#include "snmp_api.h"
+
+#include <stdbool.h>
+
+#define UPS_LOAD                70.0    // Нагрука (граница)
+#define UPS_LOAD_HIST           1.0     // Гистерезис нагрузки 
+
+#define UPS_TEMPERATURE         40.0    // Температура (граница)
+#define UPS_TEMPERATURE_HIST    1.0     // Гистерезис температуры 
+
+
+bool flCriticalAlarm = false;
+bool flNonCriticalAlarm = false;
+
+/**
+  * @brief  Общая структура настроек
+  */
+extern SETTINGS_t sSettings;
+
+
+/**
+  * @brief  Задача мониторинга параметров UPS
+  */
+void UPS_Monitor(void *params)
+{
+  for (;;)
+  {
+	  flCriticalAlarm = false;
+	  flNonCriticalAlarm = false;
+    // Проверяем флаг подключения UPS
+   //if (UPS.Present)
+    {
+      UPS_LineFailMonitor();
+      UPS_LowBatMonitor();  
+      UPS_PowerMonitor();
+      UPS_TemperatureMonitor();
+      UPS_BatteryConnectMonitor();
+    }
+    UPS_ConnectMonitor();
+    UPS_DI0Monitor();
+
+    UPS_CriticalAlarmMonitor();
+    UPS_NonCriticalAlarmMonitor();
+      
+    vTaskDelay(1000);
+  }
+}
+
+/**
+  * @brief  Мониторинг бита DI0 state
+  */
+void UPS_DI0Monitor(void)
+{
+  static bool isValueRecv = false;
+  static uint8_t DI0OldState = 0;
+  uint8_t DI0StateCurrent;
+
+  DI0StateCurrent = get_state_din_outs(DIN1);
+
+  	if (!isValueRecv) {
+	  isValueRecv = true;
+	  DI0OldState = DI0StateCurrent;
+	  return;
+	}
+
+	if (DI0StateCurrent)
+	  flCriticalAlarm = true;
+
+	// Значение параметра изменилось
+	if (DI0StateCurrent != DI0OldState)
+	{
+	  if(sSettings.sInOuts.din_type_act[0] == SNMP_TRAP)
+	  {
+		  if (DI0StateCurrent)
+			SNMP_SendUserTrap(DI0_NORM);
+		  else
+			SNMP_SendUserTrap(DI0_ALARM);
+	  }
+	}
+
+	DI0OldState = DI0StateCurrent;
+}
+
+/**
+  * @brief  Мониторинг бита CriticalAlarm
+  */
+void UPS_CriticalAlarmMonitor(void)
+{
+  static bool isValueRecv = false;
+  static uint8_t CriticalAlarmOldState = 0;
+  uint8_t CriticalAlarmCurrent;
+  static uint8_t OldRO0type_Sourse = 0;
+  static uint8_t OldRO2type_Sourse = 0;
+  uint8_t CurrRO2type_Sourse = 0;
+  uint8_t CurrRO1type_Sourse = 0;
+
+  CurrRO1type_Sourse = sSettings.sInOuts.ro_type_source[0];
+  CurrRO2type_Sourse = sSettings.sInOuts.ro_type_source[1];
+  CriticalAlarmCurrent = flCriticalAlarm;
+
+  if (!isValueRecv) {
+	isValueRecv = true;
+	CriticalAlarmOldState = CriticalAlarmCurrent;
+	OldRO0type_Sourse = CurrRO1type_Sourse;
+	OldRO2type_Sourse = CurrRO2type_Sourse;
+	return;
+  }
+
+  if(CriticalAlarmCurrent){
+	  if (UPS.Present)
+		  LED_Toggle(LED_MAJOR_R);
+	  else
+		  LED_On(LED_MAJOR_R);
+  }
+  else{
+	  LED_Off(LED_MAJOR_R);
+  }
+
+  // Значение параметра изменилось
+  if (CriticalAlarmCurrent != CriticalAlarmOldState)
+  {
+	  if(OldRO0type_Sourse == CRITICAL){
+		  if(CriticalAlarmCurrent)
+			  SetROInt(1, 0);
+		  else
+			  SetROInt(0, 0);
+		  SNMP_SendUserTrap(DO0_TOGGLED);
+	  }
+	  if(OldRO2type_Sourse == CRITICAL){
+		  if(CriticalAlarmCurrent)
+			  SetROInt(1, 1);
+		  else
+			  SetROInt(0, 1);
+	  	  SNMP_SendUserTrap(DO1_TOGGLED);
+	  }
+  }
+  else
+  {
+	  if(OldRO0type_Sourse == CRITICAL && OldRO0type_Sourse != OldRO0type_Sourse){
+		  if(CriticalAlarmCurrent)
+			  SetROInt(1, 0);
+		  else
+			  SetROInt(0, 0);
+		  SNMP_SendUserTrap(DO0_TOGGLED);
+	  }
+	  if(OldRO2type_Sourse == CRITICAL && OldRO2type_Sourse != OldRO2type_Sourse){
+		  if(CriticalAlarmCurrent)
+			  SetROInt(1, 1);
+		  else
+			  SetROInt(0, 1);
+		  SNMP_SendUserTrap(DO1_TOGGLED);
+	  }
+  }
+
+  OldRO0type_Sourse = CurrRO1type_Sourse;
+  OldRO2type_Sourse = CurrRO2type_Sourse;
+  CriticalAlarmOldState = CriticalAlarmCurrent;
+}
+
+/**
+  * @brief  Мониторинг бита NonCriticalAlarm
+  */
+void UPS_NonCriticalAlarmMonitor(void)
+{
+  static bool isValueRecv = false;
+  static uint8_t NonCriticalAlarmOldState = 0;
+  uint8_t NonCriticalAlarmCurrent;
+  static uint8_t OldRO0type_Sourse = 0;
+  static uint8_t OldRO2type_Sourse = 0;
+  uint8_t CurrRO2type_Sourse = 0;
+  uint8_t CurrRO1type_Sourse = 0;
+
+  CurrRO1type_Sourse = sSettings.sInOuts.ro_type_source[0];
+  CurrRO2type_Sourse = sSettings.sInOuts.ro_type_source[1];
+  NonCriticalAlarmCurrent = flNonCriticalAlarm;
+
+  if (!isValueRecv) {
+	isValueRecv = true;
+	NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
+	OldRO0type_Sourse = CurrRO1type_Sourse;
+	OldRO2type_Sourse = CurrRO2type_Sourse;
+	return;
+  }
+
+  // Значение параметра изменилось
+  if (NonCriticalAlarmCurrent != NonCriticalAlarmOldState)
+  {
+	  if(OldRO0type_Sourse == CRITICAL){
+		  if(NonCriticalAlarmCurrent)
+			  SetROInt(1, 0);
+		  else
+			  SetROInt(0, 0);
+		  SNMP_SendUserTrap(DO0_TOGGLED);
+	  }
+	  if(OldRO2type_Sourse == CRITICAL){
+		  if(NonCriticalAlarmCurrent)
+			  SetROInt(1, 1);
+		  else
+			  SetROInt(0, 1);
+	  	  SNMP_SendUserTrap(DO1_TOGGLED);
+	  }
+  }
+  else
+  {
+	  if(OldRO0type_Sourse == CRITICAL && OldRO0type_Sourse != OldRO0type_Sourse){
+		  if(NonCriticalAlarmCurrent)
+			  SetROInt(1, 0);
+		  else
+			  SetROInt(0, 0);
+		  SNMP_SendUserTrap(DO0_TOGGLED);
+	  }
+	  if(OldRO2type_Sourse == CRITICAL && OldRO2type_Sourse != OldRO2type_Sourse){
+		  if(NonCriticalAlarmCurrent)
+			  SetROInt(1, 1);
+		  else
+			  SetROInt(0, 1);
+		  SNMP_SendUserTrap(DO1_TOGGLED);
+	  }
+  }
+
+  OldRO0type_Sourse = CurrRO1type_Sourse;
+  OldRO2type_Sourse = CurrRO2type_Sourse;
+  NonCriticalAlarmOldState = NonCriticalAlarmCurrent;
+}
+
+/**
+  * @brief  Мониторинг бита LainFail
+  */
+void UPS_LineFailMonitor(void)
+{
+  static bool isValueRecv = false;
+  static uint8_t lineFailOldState = 0;
+  uint8_t lineFailCurrent;
+  
+  lineFailCurrent = (UPS.Status >> 7) & 0x01;
+  
+  if (!isValueRecv) {
+    isValueRecv = true;
+    lineFailOldState = lineFailCurrent;
+    return;
+  }
+
+  if (lineFailCurrent)
+	  flCriticalAlarm = true;
+    
+  // Значение параметра изменилось
+  if (lineFailCurrent != lineFailOldState)
+  {
+    if (lineFailCurrent)
+      SNMP_SendUserTrap(LINE_ALARM);
+    else
+      SNMP_SendUserTrap(LINE_NORM);
+  }
+  
+  lineFailOldState = lineFailCurrent;
+}
+
+/**
+  * @brief  Мониторинг бита LowBat  
+  */
+void UPS_LowBatMonitor(void)
+{
+  static bool isValueRecv = false;
+  static uint8_t lowBatOldState = 0;
+  uint8_t lowBatCurrent;
+  if((UPS.Status >> 7) & 0x01)
+	  lowBatCurrent = (UPS.Status >> 6) & 0x01;
+  else
+	  lowBatCurrent = 0;
+  
+  if (!isValueRecv) {
+    isValueRecv = true;
+    lowBatOldState = lowBatCurrent;
+    return;
+  }
+  if (lowBatCurrent)
+	  flNonCriticalAlarm = true;
+  // Значение параметра изменилось
+  if (lowBatCurrent != lowBatOldState)
+  {
+    if (lowBatCurrent)
+      SNMP_SendUserTrap(LOW_BAT_ALARM);
+    else
+      SNMP_SendUserTrap(LOW_BAT_NORM);
+  }
+  
+  lowBatOldState = lowBatCurrent;
+}
+
+/**
+  * @brief  Мониторинг нагрузки 
+  */
+void UPS_PowerMonitor(void)
+{
+  float load;
+  static uint8_t stateCurrent = HYST_IDLE;
+    
+  load = UPS.Load;
+
+  /* Отслеживается переход через верхнюю границу */
+  if (load > UPS_LOAD)
+  {
+	flCriticalAlarm = true;
+    if (stateCurrent == HYST_IDLE)
+	{
+      LED_On(LED_MINOR_R);
+      LED_On(LED_MINOR_G);
+	  stateCurrent = HYST_UP;
+      
+	  // Отправка трапа о завышении 
+	  SNMP_SendUserTrap(POWER_ALARM);
+	}
+  }
+  /* Отслеживается нормализация */
+  else if (load < (UPS_LOAD - UPS_LOAD_HIST))
+  {
+    if (stateCurrent == HYST_UP)
+	{
+    	LED_Off(LED_MINOR_R);
+    	LED_Off(LED_MINOR_G);
+	  stateCurrent = HYST_IDLE;
+      
+	  // Отправка трапа о нормализации 
+	  SNMP_SendUserTrap(POWER_NORM);
+	}
+  }
+}
+
+/**
+  * @brief  Мониторинг температуры 
+  */
+void UPS_TemperatureMonitor(void)
+{
+  float temperature;
+  static uint8_t stateCurrent = HYST_IDLE;
+    
+  temperature = UPS.Temp;
+
+  /* Отслеживается переход через верхнюю границу */
+  if (temperature > UPS_TEMPERATURE)
+  {
+	flCriticalAlarm = true;
+    if (stateCurrent == HYST_IDLE)
+	{
+	  stateCurrent = HYST_UP;
+      
+	  // Отправка трапа о завышении 
+	  SNMP_SendUserTrap(BATTERY_TEMPERATURE_ALARM);
+	}
+  }
+  /* Отслеживается нормализация */
+  else if (temperature < (UPS_TEMPERATURE - UPS_TEMPERATURE_HIST))
+  {
+    if (stateCurrent == HYST_UP)
+	{
+	  stateCurrent = HYST_IDLE;
+      
+	  // Отправка трапа о нормализации 
+	  SNMP_SendUserTrap(BATTERY_TEMPERATURE_NORM);
+	}
+  }
+}
+
+/**
+  * @brief  Мониторинг параметра upsParams.connect
+  */
+void UPS_ConnectMonitor(void)
+{
+  static bool isValueRecv = false;
+  static uint8_t connectOldState = 0;
+  uint8_t connectCurrent;
+  
+  connectCurrent = UPS.Present;
+  
+  if (!isValueRecv) {
+    isValueRecv = true;
+    connectOldState = connectCurrent;
+    return;
+  }
+  if (connectCurrent)
+  	  flCriticalAlarm = true;
+  // Значение параметра изменилось
+  if (connectCurrent != connectOldState)
+  {
+    if (connectCurrent)
+      SNMP_SendUserTrap(CONNECT_MONITOR_NORM);
+    else
+      SNMP_SendUserTrap(CONNECT_MONITOR_ALARM);
+  }
+  
+  connectOldState = connectCurrent;
+}
+
+/**
+  * @brief  Мониторинг параметра upsParams.connect
+  */
+void UPS_BatteryConnectMonitor(void)
+{
+  static bool isValueRecv = false;
+  static uint8_t AKBconnectOldState = 0;
+  uint8_t AKBconnectCurrent;
+
+  if(((UPS.Status >> 7) & 0x01) == 0)
+	  AKBconnectCurrent = (UPS.Status >> 6) & 0x01;
+  else{
+	  AKBconnectCurrent = 0;
+  }
+
+  if (!isValueRecv) {
+    isValueRecv = true;
+    AKBconnectOldState = AKBconnectCurrent;
+    return;
+  }
+  if (AKBconnectCurrent)
+  	  flCriticalAlarm = true;
+  // Значение параметра изменилось
+  if (AKBconnectCurrent != AKBconnectOldState)
+  {
+    if (AKBconnectCurrent)
+      SNMP_SendUserTrap(BATTERY_CONNECT_NORM);
+    else
+      SNMP_SendUserTrap(BATTERY_CONNECT_ALARM);
+  }
+
+  AKBconnectOldState = AKBconnectCurrent;
+}
+
+
+/********************************* (C) РОТЕК **********************************/

+ 77 - 0
modules/monitor/ups_monitor.h

@@ -0,0 +1,77 @@
+/********************************* (C) РОТЕК ***********************************
+ * @module  ups_monitor
+ * @file    ups_monitor.h
+ * @version 1.0.0
+ * @date    XX.XX.XXXX
+ * $brief   ups_monitor
+ *******************************************************************************
+ * @history     Version  Author         Comment
+ * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release.
+ *******************************************************************************
+ */
+
+/* Define to prevent recursive  ----------------------------------------------*/
+#ifndef UPS_MONITOR_H
+#define UPS_MONITOR_H
+   
+/**
+  * @brief  Состояния для реализации алгоритма гистерезиса
+  */
+typedef enum
+{
+  HYST_IDLE = 0,
+  HYST_UP,
+  HYST_DOWN,
+  
+} HYST_STATE_t;
+
+/**
+  * @brief  Мониторинг бита DI0 state
+  */
+void UPS_DI0Monitor(void);
+/**
+  * @brief  Мониторинг бита NonCriticalAlarm
+  */
+void UPS_CriticalAlarmMonitor(void);
+/**
+  * @brief  Мониторинг бита NonCriticalAlarm
+  */
+void UPS_NonCriticalAlarmMonitor(void);
+/**
+  * @brief  Мониторинг LainFail бита 
+  */
+void UPS_LineFailMonitor(void);
+
+/**
+  * @brief  Мониторинг бита LowBat 
+  */
+void UPS_LowBatMonitor(void);
+
+/**
+  * @brief  Задача мониторинга параметров UPS
+  */
+void UPS_Monitor(void *params);
+
+/**
+  * @brief  Мониторинг нагрузки 
+  */
+void UPS_PowerMonitor(void);
+
+/**
+  * @brief  Мониторинг температуры 
+  */
+void UPS_TemperatureMonitor(void);
+    
+/**
+  * @brief  Мониторинг параметра upsParams.connect
+  */
+void UPS_ConnectMonitor(void);
+
+/**
+  * @brief  Мониторинг параметра upsParams.connect
+  */
+void UPS_BatteryConnectMonitor(void);
+
+#endif /* #ifndef UPS_MONITOR_H */
+
+/********************************* (C) РОТЕК **********************************/