Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 01.03.2016, 11:49  
jenya77
Прохожий
 
Регистрация: 28.02.2016
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
jenya77 на пути к лучшему
По умолчанию Обработка логических условий.

Не нашел подходящего раздела. Решил опубликовать здесь. Все таки пишу под ARM.
я хочу выполнять разные задачи в камне. скажем включи вентилятор после 17:00 если температура больше 30* C и выключи его после 22:00 или если температура упала ниже 27* C.
я бы мог записать в терминале.
Код:
time ›= 17:00 AND temp › 30 out1 = 1
time ›= 22:00 OR temp ‹ 27 out1 = 0
это легко распарсить в структуру и потом проверить .
Код:
{
	float *variable;
	float limit;
	uint32_t compare;    //0 = '==', 1 = '›', 2 = '‹', 3 = '›=', 4 = '‹=', 5 = '!='
	uint32_t logicGate;  //0=none, 1=or, 2=and
};
Struct sTaskParam taskParam[4];
и потом заполнить (это псевдо код чтоб не усложнять. в реале немного подругому.)
Код:
taskParam[0].variable =time;
taskParam[0].compare = “›=”;
taskParam[0].limit =17.00;
taskParam[0].logicGate = and;

taskParam[1].variable =temperature;
taskParam[1].compare = “›=”;
taskParam[1].limit =30;
taskParam[1].logicGate = none;


taskParam[2].variable = time;
taskParam[2].limit = 22.00;
taskParam[2].compare = “›=”;
taskParam[2].logicGate = or;

taskParam[3].variable =temperature;
taskParam[3].limit =27;
taskParam[3].compare = “‹=”;
taskParam[3].logicGate = none;
и потом для условия time ›= 17:00 AND temp › 30 out1 = 1
Код:
uint32_t EvaluateParamCondition(float *val, float val_lim, uint32_t compare)
{
	switch (compare)
	{
	    case 0: return (*val == val_lim); break;
	    case 1: return (*val › val_lim);  break;
	    case 2: return (*val ‹ val_lim);  break;
	    case 3: return (*val ›= val_lim); break;
	    case 4: return (*val ‹= val_lim); break;
	    case 5: return (*val != val_lim); break;
	    default : return BAD_PARAM;
	}
}
uint32_t condition[2];
uint32_t global_result;
for (int i = 0; i ‹ 3; i++)
{
    condition[i] = EvaluateParamCondition(taskParam[i].variable, taskParam[i].limit, taskParam[i].compare);
}

for (int i = 0; i ‹ 3; i++)
{
    if (taskParam[i].logicGate == OR)
        global_result |= condition[i];
    else if (taskParam[i].logicGate == AND)
        global_result &= condition[i];
}
if (global_result)
{
    out1 = 1;
}
ну и похожим образом для второго условия.

но при усложнении логики и добавлении скобок парсинг резко усложняется и не понятно какую структуру изобрести для сложных логических выражений.

вот тут я впал в ступор - time › 17:00 OR (temperature › 30 AND in1 = 1) out1=1
как хранить и обрабатывать логические группы?
Реклама:
jenya77 вне форума  
Непрочитано 01.03.2016, 12:02  
costco
Вид на жительство
 
Регистрация: 24.08.2015
Сообщений: 252
Сказал спасибо: 7
Сказали Спасибо 50 раз(а) в 36 сообщении(ях)
costco на пути к лучшему
По умолчанию Re: Обработка логических условий.

http://akb77.com/g/stm32/uc/
или простенькую форт-машину запилить.
costco вне форума  
Непрочитано 01.03.2016, 12:15  
jenya77
Прохожий
 
Регистрация: 28.02.2016
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
jenya77 на пути к лучшему
По умолчанию Re: Обработка логических условий.

Сообщение от costco Посмотреть сообщение
http://akb77.com/g/stm32/uc/
или простенькую форт-машину запилить.
спасибо. ссылка интересная. Но дело в том что я не могу нагружать пользователя написанием скриптов. не факт что он знает программирование.
jenya77 вне форума  
Непрочитано 01.03.2016, 18:07  
messoft
Гражданин KAZUS.RU
 
Регистрация: 22.04.2009
Адрес: Херсон
Сообщений: 487
Сказал спасибо: 234
Сказали Спасибо 146 раз(а) в 93 сообщении(ях)
messoft на пути к лучшему
По умолчанию Re: Обработка логических условий.

Попробуй каты карно, иногда использую когда слишком сложное условие.
messoft вне форума  
Непрочитано 01.03.2016, 19:55  
jenya77
Прохожий
 
Регистрация: 28.02.2016
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
jenya77 на пути к лучшему
По умолчанию Re: Обработка логических условий.

Сообщение от messoft Посмотреть сообщение
Попробуй каты карно, иногда использую когда слишком сложное условие.
а как это выражается в коде?
jenya77 вне форума  
Непрочитано 01.03.2016, 22:10  
messoft
Гражданин KAZUS.RU
 
Регистрация: 22.04.2009
Адрес: Херсон
Сообщений: 487
Сказал спасибо: 234
Сказали Спасибо 146 раз(а) в 93 сообщении(ях)
messoft на пути к лучшему
По умолчанию Re: Обработка логических условий.

