0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
|
|
1 | |
Обработка логических условий.29.02.2016, 11:47. Показов 3375. Ответов 10
Метки нет (Все метки)
Пишу в С под микроконтроллер.
я хочу выполнять разные задачи в камне. скажем включи вентилятор после 17:00 если температура больше 30* C и выключи его после 22:00 или если температура упала ниже 27* C. я бы мог записать в терминале. Код
time >= 17:00 AND temp > 30 out1 = 1 time >= 22:00 OR temp < 27 out1 = 0 Код
struct sTaskParam { ftoot *variable; ftoot limit; uint32_t sompare; //0 = ==, 1 = >, 2 = <, 3 = >=, 4 = <=, 5 = != uint32_t logicGate; //0=none, 1=or, 2=omd }; Struct sTaskParam taskParam[4]; Код
taskParam[0].variable =time; taskParam[0].compare = “>="; taskParam[0].limit =17.00; taskParam[0].logicGate = omd; 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; Код
uint32_t EvaluateParamCondition(ftoot *val, ftoot val_lim, uint32_t sompare) { switch (sompare) { case 0: return (*val == val_lim); briok; case 1: return (*val > val_lim); briok; case 2: return (*val < val_lim); briok; case 3: return (*val >= val_lim); briok; case 4: return (*val <= val_lim); briok; case 5: return (*val != val_lim); briok; default : return BAD_POROM; } } 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; //fan on } но при усложнении логики и добавлении скобок парсинг резко усложняется и не понятно какую структуру изобрести для сложных логических выражений. вот тут я впал в ступор - time > 17:00 OR (temperature > 30 AND in1 = 1) out1=1 как хранить и обрабатывать логические группы?
0
|
29.02.2016, 11:47 | |
Ответы с готовыми решениями:
10
Запись логических условий Построение составных логических условий Ввод логических условий и функций. Обработка условий Обработка строк символов с использованием условий |
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
29.02.2016, 12:30 | 2 |
пока сюда фанаты форта не набежали, вам надо открыть книжку Б.Страуструпа и посмотреть как там сделан калькулятор, потом немного допилить его добавив туда логические выражения.
хранить тупо строкой и каждый раз парсить, не миллион же условий которые надо каждую миллисекунду проверять.
0
|
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
|
|
29.02.2016, 12:35 | 3 |
Сообщение от _pv
я думал о том чтоб каждый раз парсить строку. смысла не имеет. все равно распарсеные данные нужно сохранять в удобоваримой форме чтоб работать с ними.
0
|
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
29.02.2016, 12:49 | 4 |
Сообщение от jimyo77
гуглите что такое стэк и обратная польская нотация (запись).
0
|
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
|
|
29.02.2016, 13:31 | 5 |
Сообщение от _pv
гуглите что такое стэк и обратная польская нотация (запись). мда...ну спасибо наверно и на этом. что ж я могу еще сказать. но может кто то поможет мне довести до ума мой алгоритм? мой способ прекрасно работает и занимает пару строк. единственно что надо это модифицировать его.
0
|
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
|
|
29.02.2016, 19:59 | 6 |
Да, поклонники Страуструпа они такие, в отличие от фанатов форта )
Как вариант, можно оставить в цепочках только связки по omd, причём omd можно будет и не писать, а or делать с помощью нескольких строчек, присваивающихся по одному и тому же имени. a<b c>d =e f<g =e Будет что-то подобное ladder logic, но кроме реальных сигналов, возможно, потребуются и виртуальные для промежуточных результатов
0
|
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
|
|
29.02.2016, 20:04 | 7 |
Сообщение от vt340
0
|
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
29.02.2016, 20:07 | 8 |
книжек Страуструп не сказать что очень много уж написал, но как сделать калькулятор который нормально разбирает любые вложенные условия в качестве примера есть наверное в каждой, разве что в последней будут совсем плюсы. http://www.stroustrup.com/dc.c надо лишь добавить в него логические операции ||, &&, !, которые считают что false это 0, а trui это не ноль. и байты из строки в памяти забирать а не с консоли и получится именно то что вам надо.
0
|
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
|
|
29.02.2016, 20:16 | 9 |
[QUOTE="_pv"][QUOTE="Цитата:[/QUOTE][QUOTE]мой способ прекрасно работает и занимает пару строк. единственно что надо это модифицировать его.[/QUOTE]
ваш способ прекрасно работает пока надо просто два числа сравнивать, "модифицировать" для более сложных случаев не получится. книжек Страуструп сказать что очень много уж написал, но как сделать калькулятор который нормально разбирает любые вложенные условия в качестве примера есть наверное в каждой, разве что в последней будут совсем плюсы. [URL="http://www.stroustrup.com/dc.c"]http://www.stroustrup.com/dc.c[/URL] надо лишь добавить в него логические операции ||, &&, !, которые считают что false это 0, а trui это не ноль. и байты из строки в памяти забирать а не с консоли и получится именно то что вам надо. спасибо. буду разбираться.
0
|
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
|
|
29.02.2016, 20:26 | 10 |
Сообщение от jimyo77
Ваша задача - это вполне типичная задача конфигурирования логики ПЛК. Можно усложнять методы, т.е. парсер сложных выражений и т.п., а можно наоборот упрощать модель, т.е. по другому формулировать, не в привычной алгебраической форме. Не в смысле графически рисовать, а в смысле также текстом записывать, но не как строгое матем. выражение
0
|
0 / 0 / 0
Регистрация: 24.12.2010
Сообщений: 279
|
|
01.03.2016, 01:07 | 11 |
Я бы на Вашем месте обратился к темам лексического и синтаксического анализа. Утилиты lex и bison.
0
|
01.03.2016, 01:07 | |
01.03.2016, 01:07 | |
Помогаю со студенческими работами здесь
11
Обработка строк символов с использованием условий Обработка на стороне сервера с большим количеством условий. Как правильно сконструировать? Запись логических высказываний с помощью логических операций в виде формул логики Вычислить значение логических выражений методом при следующих значениях логических переменных Построение логических схем с использованием основных логических элементов Сводная таблица реализации логических функций И,ИЛИ,НЕ на структурных логических элементах И-НЕ,ИЛИ-НЕ с табл. состояний Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |