6721 fix.md 18 KB

~={green}Замечания от заказчика=~

  1. В логе фигурируют аварии, которых не может быть. "Срабатывание EPO", "Ош. подкл. вх. напряжения" ~={yellow}Question.=~ Отключить функции. ~={green}Fixed.=~

Событие "Срабатывание EPO" формируется в модуле ups_monitor.c В отдельной функции UPS_EPOMonitor. Нужно ли ее отключить?

#define EPO_MONITOR

Событие "Ош подкл вх напр" формируется в модуле ups_monitor.c В отдельной функции UPS_PhaseFailMonitor. Нужно ли ее отключить?

#define PHASE_FAIL_MONITOR
  1. При запуске теста АКБ в логе информация о смене режима работы, но не о тесте. В syslog правильно. ~={yellow}Question.=~ В логе в событиях контроллера не отображается режим работы "тест АКБ" (Вход в тест, выход из теста.) УПС не сообщает, что находится в режиме теста. Что делать?

  2. В веб-интерфейсе отображается входная частота, в случае оффлайн ИБП особого смысла не имеет. Логичнее указывать только частоту выходного напряжения. ~={yellow}Question.=~ ~={green}Fixed.=~

Существует множество режимов работы контроллера ИБП.

  • Power on
  • Standby
  • Bypass
  • OnLine
  • Battery
  • Battery test
  • Fault
  • ECO
  • Converter
  • Shutdown

Необходимо уточнить в каких режимах показывать входную частоту и какое значение выводить? Во всех режимах кроме Bypass выводить 0 в параметре "входная частота".

За вывод этого параметра в WEB и SNMP отвечает функция:

void GetInputFreqStr(char *str, uint8_t *len)
{
    sprintf(str, "%0.1f", UPS.Freq_in);
    *len = strlen(str);
}

UPS.Mode != 'B'

Добавил анализ режима работы из параметра UPS.Mode

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);
}
  1. Проблема IAP. ~={red}Open.=~

  2. Полная мощность ИБП 400, а не 500. ~={green}Fixed.=~

    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;
    }
    
  3. Убрать отправку fault в конце разряда АКБ. ~={yellow}Question.=~ Не понял. Отправку куда? Это трап. Trap ID - 20 - это оно? ~={yellow}Question.=~

    /**
      * @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
    }
    
  4. Сообщение в лог "авария входного напряжения 220В авария" при возобновлении питания. ~={red}Open.=~ Поправил логику вызова функций записи в лог. ~={green}Fixed.=~

    // Запись в журнал формируется в функции:
    
    /**
      * @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
    
  5. В syslog именует выходное напряжение входным. ~={green}Fixed.=~

    // ups_monitor.c
    //  Поменял "входное" на "выходное"
    SNMP_SendUserTrap(VAC_HIGH_OUTPUT_ALARM);
    syslog(SYSLOG_ERROR, "Высокое выходное напряжение (%0.1f В)", VACoutputCurrent);
    
  6. При отказе флешки контроллер виснет - хочется чтобы продолжал работать пусть и без журнала. ~={green}Fixed.=~

  7. Сброс ИБП командой "C" (кнопка отмены отключения) если состояние Fault длится более 15-и секунд. ~={green}Fixed.=~ Добавил анализ состояния в функцию void kstar_mode(void)

        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;
        }
    
  8. Лишняя авария (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 - OK

~={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 - проверяем

  1. Не проверяем 23 - там всегда +3,3 24 - PA1 RMII_REFCLK

  2. Проверяем 25 - PA2 - RMII_MDIO 26 - PA3

  3. 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