Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Отслеживание перехода НОРМА->АВАРИЯ разных параметров

Вт дек 19, 2017 07:20:14

Добрый день, есть несколько разных параметров, температура напряжение и тд.
так вот надо отследить, переход параметра(ов) из Нормы в Аварию и соответственно обратно.
Ну и при аварии это все в журнал занести и тд.
Сделал это так:

Код:
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

Не очень понял, но по-моему вам чуток изменить алгоритм: вызывать функции логгирования только при изменении состояния:
Код:
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

я записал без цикла и массивов, но по-моему, идея понятна: вызывать функции логгирования только если состояние изменилось.

Да я сначала примерно так же хотел сделать, но потом у меня пошли более сложные функции(точнее пороги) которые я не смог в эту концепцию вписать, так что пришлось извратиться так.
Код:
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

pokk писал(а):Не не там с разными значениями сравнение идет
угу, проглядел...

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

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

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

Re: Отслеживание перехода НОРМА->АВАРИЯ разных параметров

Вт дек 19, 2017 11:37:12

Благодарю!! теперь наконец то можно от этих всех функций избавиться, сделать только парочку со сложной проверкой.
Ответить