Добрый день, есть несколько разных параметров, температура напряжение и тд. так вот надо отследить, переход параметра(ов) из Нормы в Аварию и соответственно обратно. Ну и при аварии это все в журнал занести и тд. Сделал это так:
Код:
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 вызываються постоянно, хотелось бы сделать что бы было более прозрачно, что бы они вызывались чисто при переключению единоразово,но пока вижу что особо это не как не сделаешь.
я записал без цикла и массивов, но по-моему, идея понятна: вызывать функции логгирования только если состояние изменилось.
назначение ваших отдельных функций нормы и ошибки я так и не понял...
Добавлено after 6 minutes 41 second: Кстати, у вас ошибка в алгоиртме: если GetCurrent_T(T_BAL_12) равно Global_Flash_SettingAllVar.T_BALL_BOT, то это одинаково удровлетворяет обоим ситуациям - и аварии, и норме. потому что у вас в обоих вариантах проверка ведется на или равно
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
я записал без цикла и массивов, но по-моему, идея понятна: вызывать функции логгирования только если состояние изменилось.
Да я сначала примерно так же хотел сделать, но потом у меня пошли более сложные функции(точнее пороги) которые я не смог в эту концепцию вписать, так что пришлось извратиться так.
тогда я так понимаю: у вас есть какие-то параметры, для некоторых есть особые проверки на аварию, для других - обычные. вам надо логгировать каждую аварию и возврат к норме. все верно изложил?
применим ООП-подход
объявляем структуру "параметр", внутри которой будет адрес функции "особой проверки", помимо значений всяких порогов и т.п. С этого момента все, как я ранее предложил, и как вы ранее пробовали: вызываем функцию проверки параметра, сравниваем её результат с предыдущим, если изменился - логгируем и запоминаем...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения