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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

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

Код: Выделить всё

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 вызываються постоянно, хотелось бы сделать что бы было более прозрачно, что бы они вызывались чисто при переключению единоразово,но пока вижу что особо это не как не сделаешь.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Код: Выделить всё

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, то это одинаково удровлетворяет обоим ситуациям - и аварии, и норме. потому что у вас в обоих вариантах проверка ведется на или равно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение pokk »

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

Код: Выделить всё

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.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

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

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

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

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

Сообщение pokk »

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

Вернуться в «Разные вопросы по МК»