Bläddra i källkod

[BT-6703-RT]add algorithm of count capacity during akb testing

balbekova 4 år sedan
förälder
incheckning
158e05ae4d

+ 2 - 0
config/board_bt6703_rt.h

@@ -128,6 +128,8 @@ XSETTING( char, our_srv_crt[1705], SETTINGS_SetSSLcrtDef, PART_DEFAULT_1 ) \
   XJSON_SETTINGS_TAG("lastsynctime",       GetSntpLastDataStr,                      SetEmptyFuncStr) \
   XJSON_SETTINGS_TAG("ups_cell_min",       GetUPSVoltCellMinStr,                    SetUPSVoltCellMinStr) \
   XJSON_SETTINGS_TAG("ups_cell_max",       GetUPSVoltCellMaxStr,                    SetUPSVoltCellMaxStr) \
+  XJSON_SETTINGS_TAG("ups_batcap",         GetCapacityNominalAKBStr,                SetCapacityNominalAKBStr) \
+  XJSON_SETTINGS_TAG("ups_max_power",      GetUPSPowerEnumStr,                      SetUPSPowerEnumStr) \
   XJSON_SETTINGS_TAG("temp_high",          GetTemperatureAlarmHighRangeStr,         SetTemperatureAlarmHighRangeStr) \
   XJSON_SETTINGS_TAG("temp_low",           GetTemperatureAlarmLowRangeStr,          SetTemperatureAlarmLowRangeStr) \
   XJSON_SETTINGS_TAG("temp_hist",          GetTemperatureAlarmHisteStr,             SetTemperatureAlarmHisteStr) \

+ 1 - 0
modules/HTTP_Server/web_params_api.h

@@ -24,6 +24,7 @@
         || strncmp(tag, "ssh_enabled", sizeof(tag)) == 0 \
         || strncmp(tag, "dhcp", sizeof(tag)) == 0 \
         || strncmp(tag, "swauth", sizeof(tag)) == 0 \
