|
мини 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, 10:43
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Jan 28 2016, 12:52)  да. это интересно. но условие (param1 && input1) || (param2 && (input2 || input3)) не статическое, оно может поменяться на скажем (param2 || input3) && (param4 || (input5 || input6)) или скажем переменных будет больше 5
ааа...понимаю.. с ростом параметров наша таблица серьезно вырастает… да. это круто. интересный подход. а как мы заполняем результат функции в true table - 0xFEF0EE00? При изменении условия меняется и результат. Как вы по условию будете получать "магическое число" - это ваши проблемы. Главное, что это возможно. В моем случае исходный текст компилятором преобразуется в байт код, и в задачи компилятора входит данное преобразование. Насчет логических условий с бОльшим числом переменных могу сказать, что я за долгие годы с такими не встречался (максимум 4). Но кто сказал, что таблицы нельзя каскадировать?
|
|
|
|
Сообщений в этой теме
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 Цитата(adnega @ Jan 28 2016, 15:43) При и... Jan 28 2016, 11:22         =AK= Цитата(adnega @ Jan 28 2016, 20:04) Из зн... Jan 28 2016, 20:41          Kopa Цитата(=AK= @ Jan 29 2016, 00:41) Окончат... Jan 28 2016, 21:36           =AK= Цитата(Kopa @ Jan 29 2016, 08:06) Кросс Ф... Jan 28 2016, 22:27            Kopa Цитата(=AK= @ Jan 29 2016, 02:27) Ну да. ... Jan 28 2016, 22:46             Огурцов был бы весьма интересен проект под шарп
и причем, ... Jan 29 2016, 02:44              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
|
|
|