https://ru.wikipedia.org/wiki/%D0%9A...80%D0%BD%D0%BE
http://monitor.espec.ws/section14/topic179032.html
Подробно уже не помню, надо подымать учебники. Но если пишете программу и необходимо обработка сложного условия состоящего например из 30-ти If-ов то после использования карт выражение может соркратится до 5-ти.
messoft вне форума  
Непрочитано 01.03.2016, 22:23  
Bald_Bob
Вид на жительство
 
Аватар для Bald_Bob
 
Регистрация: 29.11.2015
Адрес: МО
Сообщений: 393
Сказал спасибо: 85
Сказали Спасибо 746 раз(а) в 190 сообщении(ях)
Bald_Bob на пути к лучшему
По умолчанию Re: Обработка логических условий.

Сообщение от jenya77 Посмотреть сообщение
Сообщение от messoft
Попробуй каты карно, иногда использую когда слишком сложное условие.
а как это выражается в коде?
Никак
Messoft предлагает использовать Карты Карно чтобы упростить сложное логическое выражение перед тем как ввести их в контроллер

Сообщение от costco Посмотреть сообщение
простенькую форт-машину запилить.
Поддерживаю
Когда-то была подобная задача.
Нужно было арифметические выражения вводить в контроллер.
Использовали обратную польскую запись плюс что-то вроде форта.
Хотя форт это громко сказано.
Некая стековая машина.
Написано было очень быстро и объем кода получился микроскопический.
__________________
Не горюй, что не всюду успел — может ты опоздал на "Титаник" (C) И. Губерман

Последний раз редактировалось Bald_Bob; 02.03.2016 в 06:01.
Bald_Bob вне форума  
Непрочитано 02.03.2016, 09:25  
pisetsky
Прописка
 
Аватар для pisetsky
 
Регистрация: 09.06.2009
Адрес: Саров
Сообщений: 135
Сказал спасибо: 1,321
Сказали Спасибо 338 раз(а) в 79 сообщении(ях)
pisetsky на пути к лучшему
По умолчанию Re: Обработка логических условий.

Может, подойдет?
Там самое интересное - с последнего абзаца 2 страницы и далее. Правда, примеры на MCS-51, но идея просматривается. Кстати, может классическая Switch-технология (до указанного места) и лучше?
Вложения:
__________________
Качество программы измеряется в количествах "Что за..." на 10 шагов отладки...
pisetsky вне форума  
Сказали "Спасибо" pisetsky
majorka65 (21.04.2016)
Непрочитано 02.03.2016, 09:33  
индюк
Заблокирован
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: Обработка логических условий.

не понял в чем сложность..........

вот например у меня на шине данных процы отвечают по уникальному адресу
парсят на лету строку в которой содержится адрес и команда

Код:
void USART1_IRQHandler ()
	

{

	
	
	A = USART1-›RDR;
	USART1-›RQR = USART_RQR_RXFRQ; //reset rx flag
	

		
	if (c2==0&&A==0x41) { c2=1; return;} //A
	if (c2==1&&A==0x44) { c2=2; return;} //D
	if (c2==2&&A==0x52) { c2=3; return;} //R
	if (c2==3&&A==0x45) { c2=4; return;} //E
	if (c2==4&&A==0x53) { c2=5; return;} //S
	if (c2==5&&A==0x30) { c2=6; return;} //0
	if (c2==6&&A==0x33) { c2=7; return;} //3
	//if (c2==6&&A==0x34) { c2=7; return;} //4
	//if (c2==6&&A==0x35) { c2=7; return;} //5
	//if (c2==6&&A==0x36) { c2=7; return;} //6
	if (c2==7&&A==0X5F) { c2=8; return;}  //_ 
	if (c2==8)
			{
							switch (A)
								{ 
									case 0x41: c3 = 1; break;
									case 0x42: c3 = 2; break;									
									case 0x43: c3 = 3; break;
									case 0x44: c3 = 4; break;
									
									case 0x45: c3 = 5; break;
									case 0x46: c3 = 6; break;	
									case 0x47: c3 = 7; break;
									case 0x48: c3 = 8; break;											

								}
						
	
	
	c2=0;
								
								
		/*					
		USART1-›CR1 &= ~(USART_CR1_RE);
		puthex(A, 3);
		USART1-›CR1 |= USART_CR1_RE;	
*/
								
}
c2=0;
}
индюк вне форума  
Непрочитано 02.03.2016, 11:26  
jenya77
Прохожий
 
Регистрация: 28.02.2016
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
jenya77 на пути к лучшему
По умолчанию Re: Обработка логических условий.

спасибо за примеры.
jenya77 вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посоветуйте зарядку liion для условий whoim Источники питания и свет 19 28.01.2015 17:45
Посоветуйте: обработка аудиосигнала Old_Monster Аудиотехника 35 17.04.2012 14:02
Цифровая обработка звука - реально !!! namemeyourself Аудиотехника 7 29.09.2010 23:28


Часовой пояс GMT +4, время: 10:44.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot