|
|
  |
мини PLC. |
|
|
|
Jan 27 2016, 10:39
|

Профессионал
    
Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718

|
Цитата в микроконтролере! вы шутите так? вы просите научить вас пунктуации, хотя коверкаете слова. вам естественно предлагают сначала освоить орфографию. вы сопротивляетесь. судя по темам вам в впринципе не интересно учиться, вы просто идёте на результат. в таком случае воспользуйтесь поиском по форуму - подобный вопрос поднимался неоднократно.
|
|
|
|
|
Jan 27 2016, 10:40
|

Знающий
   
Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423

|
Цитата(Jenya7 @ Jan 27 2016, 16:24)  ну распарсили мы строку! все прекрасно! куда сохранять результаты парсинга? конкретно в железе! в микроконтролере! Так не надо выделять место в памяти для хранения всех лексем поотдельности - они уже есть в исходной строке, парсер динамически её обрабатывает. Грубо говоря, нужно выделить место для хранения одной лексемы: Код char *expr; //Указатель на обрабатываемую строку char token[80]; //Лексема Там в статье всё расписано + приведён полностью рабочий код. Вам достаточно в нем заменить пару функций на свои. Кстати, там же указана ссылка на пероисточник - Герберт Шилдт, Полный справочник по C (Глава 24. Синтаксичекий разбор и вычисление выражений).
Сообщение отредактировал arhiv6 - Jan 27 2016, 10:49
--------------------
|
|
|
|
|
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, 11:05
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Jenya7 @ Jan 27 2016, 12:10)  распарсить команды у меня нет проблем. вопрос где хранить входные условия и как их сравнивать. вопрос как организовать хранение и сравнение логики входных условий. Можно сделать не компилятор, и интерпретатор. Тогда ничего "хранить" не надо выполнение делается при обработке строк... Правда это "медленнее", чем если сначала откомпилировать, а потом исполнять "переваренный" код... Но зато проще сделать программу обработки. Вообще если сделать два вида исходных строк, то дело будет значительно проще реализовать. 1. "Арифметические строки" - введите "внутренние переменные", где "входы" или "внутренние переменные" проверяются на "больше-меньше" или "+/-" и результат этих действий превращается в битовые переменные 2. "Логические строки" в которых обрабатываются "битовые переменные" Ну и Форт-система это тоже вариант....
--------------------
www.iosifk.narod.ru
|
|
|
|
|
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, 13:05
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Jenya7 @ Jan 27 2016, 15:44)  я прекрасно понимаю что эта задача многими решена. поэтому и обратился на форум. только решения не вижу. одна претенциозная болтовня. Вот тяжело с глухим говорить... Прежде чем спрашивать "где хранить что-то" ответьте на первый вопрос. Что хотите сделать: компилятор или интерпретатор?
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Jan 27 2016, 13:47
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
'Сложные логические группировки' в простой структуре сохранить невозможно. Можете дальше ничего не придумывать. Вам уже говорили, как такие задачи решаются, но видимо для вас это 'одна претенциозная болтовня'. Попробую еще раз - вам нужна стековая виртуальная машина, которая будет исполнять байт код (который в свою очередь получен из исходных скриптов). Например, ваш исходный скрипт - Код If (temp > 30 && hum > 80 || input1 ==1) { // условие на выходе output2 = 1; } будет в байт коде выглядеть как то так: Код @temp // Read Temp var 30 // Push constant 30 > // Compare operation cjmpf L1 // Conditional jump if false @hum 80 > cjmpt L2 L1: @input1 1 == cjumpt L2 return L2: 1 set output2 // Write value from stack to 'output2' variable return Каждая строка здась закодированна каким то числом (опкод) + дополнительная информация (имя или адрес переменной, адрес для перехода и пр.) Альтернативной стековой машиной, уже упоминавшейся тут, будет Форт
|
|
|
|
|
Jan 27 2016, 14:20
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Jenya7 @ Jan 27 2016, 16:22)  я хочу по входному условию установить выходное условие - назовем это задачей. причем задачи надо хранить в памяти. включили питание - побежали задачи. теперь представте есть таких десять задач со всякими входными и выходными условиями. и все они в цикле в рантайм проверяются. вы предлагаете хранить 10 строк и постоянно их парсить. я же один раз распарсил - положил все в структуру - и работаю с ней. структура прекрасно работает. единственно где я падаю - на сложных логических группировках. которые как я понимаю можно хранить в структуре - я просто не могу придумать конструкцию структуры. Ей бо глухой... Для компилятора пишутся исходники. Он их превращает в машинные коды...И это можно сделать на внешнем компьютере. Например Java превращает в байт-код, т.е. полупереваренные коды... И для их размещения нужна область памяти. Интерпретатор работает непосредственно с исходными кодами. Он их слово за словом и выполняет. И ему нужны только временные переменные в памяти данных. Если входные сигналы медленные, то какая разница, сколько парсить? Да и программа выполняется "строка за строкой"... И не нужны никакие сложные структуры... Я вот работал с самодельным логическим контроллером в ПЛИС. Там было 2 микроконтроллера. на них - 50 реле, пяток цапов и ацп... Один микроконтроллер вел "арифметику", другой - битовый вел логику. Общались они через общую память битовых данных. Я делал компилятор в машинный код. Вы же почему-то сваливаете в одну кучу компиляцию исходников и исполняемую программу. На самом деле Вам надо сделать 2 программы. Одну - для превращения сложной командной строки исходника в более простой набор команд. Что-то вроде "RISC", когда каждая простейшая команда выполняет только одно действие. Либо устанавливает переменную или таймер, либо логически обрабатывает переменную. Ну и вторая часть - будет в контроллере, она и будет выполнять эти простейшие действия. И парсер там будет примитивный... Вы посмотрите мои статьи о битовом контроллере...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
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, 14:34
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Warning: Цитата подумали бы не иначе докторскую недавно защитил. мы слышим какие вопросы вы задаете и как реагируете на предложенные решения тут. Так что про докторскую(или хотя-бы про минимально научный склад ума) мысль даже не закрадывается(по крайней мере у меня)... Видео с курилки в студию, разберем, оценим на досуге )))))))))
--------------------
The truth is out there...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|