+        || strncmp(tag, "ups_max_power", sizeof(tag)) == 0 \
         || strncmp(tag, "rs_enabled", sizeof(tag)) == 0) { \
       cJSON_AddNumberToObject(cjson_param, tag, atoi(str)); \
     } else if (strncmp(tag, "pgw_en", sizeof(tag)) == 0 ) { \

+ 63 - 22
modules/MegaTec/megatec.c

@@ -43,6 +43,10 @@ int test_time = 0;
 
 static bool flag_buzzer_on = false;
 
+static float Ubat_sum = 0;
+static float Pload_sum = 0;
+uint32_t Period_testing = 0;
+
 enum {
     NORMAL = 0x00,
     VER_ERROR = 0x01,
@@ -97,7 +101,6 @@ void init_UPS_value(void)
     UPS.Temp = 0;
     UPS.Load = 0;
     UPS.SOC = 0;
-    UPS.SOC_test = 0;
     UPS.work_time = 0;
     UPS.akb_work_time = 0;
     UPS.Status = 0;
@@ -113,6 +116,24 @@ void init_UPS_value(void)
     memset(UPS.serial, 0, sizeof(UPS.serial));
 }
 
+void init_var_for_testing(void)
+{
+    Ubat_sum = 0;
+    Pload_sum = 0;
+    Period_testing = 0;
+}
+
+float voltage_bat_average(void)
+{
+    return (Ubat_sum / Period_testing);
+}
+
+float power_load_average(void)
+{
+    return (Pload_sum / Period_testing);
+}
+ 
+
 void send_MegaTec_cmd(cmdMegaTecEnums_t command)
 {
     DBG printf("MegaTecCMD: %s\r\n", MegaTecCMD[command]);
@@ -287,14 +308,14 @@ void ups_status_response(char *data)
     len = get_ups_param(data, " ", value);
     data += (len + 1);
     if (len > 0) {
-        UPS.Vakb_curr = atof(value);
+        UPS.Vcell_curr = atof(value);
     }
     if (sSettings.UPS_Setting.type_ups == ups_kestar || sSettings.UPS_Setting.type_ups == ups_offline) {
-        if (UPS.Vakb_curr < 7) {
-            UPS.SOC = round(100 * (UPS.Vakb_curr - sSettings.UPS_Setting.Ucellmin) / (sSettings.UPS_Setting.Ucellmax -
+        if (UPS.Vcell_curr < 7) {
+            UPS.SOC = round(100 * (UPS.Vcell_curr - sSettings.UPS_Setting.Ucellmin) / (sSettings.UPS_Setting.Ucellmax -
                         sSettings.UPS_Setting.Ucellmin));
         } else {
-            UPS.SOC = round(100 * (UPS.Vakb_curr / AKB_NUM_CELL - sSettings.UPS_Setting.Ucellmin) /
+            UPS.SOC = round(100 * (UPS.Vcell_curr / AKB_NUM_CELL - sSettings.UPS_Setting.Ucellmin) /
                     (sSettings.UPS_Setting.Ucellmax - sSettings.UPS_Setting.Ucellmin));
         }
     }
@@ -314,12 +335,6 @@ void ups_status_response(char *data)
         UPS.Status = stat;
     }
 
-#ifdef RELAY_ALARM_AKB
-    if (sSettings.UPS_Setting.type_ups == ups_kestar || sSettings.UPS_Setting.type_ups == ups_offline) {
-      UPS_TestSOCMonitor();
-    }
-#endif
-
 }
 
 void ups_general_status_response(char *data)
@@ -422,7 +437,7 @@ void ups_general_status_response(char *data)
     if (flUpdateLog) {
         flUpdateLog = false;
         memset(data, 0, UPS_PDU_MAX_LEN);
-        sprintf(data, "(%0.1f n/a %0.1f %d %0.1f %0.2f %0.1f %s", UPS.VAC_in, UPS.VAC_out, UPS.Load, UPS.Freq_in, UPS.Vakb_curr, UPS.Temp, &value[2]);
+        sprintf(data, "(%0.1f n/a %0.1f %d %0.1f %0.2f %0.1f %s", UPS.VAC_in, UPS.VAC_out, UPS.Load, UPS.Freq_in, UPS.Vcell_curr, UPS.Temp, &value[2]);
         log_add(data);
     }
 */
@@ -522,10 +537,18 @@ void ups_akb_info_response(char *data)
 
     DBG printf("UPS ups_akb_info_parser_start: %s\r\n", data);
 
-    //TODO
     len = get_ups_param(data, " ", value);
     data += (len + 1);
-
+    if(len > 0) {
+        UPS.Vakb_curr = atof(value);
+    }
+#ifdef HARDWARE_BT6703_RT
+    if((UPS.Status >> 2) & 0x01) {
+        Ubat_sum +=  UPS.Vakb_curr;
+        Pload_sum += UPS.Load;
+        Period_testing ++;
+    }
+#endif
     //TODO
     len = get_ups_param(data, " ", value);
     data += (len + 1);
@@ -540,10 +563,6 @@ void ups_akb_info_response(char *data)
         UPS.SOC = atoi(value);
     }
 
-#ifdef RELAY_ALARM_AKB
-      UPS_TestSOCMonitor();
-#endif
-
     len = get_ups_param(data, "\r", value);
     data += (len + 1);
     if (len > 0) {
@@ -584,6 +603,20 @@ void ups_model_response(char *data)
             strncpy(UPS.model, value, len);
         }
         SNMP_SetObjDescr();
+        data += (VOLTRONIC_MODEL_LENGTH + 1);
+        memset(value, 0, sizeof(value));
+        j = 0;
+        for (uint8_t i = 0; i < VOLTRONIC_OUTPUT_RATED_LENGTH; i ++) {
+            if (data[i] != '#') {
+                value[j] = data[i];
+                j ++;
+            }
+        }
+        float temp_value = atof(value);
+        if (sSettings.UPS_Setting.ups_power != temp_value) {
+            sSettings.UPS_Setting.ups_power = temp_value;
+            SETTINGS_Save();
+        }
     } else {
         return;
     }
@@ -803,11 +836,16 @@ int ups_metac_service_pdu(cmdMegaTecEnums_t command)
             TimeParam2 = 1;
             send_MegaTec_cmd(ups_shutdown_restore);
         } else {
-            UPS.SOC_test = UPS.SOC;
-            if (command == ups_test_low_bat) { 
-                test_time = 0;
+            if((UPS.Status >> 2) & 0x01) {
+                if (command == ups_cancel_test) { 
+                    test_time = 100;
+                } 
             } else {
-                test_time = (int)TimeParam;
+                if (command == ups_test_low_bat) { 
+                    test_time = 100;
+                } else {
+                    test_time = (int)TimeParam;
+                }
             }
             send_MegaTec_cmd(command);
         }
@@ -819,6 +857,8 @@ int ups_metac_service_pdu(cmdMegaTecEnums_t command)
                     xTimerStart(UPSRestoreTimer, 0);
                 } else if(command == ups_cancel_shut_down) {
                     xTimerStop(UPSRestoreTimer, 0);
+                } else if (command == ups_test_time) {
+                    init_var_for_testing();
                 }
                 return 1;
             } else if (strncmp(ups_pdu.data, "NAK", 3) == 0 || strncmp(ups_pdu.data, "(NAK", 4) == 0) {
@@ -851,6 +891,7 @@ int ups_metac_service_pdu(cmdMegaTecEnums_t command)
         } else {
             if  ((((UPS.Status >> 2) & 0x01) != ((UPS_Status_prev >> 2) & 0x01))
              && ((UPS.Status >> 2) & 0x01)) {
+                init_var_for_testing();
                 return 1;
             }
         }

