jenya7 0 27 января, 2016 Опубликовано 27 января, 2016 (изменено) · Жалоба я хочу програмировать задачи - состояния на выходе в зависимости от условий на входе. этакий мини Programmable Logic Controller. для примера код // условие на входе If (temp > 30 && hum > 80 || input1 ==1) { // условие на выходе output2 = 1; } Где temp, hum - глобальные переменные но задаваемые пользователем через теринал. пользователь програмирует такое условие следующим образом. task 1 param 1 temp > 30 AND task 1 param 2 hum > 80 OR task 1 in 1 1 task 1 out 2 1 или так task 1 param 1 temp > 30 task 1 param 2 hum > 80 task 1 in 1 1 task 1 param 1 AND param 2 OR in 1 task 1 out 2 1 и я это сохраняю и потом проверяю и если условие выполняется - включаю\выключаю нужные выходы. вопрос есть ли какие то готовые библиотеки а-ля-PLC? Изменено 27 января, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 74 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба вам скорее всего сюда для начала: http://electronix.ru/forum/index.php?showtopic=132940 если ничего из предложенного не подойдёт тогда можно и свой велосипед поизобретать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба вопрос есть ли какие то готовые библиотеки а-ля-PLC? Первая и главная задача в PLC это в чем и как вы будете создавать пользовательские программы. Как проверять и отлавливать ошибки синтаксиса программ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба вам скорее всего сюда для начала: http://electronix.ru/forum/index.php?showtopic=132940 если ничего из предложенного не подойдёт тогда можно и свой велосипед поизобретать. распарсить команды у меня нет проблем. вопрос где хранить входные условия и как их сравнивать. Первая и главная задача в PLC это в чем и как вы будете создавать пользовательские программы. Как проверять и отлавливать ошибки синтаксиса программ. товарищи давайте отделим зерна от плевел. парсинг, проверка синтаксиса и прочее - это отдельная задача. вопрос как организовать хранение и сравнение логики входных условий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба распарсить команды у меня нет проблем. вопрос где хранить входные условия и как их сравнивать. товарищи давайте отделим зерна от плевел. парсинг, проверка синтаксиса и прочее - это отдельная задача. вопрос как организовать хранение и сравнение логики входных условий. Здрасте. Если вы распарсили, то значит уже храните результат в памяти. Иначе это был не парсинг. В памяти же хранятся и указатели на действия. Функции действий вы же уже создали? Так в чем вопрос, если с парсингом нет проблем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 января, 2016 Опубликовано 27 января, 2016 (изменено) · Жалоба я подумал сделать что то вроде этого создал структуру для параметров, входов и выходов. struct sTaskParams { float *var; //var compare limit float limit; uint8_t compare; //0 = '==', 1 = '>', 2 = '<', 3 = '>=', 4 = '<=', 5 = '!=' uint8_t logicGate; //0=and, 1=or uint8_t enable; }; struct sTaskDigInput { uint8_t enable; uint8_t inNum; uint8_t inState; uint8_t logicGate; }; struct sTaskOutput { uint8_t enable; uint8_t outNum; uint8_t outState; }; struct sTaskCondition { uint8_t result; uint8_t logic; }; потом создал задачу в которой жестко задал 10 параметров 8 входов и 8 выходов. struct sDailyTask { uint8_t enable; //ON/OFF uint8_t state; uint32_t condIdx; struct sTaskParam taskParams[MAX_PARAMS]; struct sTaskDigInput taskDigInputs[MAX_DIG_INPUTS]; struct sTaskOutput taskOutputs[MAX_OUTPUTS]; struct sTaskCondition taskCondition[MAX_CONDITIONS]; }; ну и массив из 10 задач. struct sDailyTask dailyTask[MAX_TASKS]; в принципе если логика идет подряд param1 && param2 || input1 то так я понимаю как обработать условие проверяю параметры uint32_t TASKER_ChekParameters(uint32_t task_num) { uint32_t glob_cond=0; for (int i = 0; i < sizeof(dailyTask[task_num].taskParams); i++) { if (dailyTask[task_num].taskParams[i].enable) { dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].result = TASKER_EvaluateParamCondition(dailyTasktask_num].taskParams[i].variable, dailyTask[task_num].taskParams[i].limit, dailyTask[task_num].taskParams[i].compare); dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].logic = dailyTask[task_num].taskParams[i].logicGate; dailyTask[task_num].condIdx++; } } проверяю входы uint32_t TASKER_CheckInputs(uint32_t task_num) { int size = sizeof(dailyTask[task_num].taskDigInputs); for (int i = 0; i < size; i++) { if (dailyTask[task_num].taskDigInputs[i].enable) { dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].result = TASKER_EvaluateInputCondition(dailyTask[task_num].taskDigInputs[i].inNum, dailyTask[task_num].taskDigInputs[i].inState); dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].logic = dailyTask[task_num].taskDigInputs[i].logicGate; dailyTask[task_num].condIdx++; } } return 0; } потом смотрю общий результат всех входных условий uint32_t TASKER_EvaluateTaskCondition(uint32_t task_num) { uint32_t result=0; TASKER_ChekParameters(task_num); TASK_CheckInputs(task_num); for (int i = 0; i < dailyTask[task_num].condIdx; i++) { if (dailyTask[task_num].taskCondition[i].logic == OR) result |= dailyTask[task_num].taskCondition[i].result; else if (dailyTask[task_num].taskCondition[i].logic == AND) result &= dailyTask[task_num].taskCondition[i].result; } return result; } но если условие более заковыристое (param1 && input1) || (param2 && (input2 || input3)) вот тут я не могу додуматься как создать структуру которая будет хранить логические связи. Изменено 27 января, 2016 пользователем Herz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба я подумал сделать что то вроде этого Ну ясно. Нет у вас никакого парсинга. Парсинг это не структуры, а динамичекеские деревья и списки. Возьмите например парсер JSON, сейчас это очень модно и актуально, и посмотрите как делается парсинг. В JSON кстати можете закодировать всю вашу пользовательскую программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 января, 2016 Опубликовано 27 января, 2016 (изменено) · Жалоба Ну ясно. Нет у вас никакого парсинга. Парсинг это не структуры, а динамичекеские деревья и списки. Возьмите например парсер JSON, сейчас это очень модно и актуально, и посмотрите как делается парсинг. В JSON кстати можете закодировать всю вашу пользовательскую программу. а более бесполезный совет не в тему Вы бы могли мне дать? мне их так не хватает. или давайте пообсуждаем о том как произноситься char на шести страницах. Изменено 27 января, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RabidRabbit 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба но если условие более заковыристое (param1 && input1) || (param2 && (input2 || input3)) вот тут я не могу додуматься как создать структуру которая будет хранить логические связи. если проблем с парсингом нет, то, например, так: param1 input1 && param2 input2 input3 || && || Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба а более бесполезный совет не в тему Вы бы могли мне дать? мне их так не хватает. или давайте пообсуждаем о том как произноситься char на шести страницах. Я вам что-то должен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 января, 2016 Опубликовано 27 января, 2016 (изменено) · Жалоба если проблем с парсингом нет, то, например, так: param1 input1 && param2 input2 input3 || && || да но вопрос как это сохранить, в какой структре. чтоб потом знать - сделай AND с этой группой а потом сделай OR с той группой а потом сделай AND межу ними. как это практически связать. Я вам что-то должен? нет. у меня претензий нет. очень класный совет. Изменено 27 января, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 18 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба ТС, думаю Вам нужно копать в сторону парсеров математических выражений. Там делается анализ строки, затем разделение на лексемы, и вычисление с учётом приоритетов и скобок. Посмотрите, например ТУТ - для хранения там используется строка с входным выражением и массив для лексем. Можете прямо в том примере заменить функции, обрабатывающие умножение,деление и т.п на свои - сравнения и логики. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RabidRabbit 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба задействуйте фантазию :) как пример: для каждой строки (из результата разбора) - uint16_t старшие 2 бита: тип 0 - параметр: 14 битов - знаковое целое (константа) 1 - значение входа: 14 битов -беззнаковое целое (номер входа) 2 - операция: 14 битов - индекс операции (0 - меньше, 1 - больше, 2 - равно, ....) 3 - маркер завершения обработка: читаем uint16_t если это параметр - помещаем int16_t значение в стек если это значение входа - читаем значение соответствующего входа и помещаем int16_t значение в стек если это операция - снимаем со стека 2 значения, выполняем операцию, результат кладём в стек если это маркер завершения, снимаем со стека результат. да но вопрос как это сохранить, в какой структре. чтоб потом знать - сделай AND с этой группой а потом сделай OR с той группой а потом сделай AND межу ними. как это практически связать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба ТС, думаю Вам нужно копать в сторону парсеров математических выражений. Там делается анализ строки, затем разделение на лексемы, и вычисление с учётом приоритетов и скобок. Посмотрите, например ТУТ - для хранения там используется строка с входным выражением и массив для лексем. Можете прямо в том примере заменить функции, обрабатывающие умножение,деление и т.п на свои - сравнения и логики. родные мои! ну распарсили мы строку! все прекрасно! куда сохранять результаты парсинга? конкретно в железе! в микроконтролере! задействуйте фантазию :) вопрос где тут групировка логических гейтов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RabidRabbit 0 27 января, 2016 Опубликовано 27 января, 2016 · Жалоба вопрос где тут групировка логических гейтов. (0 - меньше, 1 - больше, 2 - равно, 3 - логическое И, 4 - логическое ИЛИ, ....) максимально качествоенно разжевал, по-моему :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться