Например TDA7294

Форум РадиоКот • Просмотр темы - Отслеживание перехода НОРМА->АВАРИЯ разных параметров
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вс июл 13, 2025 16:34:33

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Отслеживание перехода НОРМА->АВАРИЯ разных параметров
СообщениеДобавлено: Вт дек 19, 2017 07:20:14 
Вымогатель припоя

Зарегистрирован: Вт ноя 02, 2010 17:46:37
Сообщений: 574
Рейтинг сообщения: 0
Добрый день, есть несколько разных параметров, температура напряжение и тд.
так вот надо отследить, переход параметра(ов) из Нормы в Аварию и соответственно обратно.
Ну и при аварии это все в журнал занести и тд.
Сделал это так:

Код:
void poling_error(void){
uint8_t i=0;
   for(i=0;i<(MAX_HANDLER_SWITCH+1);i++){
      switch(CallBackSwitch[i].mode){
         case STATUS_NORM:{
            // Вызываеться функция когда парметр в норме
            // Ожидание перехода в АВАРИЮ
            if(CallBackSwitch[i].CallBack_Norm){
               CallBackSwitch[i].mode=CallBackSwitch[i].CallBack_Norm();
            }
            break;
         }
         case STATUS_ERROR:{
            // Вызываеться функция когда парметр в АВАРИИ
            // Ожидание перехода в НОРМУ
            if(CallBackSwitch[i].CallBack_Error){
               CallBackSwitch[i].mode=CallBackSwitch[i].CallBack_Error();
            }
            break;
         }
      }
   }
}


Код:
uint8_t T_12_Norm(void){
   // текуший статус норма ожидаем перехода в аварию
   if(GetCurrent_T(T_BAL_12)>=Global_Flash_SettingAllVar.T_BALL_TOP){
      SetStatus(MATCH_ERROR,ST_T12);
      //Журнал аварии
      ArgWebLog.id=ERROR_ID_T12_BALL_ERROR;
      ArgWebLog.status=STATUS_WEB_BAD;
      Add_WebLog(ArgWebLog);
      //----------
        AddBufferStr((unsigned char*)&trap_T_12_ERROR);
      //----------
      return STATUS_ERROR;
   }
   if(GetCurrent_T(T_BAL_12)>=Global_Flash_SettingAllVar.T_BALL_BOT){
      SetStatus(MATCH_ADMONITION,ST_T12);
   }
   return STATUS_NORM;
}
//=========================
uint8_t T_12_Error(void){
   if(GetCurrent_T(T_BAL_12)<=Global_Flash_SettingAllVar.T_BALL_BOT){
      SetStatus(MATCH_NORM,ST_T12);
      ArgWebLog.id=ERROR_ID_T12_BALL_NORM;
      ArgWebLog.status=STATUS_WEB_GOOD;
      Add_WebLog(ArgWebLog);
      //----------
        AddBufferStr((unsigned char*)&trap_T_12_NORM);
      //----------
      return STATUS_NORM; // после этого эта функция больше не вызываеться
   }
   if(GetCurrent_T(T_BAL_12)<=Global_Flash_SettingAllVar.T_BALL_TOP){
      SetStatus(MATCH_ADMONITION,ST_T12);
   }
   return STATUS_ERROR;
}