+ 10 - 5
modules/MegaTec/megatec.h

@@ -20,10 +20,11 @@
 #define AKB_VOLTAGE			12
 #define AKB_NUM_CELL		6
 
-#define VOLTRONIC_MODEL_LENGTH		15
-#define KSTAR_MODEL_LENGTH			10
-#define VOLTRONIC_VERSION_LENGTH	10
-#define VOLTRONIC_SN_LENGTH			14
+#define VOLTRONIC_OUTPUT_RATED_LENGTH		7
+#define VOLTRONIC_MODEL_LENGTH				15
+#define KSTAR_MODEL_LENGTH					10
+#define VOLTRONIC_VERSION_LENGTH			10
+#define VOLTRONIC_SN_LENGTH					14
 
 typedef enum{
 	ups_status_req,
@@ -59,10 +60,10 @@ typedef struct{
 	float VAC_in;
 	float VAC_out;
 	float Temp;
+	float Vcell_curr;
 	float Vakb_curr;
 	uint8_t Load;
 	uint8_t SOC;
-	uint8_t SOC_test;
 	uint16_t work_time;
 	uint32_t akb_work_time;
 	uint32_t Alarm;
@@ -89,4 +90,8 @@ void ups_megatec_init(void);
 
 void UPSReadTestStatus(void);
 
+float voltage_bat_average(void);
+
+float power_load_average(void);
+
 #endif /* MEGATEC_H_ */

+ 53 - 46
modules/monitor/ups_monitor.c

@@ -320,8 +320,6 @@ void UPS_NonCriticalAlarmMonitor(void)
 }
 #endif
 
-static uint8_t test_flag = 0;
-
 /**
   * @brief  Мониторинг бита Test in progress
   */
@@ -331,6 +329,7 @@ void UPS_TestFinishMonitor(void)
   static uint8_t TestFinishState = 0;
   uint8_t TestFinishStateCurrent;
   char log_string[50];
+  static uint32_t start_time_test = 0;
 
   TestFinishStateCurrent = (UPS.Status >> 2) & 0x01;
 
@@ -338,15 +337,57 @@ void UPS_TestFinishMonitor(void)
   if (TestFinishStateCurrent != TestFinishState)
   {
     if (!TestFinishStateCurrent){
-      test_flag = 1;
       printf("Test finish\r\n");
 #ifdef HARDWARE_BT6703_RT
+      float time_test_actual = ((float)(xTaskGetTickCount() - start_time_test)) / (1000*60);
       UPSReadTestStatus();
-      if(UPS.Test_Status == 2){
-        log_event_data(LOG_TEST_UPS, "Ошибка");
+
+      static uint8_t AKBAlarmState = 0;
+      uint8_t i = 0;
+      static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
+      uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
+
+      for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
+	        CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
+
+      float Uakb_av = voltage_bat_average();
+      float Pload_av = power_load_average();
+      float k_eff;
+      printf("Uakb_av: %0.2f", Uakb_av);
+      printf("Pload_av: %0.2f", Pload_av);
+      if(UPS.Test_Status != 2 && Pload_av >= 3) {
+        GetUPSEfficiencyFactorInt(&k_eff);
+        float Ccalc = (sSettings.UPS_Setting.ups_power*Pload_av*time_test_actual)/(100*60*Uakb_av*(k_eff));
+        printf("Ccalc: %0.2f", Ccalc);
+        float Ccalc_percent = (100*Ccalc)/sSettings.UPS_Setting.common_capacity;
+        if (Ccalc_percent >= 80) {
+          relay_setup_log(CurrROtype_Sourse, ALARM_AKB, 1);
+          sprintf(log_string, "Авария(%0.2f Ач)", Ccalc);
+          log_event_data(LOG_TEST_ALARM_AKB, log_string);
+          AKBAlarmState = 1;
+        } else {
+          relay_setup_log(CurrROtype_Sourse, ALARM_AKB, 0);
+          sprintf(log_string, "Норма(%0.2f Ач)", Ccalc);
+          log_event_data(LOG_TEST_ALARM_AKB, log_string);
+          AKBAlarmState = 0;
+        }
+      }
+      if (AKBAlarmState)
+          relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, ALARM_AKB);
+
+      for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
+          OldROtype_Sourse[i] = CurrROtype_Sourse[i];
+      
+      memset(log_string, 0, sizeof(log_string));
+      if(UPS.Test_Status == 2 ||( (time_test_actual <= 0.9*test_time || time_test_actual >= 1.1*test_time) && (test_time != 0 && test_time != 100))){// 
+        strcpy(log_string, "Ошибка");
       } else {
-        log_event_data(LOG_TEST_UPS, "Завершен");
+        strcpy(log_string, "Завершен");
       }
+       uint8_t len1 = strlen(log_string);
+       sprintf(&log_string[len1], "(%0.1f мин)", time_test_actual);
+       log_event_data(LOG_TEST_UPS, log_string);
+       test_time = 0;
 #else
       log_event_data(LOG_TEST_UPS, "Завершен");
 #endif
@@ -370,16 +411,18 @@ void UPS_TestFinishMonitor(void)
             break;
       }
 #ifdef HARDWARE_BT6703_RT
-     if (test_time != 0) {
+      start_time_test = xTaskGetTickCount();
+     if (test_time == 0) {
+       strcat(log_string, " (авто)");
+     } else if (test_time == 100) {
+        strcat(log_string, " (до разряда)");
+     } else {
        uint8_t len = strlen(log_string);
        sprintf(&log_string[len], "(%i мин)", test_time);
-     } else {
-       strcat(log_string, " (до разряда)");
      }
 #else
        strcat(log_string, " (Запущен)");
 #endif
-      test_flag = 1;
       printf("Test start\r\n");
       log_event_data(LOG_TEST_UPS, log_string);
       flUpdateLog = true;
@@ -390,42 +433,6 @@ void UPS_TestFinishMonitor(void)
 #endif
 }
 
-/**
-  * @brief  Мониторинг SOC
-  */
-void UPS_TestSOCMonitor(void)
-{
-#ifdef RELAY_ALARM_AKB
-
-  static uint8_t AKBAlarmState = 0;
-  uint8_t i = 0;
-  static uint8_t OldROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
-  uint8_t CurrROtype_Sourse[OUTPUTS_TOTAL_COUNT] = {0};
-
-  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
-	  CurrROtype_Sourse[i] = sSettings.sRelays[i].ro_type_source;
-
-  DBG printf("SOC_curr %d %d\r\n", UPS.SOC_test, UPS.SOC);
-  if(UPS.SOC_test != UPS.SOC && UPS.SOC_test != 0 && (test_flag || (UPS.Status >> 2) & 0x01)) {
-    if (((int8_t)UPS.SOC_test - (int8_t)UPS.SOC) >= 20 && UPS.Load < 10) {
-        relay_setup_log(CurrROtype_Sourse, ALARM_AKB, 1);
-        log_event_data(LOG_TEST_ALARM_AKB, "Авария");
-        AKBAlarmState = 1;
-    } 
-    UPS.SOC_test = 0;
-    test_flag = 0;
-  }
-
-  UPS.SOC_test = UPS.SOC;
-
-	if (AKBAlarmState)
-		  relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, ALARM_AKB);
-
-  for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++)
-	  OldROtype_Sourse[i] = CurrROtype_Sourse[i];
-#endif
-}
-
 /**
   * @brief  Мониторинг бита LainFail
   */

