|
мини PLC. |
|
|
|
Jan 27 2016, 08:11
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
я хочу програмировать задачи - состояния на выходе в зависимости от условий на входе. этакий мини 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?
Сообщение отредактировал Jenya7 - Jan 27 2016, 08:18
|
|
|
|
|
 |
Ответов
|
Jan 27 2016, 11:04
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(Jenya7 @ Jan 27 2016, 18:41)  я хочу програмировать задачи - состояния на выходе в зависимости от условий на входе. этакий мини Programmable Logic Controller. ... и я это сохраняю и потом проверяю и если условие выполняется - включаю\выключаю нужные выходы. вопрос есть ли какие то готовые библиотеки а-ля-PLC? Ваша задача не имеет никакого отношения к PLC, это полная чушь. То, что вы тут накалякали, в принципе может быть реализовано путем создания некого скриптового языка. Тем не менее для грамотного решения , вам придется озаботиться и БНФ, и парсингом, и интерпретатором. Однако поскольку вы демонстрируете чрезвычайно низкий уровень знаний и очень много гонора, то шансы на то, что вы сподобитесь решить эту задачу "в общем виде", исчезающе малы. Один из грамотных вариантов решения, который вам может оказаться посильным, таков: освойте язык Форт, поставьте Форт-систему на вашу целевую платформу и задайте для пользователя словарь только с определенными вами Форт словами, а все остальные Форт слова сделайте недоступными для пользователя. При этом парсингом займется Форт система, правда, синтаксис псевдо-языка будет с обратной польской записью. При желании и это можно изменить, да только вряд ли нужно.
|
|
|
|
|
Jan 27 2016, 12:14
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(=AK= @ Jan 27 2016, 17:04)  Ваша задача не имеет никакого отношения к PLC, это полная чушь.
То, что вы тут накалякали, в принципе может быть реализовано путем создания некого скриптового языка. Тем не менее для грамотного решения , вам придется озаботиться и БНФ, и парсингом, и интерпретатором. Однако поскольку вы демонстрируете чрезвычайно низкий уровень знаний и очень много гонора, то шансы на то, что вы сподобитесь решить эту задачу "в общем виде", исчезающе малы.
Один из грамотных вариантов решения, который вам может оказаться посильным, таков: освойте язык Форт, поставьте Форт-систему на вашу целевую платформу и задайте для пользователя словарь только с определенными вами Форт словами, а все остальные Форт слова сделайте недоступными для пользователя. При этом парсингом займется Форт система, правда, синтаксис псевдо-языка будет с обратной польской записью. При желании и это можно изменить, да только вряд ли нужно. от вашей демонстрации грандиозных знаний с тоже нех..илым апломбом толку мало. таких советов я могу каждый день выдавать пачками. Цитата(arhiv6 @ Jan 27 2016, 16:40)  Так не надо выделять место в памяти для хранения всех лексем поотдельности - они уже есть в исходной строке, парсер динамически её обрабатывает. Грубо говоря, нужно выделить место для хранения одной лексемы: Код char *expr; //Указатель на обрабатываемую строку char token[80]; //Лексема Там в статье всё расписано + приведён полностью рабочий код. Вам достаточно в нем заменить пару функций на свои.это очень смелое заявление. таких заявлений я могу каждый день выдавать пачками. Цитата(iosifk @ Jan 27 2016, 17:05)  Можно сделать не компилятор, и интерпретатор. Тогда ничего "хранить" не надо выполнение делается при обработке строк... Правда это "медленнее", чем если сначала откомпилировать, а потом исполнять "переваренный" код... Но зато проще сделать программу обработки. Вообще если сделать два вида исходных строк, то дело будет значительно проще реализовать. 1. "Арифметические строки" - введите "внутренние переменные", где "входы" или "внутренние переменные" проверяются на "больше-меньше" или "+/-" и результат этих действий превращается в битовые переменные 2. "Логические строки" в которых обрабатываются "битовые переменные"
Ну и Форт-система это тоже вариант.... извините но - тоже пачками.
|
|
|
|
|
Jan 27 2016, 14:27
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Herz @ Jan 27 2016, 20:11)  Автор! Попробуйте прислушаться к советам и не хамить. Я совершенно не понимаю, откуда возьмётся желание искать приемлемое для Вас решение, разжёвывать и класть в рот при такой "благодарности". я ни в коем случае не хочу никого оскорбить и приношу свои категорические извинения. просто я за конструктивные решения. если бы вы слышали какие я советы даю когда мы с ребятами выходим покурить - подумали бы не иначе докторскую недавно защитил. Цитата(iosifk @ Jan 27 2016, 20:20)  Ей бо глухой... Вы же почему-то сваливаете в одну кучу компиляцию исходников и исполняемую программу. На самом деле Вам надо сделать 2 программы. Одну - для превращения сложной командной строки исходника в более простой набор команд. Что-то вроде "RISC", когда каждая простейшая команда выполняет только одно действие. Либо устанавливает переменную или таймер, либо логически обрабатывает переменную. Ну и вторая часть - будет в контроллере, она и будет выполнять эти простейшие действия. И парсер там будет примитивный... Вы посмотрите мои статьи о битовом контроллере... а почему так нельзя? Код 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(dailyTask[task_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_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 2; } } что я могу сказать. работает. быстро. четко. конечно интенсивный дебагинг я еще не делал но... элементарная структура. 10 строк кода.
Сообщение отредактировал Jenya7 - Jan 27 2016, 14:34
|
|
|
|
|
Jan 27 2016, 15:06
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(arhiv6 @ Jan 27 2016, 20:35)  Можно, но такой вариант сложно масштабируем. Если делать в таком виде, то как Вы представляете себе решение для вашего же примера: (param1 && input1) || (param2 && (input2 || input3)) ? о! вот в этом вся загвоздка! вот это я и пытаюсь решить. не то чобы я был зациклен на моей имплиментации. просто других альтернатив нет пока. я думал сделать такую структуру Код struct sGroupResults { uint8_t result; uint8_t resLogic;
}; struct sConditionGroup { struct sGroupResults groupResults[10]; uint8_t groupLogic;
};
struct sTaskCondition { struct sConditionGroup condGroup[MAX_COND_GROUPS]; }; и тогда условие Код (param1 && input1) || (param2 && (input2 || input3)) расположиться так Код sTaskCondition.condGroup[0].groupResults[0].result = param 1; sTaskCondition.condGroup[0].groupResults[0].resLogic = AND; sTaskCondition.condGroup[0].groupResults[1].result = input 1; sTaskCondition.condGroup[0].groupResults[1].resLogic = NONE; sTaskCondition.condGroup[0].groupLogic = OR;
sTaskCondition.condGroup[1].groupResults[0].result = param 2; sTaskCondition.condGroup[1].groupResults[0].resLogic = NONE; sTaskCondition.condGroup[1].groupLogic = AND;
sTaskCondition.condGroup[2].groupResults[0].result = input 2; sTaskCondition.condGroup[2].groupResults[0].resLogic = OR; sTaskCondition.condGroup[2].groupResults[1].result = input 3; sTaskCondition.condGroup[2].groupResults[1].resLogic = NONE; sTaskCondition.condGroup[2].groupLogic= NONE; вопрос как в проверке условий объяснить что sTaskCondition.condGroup[0]. groupResults[0].result это param 1
Сообщение отредактировал Jenya7 - Jan 27 2016, 15:27
|
|
|
|
|
Jan 28 2016, 07:42
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Jan 27 2016, 18:06)  о! вот в этом вся загвоздка! вот это я и пытаюсь решить. не то чобы я был зациклен на моей имплиментации. просто других альтернатив нет пока. я думал сделать такую структуру При разработке своего контроллера я подумал побольше и сделал так. Любая логическая функция из N переменных описывается таблицей истинности из 2^N строк. Если переменные пронумерованы, то и на результат можно ссылаться числом. Например, для 5 переменных имеем 32 результата. Зная значения всех 5 переменных, мы можем получить номер бита в 32-битном хранилище результата. В байткодах это выгладит так: TABLE5(result_value) VAR0 VAR1 VAR2 VAR3 VAR4 GETRESULT Компилятор должен преобразовать сложное логическое выражение к таблице истинности и получить правильный resul_value.
|
|
|
|
|
Jan 28 2016, 09:34
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Jan 28 2016, 10:54)  честно говоря я мало что понял. Утверждается, что (param1 && input1) || (param2 && (input2 || input3)) соответствует таблица истинности из вложенного файла. Из значений переменных собираем индекс: n = (param1 << 4) + (param2 << 3) + (input1 << 2) + (input 2 << 1) + (input3 << 0); Затем получаем результат: ((0xFEF0EE00) >> n) & 1 Т.е. для вычисления (param1 && input1) || (param2 && (input2 || input3)) нам достаточно знать одно волшебное 32-битное число 0xFEF0EE00. Причем, для меня важным моментом было время вычисления логической функции любой сложности из максимум 5 переменных. При таком подходе оно фиксировано и минимально (не зависит от вида функции и от значений переменных). А самое главное, легко описывается байт-кодом и элементарно вычисляется. Теперь понятно?
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 28 2016, 20:41
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(adnega @ Jan 28 2016, 20:04)  Из значений переменных собираем индекс: n = (param1 << 4) + (param2 << 3) + (input1 << 2) + (input 2 << 1) + (input3 << 0); Затем получаем результат: ((0xFEF0EE00) >> n) & 1 Т.е. для вычисления (param1 && input1) || (param2 && (input2 || input3)) нам достаточно знать одно волшебное 32-битное число 0xFEF0EE00. А теперь немножко расширим подход. Запланируем "таблицу" в 256 значений, соответственно, "волшебное число" будет состоять не из 4-битных полей, а из 8-битных, т.е из байт. "Bолшебное число" не будем ограничивать размерами, а запишем в байтовый массив произвольной длины. А в самой таблице будем держать адреса функций, которые будут выполняться, когда в массиве встретится соответствующий байт. В результате мы получим заготовку для простейшей Форт-машины, а байтовый массив будет содержать то, что называется "программой из байт-кодов". Для того, чтобы окончательно оформить Форт-машину, сначала зададимся вопросом; а как функции, вызываемые по своим байт-кодам, будут обмениваться информацией друг с другом? И придем к выводу, что проще всего использовать стек, откуда функции будут брать исходные данные для вычислений, и куда они будут класть результаты. Затем задумаемся, а хорошо ли, что наши программы выполняются линейно, в порядке расположения байт-кодов в массиве? Нехорошо, надо бы предусмотреть возможность изменения порядка выполнения байт-кодов при помощи самих байт-кодов. Заведем байт-коды для условной и безусловной передачи управления в произвольное место программы, а также вызовы подпрограмм, состоящих из байт-кодов, и возврата из подпрограмм. Для хранения адресов возврата заведем еще один стек, назовем его "стек возвратов". Вот теперь мы получили вполне функциональную Форт-машину. Для того, чтобы она была полной по Тьюрингу, достаточно задать всего пару десятков байт-кодов. То есть, на такой машине можно выполнить любые вычисления, хоть искусственный интеллект создать. Окончательно эта Форт-машина превратится в настоящий Форт после того, как (при помощи программ, написанных в байт-кодах) будет добавлен ввод-вывод, написан транслятор из исходного текста (или клавиатурного ввода) в байт-код, добавлены средства для организации и вызова программ в виде словарей.
|
|
|
|
|
Jan 28 2016, 22:46
|
Знающий
   
Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861