Но тут мне не нравиться что в функции T_12_Norm и T_12_Error вызываються постоянно, хотелось бы сделать что бы было более прозрачно, что бы они вызывались чисто при переключению единоразово,но пока вижу что особо это не как не сделаешь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Отслеживание перехода НОРМА->АВАРИЯ разных параметров
СообщениеДобавлено: Вт дек 19, 2017 08:29:30 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Не очень понял, но по-моему вам чуток изменить алгоритм: вызывать функции логгирования только при изменении состояния:
Код:
uint8_t old_state;
if((parameter > ERROR_VAL) != old_state){
   old_state = parameter > ERROR_VAL;
   write_to_log(old_state);
}(
я записал без цикла и массивов, но по-моему, идея понятна: вызывать функции логгирования только если состояние изменилось.

назначение ваших отдельных функций нормы и ошибки я так и не понял...

Добавлено after 6 minutes 41 second:
Кстати, у вас ошибка в алгоиртме: если GetCurrent_T(T_BAL_12) равно Global_Flash_SettingAllVar.T_BALL_BOT, то это одинаково удровлетворяет обоим ситуациям - и аварии, и норме. потому что у вас в обоих вариантах проверка ведется на или равно

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Отслеживание перехода НОРМА->АВАРИЯ разных параметров
СообщениеДобавлено: Вт дек 19, 2017 11:05:33 
Вымогатель припоя

Зарегистрирован: Вт ноя 02, 2010 17:46:37
Сообщений: 574
Рейтинг сообщения: 0
Цитата:
я записал без цикла и массивов, но по-моему, идея понятна: вызывать функции логгирования только если состояние изменилось.

Да я сначала примерно так же хотел сделать, но потом у меня пошли более сложные функции(точнее пороги) которые я не смог в эту концепцию вписать, так что пришлось извратиться так.
Код:
uint8_t AC_Norm(void){
   //---------- пониженного напряжения это авария---------------
   if(GetStatus_web_AC()==AC_ERROR_LOW){
      ArgWebLog.id=ERROR_ID_AC_ER_180;
      ArgWebLog.status=STATUS_WEB_BAD;
      Add_WebLog(ArgWebLog);
      //----------
        AddBufferStr((unsigned char*)&trap_AC_LOW_ERROR);
      //----------
      return STATUS_ERROR;
   }
   //---------- повышенного напряжения это авария---------------
   if(GetStatus_web_AC()==AC_ERROR){
      ArgWebLog.id=ERROR_ID_AC_ER_256;
      ArgWebLog.status=STATUS_WEB_BAD;
      Add_WebLog(ArgWebLog);
      //----------
        AddBufferStr((unsigned char*)&trap_AC_HIGH_ERROR);
      //----------
      return STATUS_ERROR;
   }
   return STATUS_NORM;
}
//=========================
uint8_t AC_Error(void){
   if(GetStatus_web_AC()==AC_NORM){
      ArgWebLog.id=ERROR_ID_AC_NORM;
      ArgWebLog.status=STATUS_WEB_GOOD;
      Add_WebLog(ArgWebLog);
      //----------
        AddBufferStr((unsigned char*)&trap_AC_NORM);
      //----------
      return STATUS_NORM;
   }
   return STATUS_ERROR;
}

Цитата:
Кстати, у вас ошибка в алгоиртме:

Не не там с разными значениями сравнение идет T_BALL_BOT или T_BALL_TOP.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Отслеживание перехода НОРМА->АВАРИЯ разных параметров
СообщениеДобавлено: Вт дек 19, 2017 11:12:46 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
pokk писал(а):
Не не там с разными значениями сравнение идет
угу, проглядел...

тогда я так понимаю: у вас есть какие-то параметры, для некоторых есть особые проверки на аварию, для других - обычные. вам надо логгировать каждую аварию и возврат к норме. все верно изложил?

применим ООП-подход :)

объявляем структуру "параметр", внутри которой будет адрес функции "особой проверки", помимо значений всяких порогов и т.п. С этого момента все, как я ранее предложил, и как вы ранее пробовали: вызываем функцию проверки параметра, сравниваем её результат с предыдущим, если изменился - логгируем и запоминаем...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Выбираем индустриальные и медицинские источники питания MEAN WELL в открытом исполнении

Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Отслеживание перехода НОРМА->АВАРИЯ разных параметров
СообщениеДобавлено: Вт дек 19, 2017 11:37:12 
Вымогатель припоя

Зарегистрирован: Вт ноя 02, 2010 17:46:37
Сообщений: 574
Рейтинг сообщения: 0
Благодарю!! теперь наконец то можно от этих всех функций избавиться, сделать только парочку со сложной проверкой.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y