реклама на сайте
подробности

 
 
> мини PLC.
Jenya7
сообщение Jan 27 2016, 08:11
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
=AK=
сообщение Jan 27 2016, 11:04
Сообщение #2


pontificator
******

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



Цитата(Jenya7 @ Jan 27 2016, 18:41) *
я хочу програмировать задачи - состояния на выходе в зависимости от условий на входе. этакий мини Programmable Logic Controller.
...
и я это сохраняю и потом проверяю и если условие выполняется - включаю\выключаю нужные выходы. вопрос есть ли какие то готовые библиотеки а-ля-PLC?


Ваша задача не имеет никакого отношения к PLC, это полная чушь.

То, что вы тут накалякали, в принципе может быть реализовано путем создания некого скриптового языка. Тем не менее для грамотного решения , вам придется озаботиться и БНФ, и парсингом, и интерпретатором. Однако поскольку вы демонстрируете чрезвычайно низкий уровень знаний и очень много гонора, то шансы на то, что вы сподобитесь решить эту задачу "в общем виде", исчезающе малы.

Один из грамотных вариантов решения, который вам может оказаться посильным, таков: освойте язык Форт, поставьте Форт-систему на вашу целевую платформу и задайте для пользователя словарь только с определенными вами Форт словами, а все остальные Форт слова сделайте недоступными для пользователя. При этом парсингом займется Форт система, правда, синтаксис псевдо-языка будет с обратной польской записью. При желании и это можно изменить, да только вряд ли нужно.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 12:14
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 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. "Логические строки" в которых обрабатываются "битовые переменные"

Ну и Форт-система это тоже вариант....

извините но - тоже пачками.
Go to the top of the page
 
+Quote Post
Herz
сообщение Jan 27 2016, 14:11
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(Jenya7 @ Jan 27 2016, 14:14) *
от вашей демонстрации грандиозных знаний с тоже нех..илым апломбом толку мало.
таких советов я могу каждый день выдавать пачками.

это очень смелое заявление. таких заявлений я могу каждый день выдавать пачками.

извините но - тоже пачками.

Автор! Попробуйте прислушаться к советам и не хамить. Я совершенно не понимаю, откуда возьмётся желание искать приемлемое для Вас решение, разжёвывать и класть в рот при такой "благодарности".
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 14:27
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Jan 27 2016, 14:35
Сообщение #6


Знающий
****

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



Цитата(Jenya7 @ Jan 27 2016, 20:27) *
а почему так нельзя?

Можно, но такой вариант сложно масштабируем. Если делать в таком виде, то как Вы представляете себе решение для вашего же примера: (param1 && input1) || (param2 && (input2 || input3)) ?



--------------------
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 15:06
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Kopa
сообщение Jan 27 2016, 15:52
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861



Тут уже советовали посмотреть варианты реализации Форт VM (виртуальных машин) готовых хоть C хоть ASM хоть как то ещё sm.gif
Может не стоят эти муки творчества затраченных на них усилий? smile3046.gif
Какое железо, кстати, используется?

P.S. На диалекте Форт языка есть PLC контроллеры ForthLogic Техническая информация
Программирование на языке ForthLogic (PDF, ~4Mb)
(Правда большая часть это копипаст из книги Баранова, Ноздрунова "Форт и его реализации", но есть и оригинальные идеи в языке для данныхконтроллеров)

Сообщение отредактировал Kopa - Jan 27 2016, 16:00
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 16:15
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Kopa @ Jan 27 2016, 21:52) *
Тут уже советовали посмотреть варианты реализации Форт VM (виртуальных машин) готовых хоть C хоть ASM хоть как то ещё sm.gif
Может не стоят эти муки творчества затраченных на них усилий?
Какое железо, кстати, используется?

P.S. На диалекте Форт языка есть PLC контроллеры ForthLogic Инструкция по программированию на языке ForthLogic™
(Правда большая часть это копипаст из книги Баранова, Ноздрунова "Форт и его реализации", но есть и оригинальные идеи в языке для данныхконтроллеров) smile3046.gif

Железо STM32F107VC. не думаю что у меня хватит сил реализовать Форт VM.

давайте разделим задачу на подзадачи
пойти проверить состояние входных пинов - смешно правда?
пойти по адресу проверить переменную - больше, меньше установленного лимита - просто, вы не находите?
что нам осталось? - увязать логику? - И с этим ИЛИ с тем и для этого мы будем тянуть фреймворки и виртуальные машины? ребята да вы что?
сравнить два факинг входных пина и два факинг параметра, и сделать И , ИЛИ между ними?

Сообщение отредактировал Jenya7 - Jan 27 2016, 16:23
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01608 секунд с 7
ELECTRONIX ©2004-2016