~={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;
}