~={green}Замечания от заказчика=~
Событие "Срабатывание EPO" формируется в модуле ups_monitor.c В отдельной функции UPS_EPOMonitor. Нужно ли ее отключить?
#define EPO_MONITOR
Событие "Ош подкл вх напр" формируется в модуле ups_monitor.c В отдельной функции UPS_PhaseFailMonitor. Нужно ли ее отключить?
#define PHASE_FAIL_MONITOR
При запуске теста АКБ в логе информация о смене режима работы, но не о тесте. В syslog правильно. ~={yellow}Question.=~ В логе в событиях контроллера не отображается режим работы "тест АКБ" (Вход в тест, выход из теста.) УПС не сообщает, что находится в режиме теста. Что делать?
В веб-интерфейсе отображается входная частота, в случае оффлайн ИБП особого смысла не имеет. Логичнее указывать только частоту выходного напряжения. ~={yellow}Question.=~ ~={green}Fixed.=~
Существует множество режимов работы контроллера ИБП.
Необходимо уточнить в каких режимах показывать входную частоту и какое значение выводить? Во всех режимах кроме 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);
}
Проблема IAP. ~={red}Open.=~
Полная мощность ИБП 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;
}
Убрать отправку 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
}
Сообщение в лог "авария входного напряжения 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
В syslog именует выходное напряжение входным. ~={green}Fixed.=~
// ups_monitor.c
// Поменял "входное" на "выходное"
SNMP_SendUserTrap(VAC_HIGH_OUTPUT_ALARM);
syslog(SYSLOG_ERROR, "Высокое выходное напряжение (%0.1f В)", VACoutputCurrent);
При отказе флешки контроллер виснет - хочется чтобы продолжал работать пусть и без журнала. ~={green}Fixed.=~
Сброс ИБП командой "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;
}
Лишняя авария (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 в низкий уровень.
15 с 16 - проверяем 16 с 17 - проверяем
Не проверяем 23 - там всегда +3,3 24 - PA1 RMII_REFCLK
Проверяем 25 - PA2 - RMII_MDIO 26 - PA3
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