+ 0 - 5
modules/monitor/ups_monitor.h

@@ -32,11 +32,6 @@ typedef enum
   */
 void UPS_TestFinishMonitor(void);
 
-/**
-  * @brief  Мониторинг SOC
-  */
-void UPS_TestSOCMonitor(void);
-
 /**
   * @brief  Мониторинг бита DI0 state
   */

+ 54 - 7
modules/parameters.c

@@ -72,6 +72,9 @@ extern WEB_PARAMS_t sTempWebParams;
   */
 extern bool fConfirmWebParams;
 
+extern const float UPSPowerMass[];
+extern const float UPSEfficiencyFactorMass[];
+
 /**
   * @brief 
   */
@@ -350,12 +353,16 @@ void GetOutputCurrentInt(float *value)
 void GetVoltageAKBtStr(char *str, uint8_t *len)
 {
     float value;
-    if (UPS.Vakb_curr < 7) {
-        value = AKB_NUM_CELL * (sSettings.UPS_Setting.Uakb / AKB_VOLTAGE) * UPS.Vakb_curr;
+    if (sSettings.UPS_Setting.type_ups == ups_kestar || sSettings.UPS_Setting.type_ups == ups_offline) {
+     if (UPS.Vcell_curr < 7) {
+          value = AKB_NUM_CELL * (sSettings.UPS_Setting.Uakb / AKB_VOLTAGE) * UPS.Vcell_curr;
+      } else {
+          value = (sSettings.UPS_Setting.Uakb / AKB_VOLTAGE) * UPS.Vcell_curr;
+      }
+      sprintf(str, "%0.1f", roundto(value, 1)); 
     } else {
-        value = (sSettings.UPS_Setting.Uakb / AKB_VOLTAGE) * UPS.Vakb_curr;
+      sprintf(str, "%0.1f", roundto(UPS.Vakb_curr, 1));
     }
-    sprintf(str, "%0.1f", roundto(value, 1));
     *len = strlen(str);
 }
 
@@ -364,11 +371,15 @@ void GetVoltageAKBtStr(char *str, uint8_t *len)
   */
 void GetVoltageAKBInt(float *value)
 {
-    if (UPS.Vakb_curr < 7) {
-        *value = AKB_NUM_CELL * (sSettings.UPS_Setting.Uakb / AKB_VOLTAGE) * UPS.Vakb_curr;
+  if (sSettings.UPS_Setting.type_ups == ups_kestar || sSettings.UPS_Setting.type_ups == ups_offline) {
+    if (UPS.Vcell_curr < 7) {
+        *value = AKB_NUM_CELL * (sSettings.UPS_Setting.Uakb / AKB_VOLTAGE) * UPS.Vcell_curr;
     } else {
-        *value = (sSettings.UPS_Setting.Uakb / AKB_VOLTAGE) * UPS.Vakb_curr;
+        *value = (sSettings.UPS_Setting.Uakb / AKB_VOLTAGE) * UPS.Vcell_curr;
     }
+  } else {
+    *value = UPS.Vakb_curr;
+  }
 }
 
 void GetModeStr(char *str, uint8_t *len)
@@ -1746,6 +1757,33 @@ void GetUPSPowerStr(char *str, uint8_t *len)
     *len = strlen(str);
 }
 
+/**
+  * @brief Полная мощность АКБ
+  */
+void GetUPSPowerEnumStr(char *str, uint8_t *len)
+{
+    for(uint8_t i = 0; i < ups_power_num_max; i ++) {
+      if(sSettings.UPS_Setting.ups_power == UPSPowerMass[i]) {
+        sprintf(str, "%d", (int32_t)i);
+        break;
+      }
+    }
+    *len = strlen(str);
+}
+
+/**
+  * @brief КПД ИБП
+  */
+void GetUPSEfficiencyFactorInt(float *value)
+{
+    for(uint8_t i = 0; i < ups_power_num_max; i ++) {
+      if(sSettings.UPS_Setting.ups_power == UPSPowerMass[i]) {
+        *value = UPSEfficiencyFactorMass[i];
+        break;
+      }
+    }
+}
+
 /**
   * @brief Емкость АКБ
   */
@@ -2827,6 +2865,15 @@ void SetUPSPowerStr(char *str)
     sSettings.UPS_Setting.ups_power = atof(str);
 }
 
