~={green}Замечания от заказчика=~ 1. В логе фигурируют аварии, которых не может быть. "Срабатывание EPO", "Ош. подкл. вх. напряжения" ~={yellow}Question.=~ Отключить функции. ~={green}Fixed.=~ Событие "Срабатывание EPO" формируется в модуле ups_monitor.c В отдельной функции UPS_EPOMonitor. Нужно ли ее отключить? ```c #define EPO_MONITOR ``` Событие "Ош подкл вх напр" формируется в модуле ups_monitor.c В отдельной функции UPS_PhaseFailMonitor. Нужно ли ее отключить? ```c #define PHASE_FAIL_MONITOR ``` 2. При запуске теста АКБ в логе информация о смене режима работы, но не о тесте. В syslog правильно. ~={yellow}Question.=~ В логе в событиях контроллера не отображается режим работы "тест АКБ" (Вход в тест, выход из теста.) УПС не сообщает, что находится в режиме теста. Что делать? 3. В веб-интерфейсе отображается входная частота, в случае оффлайн ИБП особого смысла не имеет. Логичнее указывать только частоту выходного напряжения. ~={yellow}Question.=~ ~={green}Fixed.=~ Существует множество режимов работы контроллера ИБП. - Power on - Standby - Bypass - OnLine - Battery - Battery test - Fault - ECO - Converter - Shutdown Необходимо уточнить в каких режимах показывать входную частоту и какое значение выводить? Во всех режимах кроме Bypass выводить 0 в параметре "входная частота". За вывод этого параметра в WEB и SNMP отвечает функция: ```c void GetInputFreqStr(char *str, uint8_t *len) {     sprintf(str, "%0.1f", UPS.Freq_in);     *len = strlen(str); } UPS.Mode != 'B' ``` Добавил анализ режима работы из параметра UPS.Mode ```c void GetInputFreqStr(char *str, uint8_t *len) {     if (UPS.Mode == 'Y')       sprintf(str, "%0.1f", UPS.Freq_in);     else       sprintf(str, "%0.1f", 0.0);     *len = strlen(str); } ``` 4. Проблема IAP. ~={red}Open.=~ 5. Полная мощность ИБП 400, а не 500. ~={green}Fixed.=~ ```c RoTeK-swt-BT-BT-6721-signals-MIB::upsFullPower.0 = STRING: "400" // Этот параметр формируется в функции: /**   * @brief Полная мощность АКБ   */ void GetUPSPowerStr(char *str, uint8_t *len) {     sprintf(str, "%d", (int32_t)sSettings.UPS_Setting.ups_power);     *len = strlen(str); } // Решение. Изменил значение параметра sSettings.UPS_Setting.ups_power в settings_api_bt6721.c /**   * @brief  Настройки ИБП по умолчанию   */ void SETTINGS_SetUPSSettingsDef(void) {   sSettings.UPS_Setting.Ucellmin = 1.89;   sSettings.UPS_Setting.Ucellmax = 2.36;   sSettings.UPS_Setting.Uakb = 12;   sSettings.UPS_Setting.common_capacity = 15;   sSettings.UPS_Setting.ups_power = 400;   sSettings.UPS_Setting.set_data = 0;   sSettings.UPS_Setting.life_time = 5;   sSettings.UPS_Setting.type_ups = ups_kestar; } ``` 6. Убрать отправку fault в конце разряда АКБ. ~={yellow}Question.=~ Не понял. Отправку куда? Это трап. Trap ID - 20 - это оно? ~={yellow}Question.=~ ```c /**   * @brief  Мониторинг бита LowBat     */ void UPS_LowBatMonitor(void) { #ifdef LOW_BAT_MONITOR static bool isValueRecv = false; static uint8_t lowBatOldState = 0; static bool flag_alarm_time = false; uint8_t lowBatCurrent; #if defined RELAY_CHARGE_AKB 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; #endif if ((UPS.Status >> 7) & 0x01) lowBatCurrent = (UPS.Status >> 6) & 0x01; else     lowBatCurrent = 0;     if (!isValueRecv) {     isValueRecv = true;     lowBatOldState = lowBatCurrent;     if (lowBatCurrent){     log_event_data(LOG_ALARM_LOW_BAT, "Авария");     SNMP_SendUserTrap(LOW_BAT_ALARM); syslog(SYSLOG_ERROR, "Низкий заряд АКБ (%d%%)", UPS.SOC);     flUpdateLog = true; #if defined RELAY_CHARGE_AKB     relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1); #endif     }     else{     SNMP_SendUserTrap(LOW_BAT_NORM);     log_event_data(LOG_ALARM_LOW_BAT, "Норма");     syslog(SYSLOG_NOTICE, "Заряд АКБ в норме (%d%%)", UPS.SOC);     flUpdateLog = true; #if defined RELAY_CHARGE_AKB     relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0); #endif }     return; } // Значение параметра изменилось if (lowBatCurrent != lowBatOldState) { if(flag_alarm_time){     flag_alarm_time = false;     if (lowBatCurrent){     SNMP_SendUserTrap(LOW_BAT_ALARM);     syslog(SYSLOG_ERROR, "Низкий заряд АКБ (%d%%)", UPS.SOC);     log_event_data(LOG_ALARM_LOW_BAT, "Авария");     flUpdateLog = true; #ifdef RELAY_CHARGE_AKB       relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 1); #endif     }     else{     SNMP_SendUserTrap(LOW_BAT_NORM);     syslog(SYSLOG_NOTICE, "Заряд АКБ в норме (%d%%)", UPS.SOC);     log_event_data(LOG_ALARM_LOW_BAT, "Норма");     flUpdateLog = true; #if defined RELAY_CHARGE_AKB     relay_setup_log(CurrROtype_Sourse, CHARGE_AKB, 0); #endif     } } else{     flag_alarm_time = true; } } #if defined RELAY_CHARGE_AKB else{     flag_alarm_time = false;     if (lowBatCurrent)     relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, CHARGE_AKB); } for(i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){     OldROtype_Sourse[i] = CurrROtype_Sourse[i]; } #endif if(!flag_alarm_time){     if (lowBatCurrent){ flNonCriticalAlarm = true;     flLedAlarm = true;     }     lowBatOldState = lowBatCurrent; } else{     if (lowBatOldState){     flNonCriticalAlarm = true;     flLedAlarm = true;     } } #endif } ``` 7. Сообщение в лог "авария входного напряжения 220В авария" при возобновлении питания. ~={red}Open.=~ Поправил логику вызова функций записи в лог. ~={green}Fixed.=~ ```c // Запись в журнал формируется в функции: /**   * @brief  Мониторинг бита LainFail   */ void UPS_LineFailMonitor(void) { #ifdef LINE_FAIL_MONITOR static bool isValueRecv = false; static uint8_t lineFailOldState = 0; uint8_t lineFailCurrent; char log_string[50]; uint8_t len; #if defined RELAY_AC_PRESENT 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; #endif #ifdef VAC_IN_MONITOR lineFailCurrent = ((UPS.Status >> 7) & 0x01); lineFailCurrent |= UPS_VACinputRangeAlarm(); #else lineFailCurrent = (UPS.Status >> 7) & 0x01; #endif 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; #if defined RELAY_AC_PRESENT relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1); #endif }     else { #if defined RELAY_AC_PRESENT     relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 0); #endif     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){ #if defined RELAY_AC_PRESENT     relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 1); #endif     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); #ifdef AKB_CHANGE_MONITOR       if(UPS.Alarm & 0x40) {         log_event_data(LOG_ALARM_CHANGE_AKB, "Авария");         SNMP_SendUserTrap(BATTERY_CHANGE_ALARM);     }   #endif     flUpdateLog = true;     }     else{     if (UPS.VAC_in == 0) {         return;     } #if defined RELAY_AC_PRESENT       relay_setup_log(CurrROtype_Sourse, AC_PRESENT, 0); #endif     log_event_data(LOG_ALARM_LINE, "Норма");     SNMP_SendUserTrap(LINE_NORM);     syslog(SYSLOG_NOTICE, "Сеть в норме (%0.1f В)", UPS.VAC_in);     flUpdateLog = true;     } } #if defined RELAY_AC_PRESENT else{     if (lineFailCurrent != 0)     relay_setup_log_change(CurrROtype_Sourse, OldROtype_Sourse, AC_PRESENT); } for (i = 0; i < OUTPUTS_TOTAL_COUNT; i ++){     OldROtype_Sourse[i] = CurrROtype_Sourse[i]; } #endif lineFailOldState = lineFailCurrent; #endif ``` 8. В syslog именует выходное напряжение входным. ~={green}Fixed.=~ ```c // ups_monitor.c // Поменял "входное" на "выходное" SNMP_SendUserTrap(VAC_HIGH_OUTPUT_ALARM); syslog(SYSLOG_ERROR, "Высокое выходное напряжение (%0.1f В)", VACoutputCurrent); ``` 9. При отказе флешки контроллер виснет - хочется чтобы продолжал работать пусть и без журнала. ~={green}Fixed.=~ 10. Сброс ИБП командой "C" (кнопка отмены отключения) если состояние Fault длится более 15-и секунд. ~={green}Fixed.=~ Добавил анализ состояния в функцию void kstar_mode(void) ```c     if (UPS.Mode == 'F') {         fault_mode_cnt++;     }     else {         fault_mode_cnt = 0;     }     if (fault_mode_cnt == UPA_CANSEL_DELAY) {         send_MegaTec_cmd(ups_cancel_shut_down);         fault_mode_cnt = 0;     } ``` 11. Лишняя авария (2 события). --- Makefile config/board_bt6721.h iap/Makefile - OK iap/Modules/spi_flash.c iap/Modules/spi_flash.h modules/MegaTec/megatec.c - OK modules/MegaTec/megatec.h - OK modules/log/ringfs.c - OK modules/monitor/ups_monitor.c - OK modules/parameters.c - OK modules/settings_api_bt6721.c - OK peripheral_modules/src/spi_flash.c - OK service_hw/Commands/bt_6701_commands.c - OK service_hw/Commands/bt_6701_commands.h - OK service_hw/Commands/commands_api.c - OK service_hw/Commands/commands_api.h - OK service_hw/Console/port_microrl.c ~={green}Проверка на КЗ.=~ /* 1 - PE2 - не используется 2 - PE3 - не проверяем, не используется 3 - PE4 - не проверяем, не используется 4 - PE5 - не проверяем, не используется 5 - PE6 - проверять с 4 - OK 6 - VBAT - не проверяем 7 - PC13 - не проверяем, не используется 8 - OSC_IN - не проверяем 9 - OSC_OUT - не проверяем 10 - VSS - не проверяем 11 - VDD - не проверяем 12 - OSC_IN - не проверяем 13 - OSC_OUT - не проверяем, не используется 14 - PE3 - NRST - не проверяем 15 - PC0 - не проверяем, не используется 16 - PC1 - не проверяем ethernet phy 17 - PC0 - не проверяем, не используется 18 - PC0 - не проверяем, не используется 19 - VDD - не проверяем 20 - VSSA - не проверяем 21 - VREF - не проверяем 22 - VDDA - не проверяем 23 - PA0 - проверяем с 22 (КЗ с +), не получается 24 - PA1 - не проверяем ethernet phy 25 - PA2 - не проверяем ethernet phy 26 - PA3 - проверяем с 27 (КЗ с -) OK 27 - VSS - не проверяем 28 - VDD - не проверяем 29 - PA4 - не проверяем, не получается 30 - PA5 - не проверяем, не получается 31 - PA6 - не проверяем, не используется 32 - PA7 - не проверяем ethernet phy 33 - PС4 - не проверяем ethernet phy 34 - PС5 - не проверяем ethernet phy 35 - PB0 - не проверяем, не используется 36 - PB1 - не проверяем, не используется 37 - PB2 - BOOT1 - не проверяем 38 - PE7 - не проверяем, там всегда + 39 - PE8 - не проверяем, не используется 40 - PE9 - не проверяем, не используется 41 - PE10 - не проверяем, не используется 42 - PE11 - не проверяем, не получится 43 - PE12 - не проверяем, не получится 44 - PE13 - не проверяем ethernet phy 45 - PE14 - не проверяем, не используется 46 - PE15 - проверяем с 47 - OK 47 - PB10 - проверяем с 46 - OK 48 - PB11 - не проверяем ethernet phy 49 - Vcap1 - не проверяем 50 - VDD - не проверяем 51 - PB12 - не проверяем ethernet phy 52 - PB13 - не проверяем ethernet phy 53 - PB14 - проверяем с 54 (но 53 должен быть только входом) Но не получилось! 54 - PB15 - проверяем с 53 (54 - как вход) Но не получилось! 55 - PD8 - не проверяем, не используется 56 - PD9 - не проверяем, не используется 57 - PD10 - не проверяем, не используется 58 - PD11 - не проверяем, не используется 59 - PD12 - не проверяем, не используется 60 - PD13 - не проверяем, не используется 61 - PD14 - не проверяем 62 - PD15 - не проверяем 63 - PС6 - не проверяем, не используется 64 - PC7 - не проверяем, не используется 65 - PC8 - не проверяем, не используется 66 - PC9 - не проверяем, не используется 67 - PA8 - не проверяем, не используется 68 - PA9 - не проверяем, это DEBUG UART 69 - PA10 - не проверяем, это DEBUG UART 70 - PA11 - не проверяем, не используется 71 - PA12 - не проверяем, не используется 72 - PA13 - SWDIO - не проверяем 73 - Vcap2 - не проверяем 74 - VSS - не проверяем 75 - VDD - не проверяем 76 - PA14 - SWCLK - не проверяем 77 - PA15 - не проверяем, не используется 78 - PC10 - не проверяем, не используется 79 - PC11 - не проверяем, не используется 80 - PC12 - не проверяем, не используется 81 - PD0 - не проверяем, не используется 82 - PD1 - не проверяем, не используется 83 - PD2 - не проверяем, не используется 84 - PD3 - не проверяем, не используется 85 - PD4 - не проверяем, не используется 86 - PD5 - проверяем с 87 87 - PD6 - проверяем с 86 88 - PD7 - не проверяем, не используется 89 - PB3 - проверяем с 90 90 - PB4 - проверяем с 89, проверяем с 91 91 - PB5 - проверяем c 90, проверяем с 92 92 - PB6 - проверяем с 91 93 - PB7 - не проверяем, не используется 94 - BOOT0 - не проверяем 95 - PB8 - не проверяем, не используется 96 - PB9 - не проверям, т.к. соседние пины не используются 97 - PE0 - не проверяем, не используется 98 - PE1 - не проверяем, не используется 99 - VSS - не проверяем 100 - VDD - не проверяем */ Проверка Ethernet PHY Проверяем кроме nINT/REFCLK. Для проверки устаанавливает nRST в низкий уровень. 1. Проверяем 15 - PCO - свободный 16 - PC1 - RMII_MDC 17 - PC2 - свободный 15 с 16 - проверяем 16 с 17 - проверяем 2. Не проверяем 23 - там всегда +3,3 24 - PA1 RMII_REFCLK 3. Проверяем 25 - PA2 - RMII_MDIO 26 - PA3 4. 31 - PA6 - свободный 32 - PA7 - RMII_CRS 33 - PC4 - RMII_RXD0 5. 33 - PC4 - RMII_RXD0 34 - PC5 - RMII_RXD1 35 - PB0 - свободный 6. 47 - PB10 - SPI2_SCK 48 - PB11 - RMII_TX_EN 7. 51 - PB12 - RMII_TXD0 52 - PB13 - RMII_TXD1 53 - PB14 - SPI2_MISO