|
мини 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 27 2016, 15:52
|
Знающий
   
Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861

|
Тут уже советовали посмотреть варианты реализации Форт VM (виртуальных машин) готовых хоть C хоть ASM хоть как то ещё  Может не стоят эти муки творчества затраченных на них усилий?  Какое железо, кстати, используется? P.S. На диалекте Форт языка есть PLC контроллеры ForthLogic Техническая информацияПрограммирование на языке ForthLogic (PDF, ~4Mb)(Правда большая часть это копипаст из книги Баранова, Ноздрунова "Форт и его реализации", но есть и оригинальные идеи в языке для данныхконтроллеров)
Сообщение отредактировал Kopa - Jan 27 2016, 16:00
|
|
|
|
|
Jan 27 2016, 16:15
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Kopa @ Jan 27 2016, 21:52)  Тут уже советовали посмотреть варианты реализации Форт VM (виртуальных машин) готовых хоть C хоть ASM хоть как то ещё  Может не стоят эти муки творчества затраченных на них усилий? Какое железо, кстати, используется? P.S. На диалекте Форт языка есть PLC контроллеры ForthLogic Инструкция по программированию на языке ForthLogic™(Правда большая часть это копипаст из книги Баранова, Ноздрунова "Форт и его реализации", но есть и оригинальные идеи в языке для данныхконтроллеров)  Железо STM32F107VC. не думаю что у меня хватит сил реализовать Форт VM. давайте разделим задачу на подзадачи пойти проверить состояние входных пинов - смешно правда? пойти по адресу проверить переменную - больше, меньше установленного лимита - просто, вы не находите? что нам осталось? - увязать логику? - И с этим ИЛИ с тем и для этого мы будем тянуть фреймворки и виртуальные машины? ребята да вы что? сравнить два факинг входных пина и два факинг параметра, и сделать И , ИЛИ между ними?
Сообщение отредактировал Jenya7 - Jan 27 2016, 16:23
|
|
|
|
Сообщений в этой теме
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 Цитата(Jenya7 @ Jan 27 2016, 18:57) Желез... Jan 27 2016, 16:22      adnega Цитата(Jenya7 @ Jan 27 2016, 18:06) о... Jan 28 2016, 07:42       Jenya7 честно говоря я мало что понял. Jan 28 2016, 07:54        adnega Цитата(Jenya7 @ Jan 28 2016, 10:54) честн... Jan 28 2016, 08:50        adnega Цитата(Jenya7 @ Jan 28 2016, 10:54) честн... Jan 28 2016, 09:34         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         =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
|
|
|