|
Цитата(=AK= @ Jan 29 2016, 02:27)  Ну да. Жаль, автор давно забросил этот проект.  Был бы он в нормальной форме, то задача создания встроенного интерпретатора решалась бы за 5 минут. А так его полдня чистить и править надо, прежде чем заработает, скажем, под CodeBlocks. Всегда есть надежда и вероятность вернуться к "допиливанию" заброшенных (или отложенных для продвижения будущих целей) авторских идей. (на том же sourceforge) В тематике Форт их достаточно много, даже при "отсутствии" Форт программистов, как одной из движущих сил IT сообщества.  P.S. На sourceforge мне был интересен из Форт с С в связке F-- проект.
Сообщение отредактировал Kopa - Jan 28 2016, 22:59
|
|
|
|
Сообщений в этой теме
Jenya7 мини PLC. Jan 27 2016, 08:11 _pv вам скорее всего сюда для начала:
http://electroni... Jan 27 2016, 08:26 Jenya7 Цитата(_pv @ Jan 27 2016, 14:26) вам скор... Jan 27 2016, 09:10  AlexandrY Цитата(Jenya7 @ Jan 27 2016, 11:10) распа... Jan 27 2016, 09:16  iosifk Цитата(Jenya7 @ Jan 27 2016, 12:10) распа... Jan 27 2016, 11:05 AlexandrY Цитата(Jenya7 @ Jan 27 2016, 10:11) вопро... Jan 27 2016, 09:06 Jenya7 я подумал сделать что то вроде этого
создал структ... Jan 27 2016, 09:33 AlexandrY Цитата(Jenya7 @ Jan 27 2016, 11:33) я под... Jan 27 2016, 09:41  Jenya7 Цитата(AlexandrY @ Jan 27 2016, 15:41) Ну... Jan 27 2016, 09:50   AlexandrY Цитата(Jenya7 @ Jan 27 2016, 11:50) а бол... Jan 27 2016, 10:04 RabidRabbit Цитата(Jenya7 @ Jan 27 2016, 12:33) но ес... Jan 27 2016, 10:02  Jenya7 Цитата(RabidRabbit @ Jan 27 2016, 16:02) ... Jan 27 2016, 10:12   RabidRabbit задействуйте фантазию
как пример: для каждой стр... Jan 27 2016, 10:17  jcxz Цитата(RabidRabbit @ Jan 27 2016, 16:02) ... Jan 28 2016, 06:06 arhiv6 ТС, думаю Вам нужно копать в сторону парсеров мате... Jan 27 2016, 10:14 Jenya7 Цитата(arhiv6 @ Jan 27 2016, 16:14) ТС, д... Jan 27 2016, 10:24  RabidRabbit Цитата(Jenya7 @ Jan 27 2016, 13:24) вопро... Jan 27 2016, 10:36 smalcom Цитатав микроконтролере!
вы шутите так?
вы пр... Jan 27 2016, 10:39 arhiv6 Цитата(Jenya7 @ Jan 27 2016, 16:24) ну ра... Jan 27 2016, 10:40      Kopa Тут уже советовали посмотреть варианты реализации ... Jan 27 2016, 15:52       Jenya7 Цитата(Kopa @ Jan 27 2016, 21:52) Тут уже... Jan 27 2016, 16:15        Kopa Цитата(Jenya7 @ Jan 27 2016, 18:57) Желез... Jan 27 2016, 16:22        adnega Цитата(Jenya7 @ Jan 28 2016, 10:54) честн... Jan 28 2016, 08:50         Jenya7 да. это интересно.
но условие (param1 && i... Jan 28 2016, 09:52          adnega Цитата(Jenya7 @ Jan 28 2016, 12:52) да. э... Jan 28 2016, 10:43           Jenya7 Цитата(adnega @ Jan 28 2016, 15:43) При и... Jan 28 2016, 11:22              Dog Pawlowa Одно не пойму - если автор не знает, чего он хочет... Jan 29 2016, 02:58               =AK= Цитата(Dog Pawlowa @ Jan 29 2016, 13:28) ... Jan 29 2016, 07:59       jcxz Цитата(adnega @ Jan 28 2016, 13:42) Компи... Jan 28 2016, 09:19        iosifk Цитата(jcxz @ Jan 28 2016, 12:19) Мой ком... Jan 28 2016, 09:23    demiurg_spb http://www.beremiz.org Jan 27 2016, 14:46 XVR ТС изобрел велосипед с квадратными колесами и на л... Jan 27 2016, 12:23 iosifk Цитата(XVR @ Jan 27 2016, 15:23) ТС изобр... Jan 27 2016, 12:38  Jenya7 Цитата(iosifk @ Jan 27 2016, 18:38) Вот т... Jan 27 2016, 12:44   iosifk Цитата(Jenya7 @ Jan 27 2016, 15:44) я пре... Jan 27 2016, 13:05    Jenya7 Цитата(iosifk @ Jan 27 2016, 19:05) Вот т... Jan 27 2016, 13:22     iosifk Цитата(Jenya7 @ Jan 27 2016, 16:22) я хоч... Jan 27 2016, 14:20     syoma Цитата(Jenya7 @ Jan 27 2016, 15:22) я хоч... Jan 27 2016, 14:41 XVR 'Сложные логические группировки' в простой... Jan 27 2016, 13:47 sigmaN Warning:
Цитатаподумали бы не иначе докторскую н... Jan 27 2016, 14:34 Jenya7 Цитата(sigmaN @ Jan 27 2016, 20:34) Warni... Jan 27 2016, 14:35 smalcom Цитатато нам осталось? - увязать логику? - И с эти... Jan 27 2016, 16:35 Jenya7 Цитата(smalcom @ Jan 27 2016, 22:35) ну д... Jan 27 2016, 16:43  Kopa Цитата(Jenya7 @ Jan 27 2016, 19:43) задач... Jan 27 2016, 16:55   Jenya7 Цитата(Kopa @ Jan 27 2016, 22:55) Выбирай... Jan 27 2016, 16:57 Огурцов если парсер у вас есть, то сядьте и напишите за ве... Jan 27 2016, 16:46 Jenya7 Цитата(Огурцов @ Jan 27 2016, 22:46) если... Jan 27 2016, 16:54  Огурцов Цитата(Jenya7 @ Jan 27 2016, 16:54) вы по... Jan 27 2016, 16:58   Jenya7 Цитата(Огурцов @ Jan 27 2016, 22:58) и чт... Jan 27 2016, 17:05    Kopa Цитата(Jenya7 @ Jan 27 2016, 20:05) с ним... Jan 27 2016, 17:20    Огурцов Цитата(Jenya7 @ Jan 27 2016, 18:05) их на... Jan 27 2016, 17:26     Jenya7 Цитата(Огурцов @ Jan 27 2016, 23:26) в см... Jan 27 2016, 19:37      Kopa Цитата(Jenya7 @ Jan 27 2016, 22:37) совет... Jan 27 2016, 19:50       syoma Цитата(Kopa @ Jan 27 2016, 22:50) P.S. До... Jan 27 2016, 20:07        Jenya7 Цитата(syoma @ Jan 28 2016, 02:07) Самое ... Jan 27 2016, 20:12         syoma Цитата(Jenya7 @ Jan 27 2016, 23:12) ну ра... Jan 28 2016, 05:26          Jenya7 Цитата(syoma @ Jan 28 2016, 10:26) Я вам ... Jan 28 2016, 06:08           jcxz Цитата(Jenya7 @ Jan 28 2016, 12:08) у мен... Jan 28 2016, 06:18            Jenya7 Цитата(jcxz @ Jan 28 2016, 11:18) Самое н... Jan 28 2016, 07:14           syoma Цитата(Jenya7 @ Jan 28 2016, 08:08) мне б... Jan 28 2016, 07:57            iosifk Цитата(syoma @ Jan 28 2016, 10:57) . По-м... Jan 28 2016, 09:02      _pv Цитата(Jenya7 @ Jan 28 2016, 02:37) в смы... Jan 27 2016, 21:56      Огурцов Цитата(Jenya7 @ Jan 27 2016, 20:37) в смы... Jan 28 2016, 01:25 smalcom Цитатазадача действительно плевая. для сильных спе... Jan 28 2016, 00:21 sigmaN И это еще Огурцов реально по-Божески заряжает. Так... Jan 28 2016, 02:07 Огурцов казалось бы причём тут зарядка, это ж чисто на пив... Jan 28 2016, 02:57 k155la3 Судя по "постановке задачи" ТС, это похо... Jan 28 2016, 07:31 syoma adnega, неужели в наше время, микропроцессорные ре... Jan 28 2016, 11:06 adnega Цитата(syoma @ Jan 28 2016, 14:06) adnega... Jan 28 2016, 12:41 syoma Цитатаоличное решение проблемы. я восхищен, не поб... Jan 28 2016, 11:31 syoma ЦитатаВот Изаграф ему бы наверное подошел, но толь... Jan 29 2016, 10:52
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|