+/**
+  * @brief Полная мощность АКБ
+  */
+void SetUPSPowerEnumStr(char *str)
+{
+  int32_t index = atoi(str);
+  sSettings.UPS_Setting.ups_power = UPSPowerMass[index];
+}
+
 /**
   * @brief Емкость АКБ
   */

+ 15 - 0
modules/parameters.h

@@ -667,6 +667,16 @@ void GetVoltageAKBNominalStr(char *str, uint8_t *len);
   */
 void GetUPSPowerStr(char *str, uint8_t *len);
 
+/**
+  * @brief Полная мощность АКБ
+  */
+void GetUPSPowerEnumStr(char *str, uint8_t *len);
+
+/**
+  * @brief КПД ИБП
+  */
+void GetUPSEfficiencyFactorInt(float *value);
+
 /**
   * @brief Емкость АКБ
   */
@@ -1195,6 +1205,11 @@ void SetVoltageAKBNominalStr(char *str);
   */
 void SetUPSPowerStr(char *str);
 
+/**
+  * @brief Полная мощность АКБ
+  */
+void SetUPSPowerEnumStr(char *str);
+
 /**
   * @brief Емкость АКБ
   */

+ 2 - 0
modules/settings_api.c

@@ -42,6 +42,8 @@
 #define DEVICE_MAC "00-00-00-00-00-03"
 #endif
 
