123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- #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;
- }
- 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;
- // Значение параметра изменилось
- if (TestFinishStateCurrent != TestFinishState)
- {
- if (!TestFinishStateCurrent)
- {
- printf("Test finish\r\n");
- #ifdef TEST_ALARM_AKB_MONITOR
- float time_test_actual = ((float)(xTaskGetTickCount() - start_time_test)) / (1000*60);
- UPSReadTestStatus();
- 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)
- {
- sprintf(log_string, "Авария(%0.2f Ач)", Ccalc);
- log_event_data(LOG_TEST_ALARM_AKB, log_string);
- syslog(SYSLOG_INFORMATIONAL, "Ёмкость АКБ: %s", log_string);
- SNMP_SendUserTrap(BATTERY_FAIL);
- }
- else
- {
- sprintf(log_string, "Норма(%0.2f Ач)", Ccalc);
- log_event_data(LOG_TEST_ALARM_AKB, log_string);
- syslog(SYSLOG_INFORMATIONAL, "Ёмкость АКБ: %s", log_string);
- SNMP_SendUserTrap(BATTERY_NORM);
- }
- }
- 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
- {
- 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);
- syslog(SYSLOG_INFORMATIONAL, "Тест батареи: %s", log_string);
- test_time = 0;
- SNMP_SendUserTrap(TEST_BAT_STOP);
- #else
- log_event_data(LOG_TEST_UPS, "Завершен");
- syslog_str(SYSLOG_INFORMATIONAL, "Тест батареи: Завершён");
- #endif
- flUpdateLog = true;
- }
- else
- {
- test_akb_flag = true;
- memset(log_string, 0, sizeof(log_string));
- switch (get_act_source())
- {
- case WEB_ACT:
- strcpy(log_string, name_login);
- break;
- case SNMP_ACT:
- case OTHER_ACT:
- strcpy(log_string, "Администратор");
- break;
- #ifdef CLI_ENABLE
- case CLI_ACT:
- strcpy(log_string, "Администратор");
- break;
- #endif
- case AUTO_ACT:
- strcpy(log_string, "Автоматический");
- break;
- default:
- break;
- }
- #ifdef TEST_ALARM_AKB_MONITOR
- 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, " (Запущен)");
- #endif
- printf("Test start\r\n");
- log_event_data(LOG_TEST_UPS, log_string);
- syslog(SYSLOG_INFORMATIONAL, "Тест батареи: %s", log_string);
- SNMP_SendUserTrap(TEST_BAT_RUN);
- flUpdateLog = true;
- }
- }
- TestFinishState = TestFinishStateCurrent;
- }
- char *HTTP_UPSTest(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
- {
- uint8_t valueLen = 0;
- char tempValue[20];
- char tempValue2[20];
- int8_t res = 0;
- char log_string[50];
- (void)lenBufIn;
- (void)reqNum;
- if (seclevel == USER) {
- return 0;
- }
- memset(tempValue, 0, 20);
- memset(tempValue2, 0, 20);
- memset(log_string, 0, 50);
- strcpy(bufOut, HTTP_200_OK);
- GetParamValue(bufIn, "func", tempValue, &valueLen);
- if (strcmp(tempValue, "stop") == 0) {
- res = ups_metac_service_pdu(ups_cancel_test);
- if (res == 1 || res == 0) {
- strcat(bufOut, "Команда \"Останов теста\" принята ИБП!");
- strcpy(log_string, name_login);
- strcat(log_string, " (Останов)");
- log_event_data(LOG_TEST_UPS, log_string);
- }
- if (res == -1) {
- strcat(bufOut, "Команда \"Останов теста\" отклонена ИБП!");
- }
- } else if (strcmp(tempValue, "discharge") == 0) {
- res = ups_metac_service_pdu(ups_test_low_bat);
- set_act_source(WEB_ACT);
- if (res == 1 || res == 0) {
- strcat(bufOut, "Команда \"Запуск теста\" принята ИБП!");
- }
- if (res == -1) {
- strcat(bufOut, "Команда \"Запуск теста\" отклонена ИБП!");
- }
- } else if (strncmp(tempValue, "time", 6) == 0) {
- GetParamValue(bufIn, "time", tempValue2, &valueLen);
- TimeParam = atoi(tempValue2);
- res = ups_metac_service_pdu(ups_test_time);
- if (res == 1 || res == 0) {
- strcat(bufOut, "Команда \"Запуск теста\" принята ИБП!");
- }
- if (res == -1) {
- strcat(bufOut, "Команда \"Запуск теста\" отклонена ИБП!");
- }
- }
- *lenBufOut = strlen(bufOut);
- return bufOut;
- }
|