+const float UPSPowerMass[] = {1000, 1500, 2000, 3000, 6000, 10000};
+const float UPSEfficiencyFactorMass[] = {0.83, 0.87, 0.87, 0.88, 0.9, 0.91};
 
 SemaphoreHandle_t flash_mutex;
 

+ 11 - 0
modules/settings_api.h

@@ -291,6 +291,17 @@ typedef enum{
 	type_ups_max
 } typeUPSEnums_t;
 
+typedef enum{
+	ups_1_0_power,
+	ups_1_5_power,
+	ups_2_0_power,
+	ups_3_0_power,
+	ups_6_0_power,
+	ups_10_0_power,
+
+	ups_power_num_max
+} upsPowerEnums_t;
+
 /**
   * @brief  Настройки ИБП.
   */

+ 4 - 1
modules/settings_api_bt6703_rt.c

@@ -61,6 +61,9 @@ const char* logsStrShortRu[] =
     "Авария ИБП",
 };
 
+extern const float UPSPowerMass[];
+extern const float UPSEfficiencyFactorMass[];
+
 /**
   * @brief  Установить параметры SNMP по умолчанию
   */
@@ -91,7 +94,7 @@ void SETTINGS_SetUPSSettingsDef(void)
   sSettings.UPS_Setting.Ucellmin = 1.67;
   sSettings.UPS_Setting.Ucellmax = 2.27;
   sSettings.UPS_Setting.Uakb = 24;
-  sSettings.UPS_Setting.ups_power = 1000;
+  sSettings.UPS_Setting.ups_power = UPSPowerMass[ups_1_0_power];
   sSettings.UPS_Setting.set_data = 0;
   sSettings.UPS_Setting.life_time = 5;
   sSettings.UPS_Setting.common_capacity = 9;