Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: мини PLC.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
Jenya7
я хочу програмировать задачи - состояния на выходе в зависимости от условий на входе. этакий мини 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?
_pv
вам скорее всего сюда для начала:
http://electronix.ru/forum/index.php?showtopic=132940
если ничего из предложенного не подойдёт тогда можно и свой велосипед поизобретать.
AlexandrY
Цитата(Jenya7 @ Jan 27 2016, 10:11) *
вопрос есть ли какие то готовые библиотеки а-ля-PLC?


Первая и главная задача в PLC это в чем и как вы будете создавать пользовательские программы.
Как проверять и отлавливать ошибки синтаксиса программ.
Jenya7
Цитата(_pv @ Jan 27 2016, 14:26) *
вам скорее всего сюда для начала:
http://electronix.ru/forum/index.php?showtopic=132940
если ничего из предложенного не подойдёт тогда можно и свой велосипед поизобретать.

распарсить команды у меня нет проблем. вопрос где хранить входные условия и как их сравнивать.

Цитата(AlexandrY @ Jan 27 2016, 15:06) *
Первая и главная задача в PLC это в чем и как вы будете создавать пользовательские программы.
Как проверять и отлавливать ошибки синтаксиса программ.

товарищи давайте отделим зерна от плевел. парсинг, проверка синтаксиса и прочее - это отдельная задача. вопрос как организовать хранение и сравнение логики входных условий.
AlexandrY
Цитата(Jenya7 @ Jan 27 2016, 11:10) *
распарсить команды у меня нет проблем. вопрос где хранить входные условия и как их сравнивать.


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


Здрасте.
Если вы распарсили, то значит уже храните результат в памяти. Иначе это был не парсинг.
В памяти же хранятся и указатели на действия. Функции действий вы же уже создали?

Так в чем вопрос, если с парсингом нет проблем?
Jenya7
я подумал сделать что то вроде этого
создал структуру для параметров, входов и выходов.
CODE
struct sTaskParams
{
float *var; //var compare limit
float limit;
uint8_t compare; //0 = '==', 1 = '>', 2 = '<', 3 = '>=', 4 = '<=', 5 = '!='
uint8_t logicGate; //0=and, 1=or
uint8_t enable;
};

struct sTaskDigInput
{
uint8_t enable;
uint8_t inNum;
uint8_t inState;
uint8_t logicGate;
};

struct sTaskOutput
{
uint8_t enable;
uint8_t outNum;
uint8_t outState;
};

struct sTaskCondition
{
uint8_t result;
uint8_t logic;
};

потом создал задачу в которой жестко задал 10 параметров 8 входов и 8 выходов.
Код
struct sDailyTask
{
    uint8_t enable;      //ON/OFF
    uint8_t state;      
    uint32_t condIdx;
    struct sTaskParam taskParams[MAX_PARAMS];
    struct sTaskDigInput taskDigInputs[MAX_DIG_INPUTS];
    struct sTaskOutput taskOutputs[MAX_OUTPUTS];
    struct sTaskCondition taskCondition[MAX_CONDITIONS];
};

ну и массив из 10 задач.
Код
struct sDailyTask dailyTask[MAX_TASKS];

в принципе если логика идет подряд
Код
param1 && param2 || input1

то так я понимаю как обработать условие
проверяю параметры
Код
uint32_t TASKER_ChekParameters(uint32_t task_num)
{
    uint32_t glob_cond=0;
    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(dailyTasktask_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_CheckInputs(uint32_t task_num)
{
    int size = sizeof(dailyTask[task_num].taskDigInputs);
    for (int i = 0; i < size; i++)
    {
        if (dailyTask[task_num].taskDigInputs[i].enable)
        {
            dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].result = TASKER_EvaluateInputCondition(dailyTask[task_num].taskDigInputs[i].inNum,
                                                                                                                dailyTask[task_num].taskDigInputs[i].inState);
            dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].logic = dailyTask[task_num].taskDigInputs[i].logicGate;

                        dailyTask[task_num].condIdx++;
        }
    }
return 0;
}

потом смотрю общий результат всех входных условий
Код
uint32_t TASKER_EvaluateTaskCondition(uint32_t task_num)
{
    uint32_t result=0;
    TASKER_ChekParameters(task_num);
    TASK_CheckInputs(task_num);

    for (int i = 0; i < dailyTask[task_num].condIdx; i++)
    {
        if (dailyTask[task_num].taskCondition[i].logic == OR)
            result |= dailyTask[task_num].taskCondition[i].result;
        else if (dailyTask[task_num].taskCondition[i].logic == AND)
            result &= dailyTask[task_num].taskCondition[i].result;
    }

    return result;
}

но если условие более заковыристое
Код
(param1 && input1) || (param2 && (input2 || input3))

вот тут я не могу додуматься как создать структуру которая будет хранить логические связи.
AlexandrY
Цитата(Jenya7 @ Jan 27 2016, 11:33) *
я подумал сделать что то вроде этого


Ну ясно.
Нет у вас никакого парсинга.
Парсинг это не структуры, а динамичекеские деревья и списки.

Возьмите например парсер JSON, сейчас это очень модно и актуально, и посмотрите как делается парсинг.
В JSON кстати можете закодировать всю вашу пользовательскую программу.
Jenya7
Цитата(AlexandrY @ Jan 27 2016, 15:41) *
Ну ясно.
Нет у вас никакого парсинга.
Парсинг это не структуры, а динамичекеские деревья и списки.

Возьмите например парсер JSON, сейчас это очень модно и актуально, и посмотрите как делается парсинг.
В JSON кстати можете закодировать всю вашу пользовательскую программу.

а более бесполезный совет не в тему Вы бы могли мне дать? мне их так не хватает.

или давайте пообсуждаем о том как произноситься char на шести страницах.
RabidRabbit
Цитата(Jenya7 @ Jan 27 2016, 12:33) *
но если условие более заковыристое
(param1 && input1) || (param2 && (input2 || input3))
вот тут я не могу додуматься как создать структуру которая будет хранить логические связи.

если проблем с парсингом нет, то, например, так:

param1
input1
&&
param2
input2
input3
||
&&
||

AlexandrY
Цитата(Jenya7 @ Jan 27 2016, 11:50) *
а более бесполезный совет не в тему Вы бы могли мне дать? мне их так не хватает.

или давайте пообсуждаем о том как произноситься char на шести страницах.


Я вам что-то должен? biggrin.gif
Jenya7
Цитата(RabidRabbit @ Jan 27 2016, 16:02) *
если проблем с парсингом нет, то, например, так:

param1
input1
&&
param2
input2
input3
||
&&
||

да но вопрос как это сохранить, в какой структре. чтоб потом знать - сделай AND с этой группой а потом сделай OR с той группой а потом сделай AND межу ними. как это практически связать.


Цитата(AlexandrY @ Jan 27 2016, 16:04) *
Я вам что-то должен? biggrin.gif

нет. у меня претензий нет. очень класный совет.
arhiv6
ТС, думаю Вам нужно копать в сторону парсеров математических выражений. Там делается анализ строки, затем разделение на лексемы, и вычисление с учётом приоритетов и скобок. Посмотрите, например ТУТ - для хранения там используется строка с входным выражением и массив для лексем. Можете прямо в том примере заменить функции, обрабатывающие умножение,деление и т.п на свои - сравнения и логики.
RabidRabbit
задействуйте фантазию sm.gif

как пример: для каждой строки (из результата разбора) - uint16_t
старшие 2 бита: тип
0 - параметр: 14 битов - знаковое целое (константа)
1 - значение входа: 14 битов -беззнаковое целое (номер входа)
2 - операция: 14 битов - индекс операции (0 - меньше, 1 - больше, 2 - равно, ....)
3 - маркер завершения

обработка:
читаем uint16_t
если это параметр - помещаем int16_t значение в стек
если это значение входа - читаем значение соответствующего входа и помещаем int16_t значение в стек
если это операция - снимаем со стека 2 значения, выполняем операцию, результат кладём в стек
если это маркер завершения, снимаем со стека результат.
Цитата(Jenya7 @ Jan 27 2016, 13:08) *
да но вопрос как это сохранить, в какой структре. чтоб потом знать - сделай AND с этой группой а потом сделай OR с той группой а потом сделай AND межу ними. как это практически связать.
Jenya7
Цитата(arhiv6 @ Jan 27 2016, 16:14) *
ТС, думаю Вам нужно копать в сторону парсеров математических выражений. Там делается анализ строки, затем разделение на лексемы, и вычисление с учётом приоритетов и скобок. Посмотрите, например ТУТ - для хранения там используется строка с входным выражением и массив для лексем. Можете прямо в том примере заменить функции, обрабатывающие умножение,деление и т.п на свои - сравнения и логики.

родные мои! ну распарсили мы строку! все прекрасно! куда сохранять результаты парсинга? конкретно в железе! в микроконтролере!

Цитата(RabidRabbit @ Jan 27 2016, 16:17) *
задействуйте фантазию sm.gif

вопрос где тут групировка логических гейтов.
RabidRabbit
Цитата(Jenya7 @ Jan 27 2016, 13:24) *
вопрос где тут групировка логических гейтов.

(0 - меньше, 1 - больше, 2 - равно, 3 - логическое И, 4 - логическое ИЛИ, ....)

максимально качествоенно разжевал, по-моему sm.gif
smalcom
Цитата
в микроконтролере!

вы шутите так?

вы просите научить вас пунктуации, хотя коверкаете слова. вам естественно предлагают сначала освоить орфографию. вы сопротивляетесь.
судя по темам вам в впринципе не интересно учиться, вы просто идёте на результат.

в таком случае воспользуйтесь поиском по форуму - подобный вопрос поднимался неоднократно.
arhiv6
Цитата(Jenya7 @ Jan 27 2016, 16:24) *
ну распарсили мы строку! все прекрасно! куда сохранять результаты парсинга? конкретно в железе! в микроконтролере!

Так не надо выделять место в памяти для хранения всех лексем поотдельности - они уже есть в исходной строке, парсер динамически её обрабатывает. Грубо говоря, нужно выделить место для хранения одной лексемы:
Код
char *expr; //Указатель на обрабатываемую строку
char token[80]; //Лексема

Там в статье всё расписано + приведён полностью рабочий код. Вам достаточно в нем заменить пару функций на свои.

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


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

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

Один из грамотных вариантов решения, который вам может оказаться посильным, таков: освойте язык Форт, поставьте Форт-систему на вашу целевую платформу и задайте для пользователя словарь только с определенными вами Форт словами, а все остальные Форт слова сделайте недоступными для пользователя. При этом парсингом займется Форт система, правда, синтаксис псевдо-языка будет с обратной польской записью. При желании и это можно изменить, да только вряд ли нужно.
iosifk
Цитата(Jenya7 @ Jan 27 2016, 12:10) *
распарсить команды у меня нет проблем. вопрос где хранить входные условия и как их сравнивать.
вопрос как организовать хранение и сравнение логики входных условий.

Можно сделать не компилятор, и интерпретатор. Тогда ничего "хранить" не надо выполнение делается при обработке строк... Правда это "медленнее", чем если сначала откомпилировать, а потом исполнять "переваренный" код... Но зато проще сделать программу обработки.
Вообще если сделать два вида исходных строк, то дело будет значительно проще реализовать.
1. "Арифметические строки" - введите "внутренние переменные", где "входы" или "внутренние переменные" проверяются на "больше-меньше" или "+/-" и результат этих действий превращается в битовые переменные
2. "Логические строки" в которых обрабатываются "битовые переменные"

Ну и Форт-система это тоже вариант....
Jenya7
Цитата(=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. "Логические строки" в которых обрабатываются "битовые переменные"

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

извините но - тоже пачками.
XVR
ТС изобрел велосипед с квадратными колесами и на любые попытки форумчан посоветовать более адекватное средство передвижения посылает всех в лес, со словами - 'мне ехать надо, а не ваши глупые советы слушать'.

Ждем, когда ТС 'изобретет' стек, а там уже и до Форта недалеко sm.gif
iosifk
Цитата(XVR @ Jan 27 2016, 15:23) *
ТС изобрел велосипед с квадратными колесами и на любые попытки форумчан посоветовать более адекватное средство передвижения посылает всех в лес, со словами - 'мне ехать надо, а не ваши глупые советы слушать'.

Ждем, когда ТС 'изобретет' стек, а там уже и до Форта недалеко sm.gif

Вот только "изобретет" у ТС не получится. Ибо самые большие и самые дорогие ошибки делаются в начале проекта. А у него это как раз и произошло. И объяснить, что подобные задачи многими решены - для него невозможно. Я например делал такой контроллер в ПЛИС из двух микроконтроллеров в связке... Но ведь ТС и понимать ничего не хочет...
Jenya7
Цитата(iosifk @ Jan 27 2016, 18:38) *
Вот только "изобретет" у ТС не получится. Ибо самые большие и самые дорогие ошибки делаются в начале проекта. А у него это как раз и произошло. И объяснить, что подобные задачи многими решены - для него невозможно. Я например делал такой контроллер в ПЛИС из двух микроконтроллеров в связке... Но ведь ТС и понимать ничего не хочет...

я прекрасно понимаю что эта задача многими решена. поэтому и обратился на форум. только решения не вижу. одна претенциозная болтовня.
iosifk
Цитата(Jenya7 @ Jan 27 2016, 15:44) *
я прекрасно понимаю что эта задача многими решена. поэтому и обратился на форум. только решения не вижу. одна претенциозная болтовня.

Вот тяжело с глухим говорить...
Прежде чем спрашивать "где хранить что-то" ответьте на первый вопрос.
Что хотите сделать: компилятор или интерпретатор?
Jenya7
Цитата(iosifk @ Jan 27 2016, 19:05) *
Вот тяжело с глухим говорить...
Прежде чем спрашивать "где хранить что-то" ответьте на первый вопрос.
Что хотите сделать: компилятор или интерпретатор?

я хочу по входному условию установить выходное условие - назовем это задачей. причем задачи надо хранить в памяти. включили питание - побежали задачи. теперь представте есть таких десять задач со всякими входными и выходными условиями. и все они в цикле в рантайм проверяются. вы предлагаете хранить 10 строк и постоянно их парсить. я же один раз распарсил - положил все в структуру - и работаю с ней. структура прекрасно работает. единственно где я падаю - на сложных логических группировках. которые как я понимаю можно хранить в структуре - я просто не могу придумать конструкцию структуры.
XVR
'Сложные логические группировки' в простой структуре сохранить невозможно. Можете дальше ничего не придумывать.

Вам уже говорили, как такие задачи решаются, но видимо для вас это 'одна претенциозная болтовня'.

Попробую еще раз - вам нужна стековая виртуальная машина, которая будет исполнять байт код (который в свою очередь получен из исходных скриптов).

Например, ваш исходный скрипт -
Код
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
Каждая строка здась закодированна каким то числом (опкод) + дополнительная информация (имя или адрес переменной, адрес для перехода и пр.)

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

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

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

Автор! Попробуйте прислушаться к советам и не хамить. Я совершенно не понимаю, откуда возьмётся желание искать приемлемое для Вас решение, разжёвывать и класть в рот при такой "благодарности".
iosifk
Цитата(Jenya7 @ Jan 27 2016, 16:22) *
я хочу по входному условию установить выходное условие - назовем это задачей. причем задачи надо хранить в памяти. включили питание - побежали задачи. теперь представте есть таких десять задач со всякими входными и выходными условиями. и все они в цикле в рантайм проверяются. вы предлагаете хранить 10 строк и постоянно их парсить. я же один раз распарсил - положил все в структуру - и работаю с ней. структура прекрасно работает. единственно где я падаю - на сложных логических группировках. которые как я понимаю можно хранить в структуре - я просто не могу придумать конструкцию структуры.

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

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

Jenya7
Цитата(sigmaN @ Jan 27 2016, 20:34) *
Warning: bb-offtopic.gif
мы слышим какие вопросы вы задаете и как реагируете на предложенные решения тут. Так что про докторскую(или хотя-бы про минимально научный склад ума) мысль даже не закрадывается(по крайней мере у меня)...
Видео с курилки в студию, разберем, оценим на досуге )))))))))

вы не объясняйте какой я дурак - вы покажите какой вы умный.
syoma
Цитата(Jenya7 @ Jan 27 2016, 15:22) *
я хочу по входному условию установить выходное условие - назовем это задачей. причем задачи надо хранить в памяти. включили питание - побежали задачи. теперь представте есть таких десять задач со всякими входными и выходными условиями. и все они в цикле в рантайм проверяются.

Странно. Задача подпадает под описание PLC, так и используйте PLC. Зачем изобретать еще что-то? Среды разработки для PLC разрабатывали и отлаживали десятилетиями, чтобы вот так, легко и непринужденно загружать и выполнять по 10 задач в реалтайме. Причем под это еще придумали и стандартизировали 5 языков программирования, чтобы каждый программист и непрограммист мог писать проги так, как ему нравится. Ваш синтаксис это нечто среднее между синтаксисом IL и ST.




demiurg_spb
http://www.beremiz.org
Jenya7
Цитата(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
Kopa
Тут уже советовали посмотреть варианты реализации Форт VM (виртуальных машин) готовых хоть C хоть ASM хоть как то ещё sm.gif
Может не стоят эти муки творчества затраченных на них усилий? smile3046.gif
Какое железо, кстати, используется?

P.S. На диалекте Форт языка есть PLC контроллеры ForthLogic Техническая информация
Программирование на языке ForthLogic (PDF, ~4Mb)
(Правда большая часть это копипаст из книги Баранова, Ноздрунова "Форт и его реализации", но есть и оригинальные идеи в языке для данныхконтроллеров)
Jenya7
Цитата(Kopa @ Jan 27 2016, 21:52) *
Тут уже советовали посмотреть варианты реализации Форт VM (виртуальных машин) готовых хоть C хоть ASM хоть как то ещё sm.gif
Может не стоят эти муки творчества затраченных на них усилий?
Какое железо, кстати, используется?

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

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

давайте разделим задачу на подзадачи
пойти проверить состояние входных пинов - смешно правда?
пойти по адресу проверить переменную - больше, меньше установленного лимита - просто, вы не находите?
что нам осталось? - увязать логику? - И с этим ИЛИ с тем и для этого мы будем тянуть фреймворки и виртуальные машины? ребята да вы что?
сравнить два факинг входных пина и два факинг параметра, и сделать И , ИЛИ между ними?
Kopa
Цитата(Jenya7 @ Jan 27 2016, 18:57) *
Железо STM32F107VC. не думаю что у меня хватит сил реализовать Форт VM.

Допиливайте на своё усмотрение любые готовые для STM32 (mecrisp и др.) или есть уже коммерческие самособирающиеся из исходников для STM32 (VFX от MPE c кодовым ограничением на 64Kб что по меркам Форт систем достаточно много даже если полвину займёт полная Форт система)
VFX от МPE по их исходникам запустил на STM32L100 Discovery самостоятельно.
Или такой ресурс SwiftX Embedded Systems Development Tools
Был бы Ваш камень, то это тоже меня не остановило бы от "заливки" в него Форт системы. sm.gif


P.S. Полезный действующий форумный ресурс Рускоязычных Форт пользователей
Матчасть у Форт систем не сложная. Форт почти всегда без фреймворков (т.к. сам самодостаточен при его использовании)
Всяких реализаций FVM СОТНИ!!! и разных схем решений.
Может Вашим идеям будет созвучен такой "грандиозный" фейковый трактат КОМЛОГИЯ
smalcom
Цитата
то нам осталось? - увязать логику? - И с этим ИЛИ с тем и для этого мы будем тянуть фреймворки и виртуальные машины?

ну дык вперёд. задача-то плёвая.

разговор с вами - это как в анекдоте: "папа, а где море?".
Jenya7
Цитата(smalcom @ Jan 27 2016, 22:35) *
ну дык вперёд. задача-то плёвая.

разговор с вами - это как в анекдоте: "папа, а где море?".

задача действительно плевая. для сильных спецов.

Цитата(Kopa @ Jan 27 2016, 22:22) *
Допиливайте на своё усмотрение любые готовые для STM32 (mecrisp и др.) или есть уже коммерческие самособирающиеся из исходников для STM32 (VFX от MPE c кодовым ограничением на 64Kб что по меркам Форт систем достаточно много даже если полвину займёт полная Форт система)
VFX от МPE по их исходникам запустил на STM32L100 Discovery самостоятельно.
Или такой ресурс SwiftX Embedded Systems Development Tools
Был бы Ваш камень, то это тоже меня не остановило бы от "заливки" в него Форт системы. sm.gif


P.S. Полезный действующий форумный ресурсРускоязычных Форт пользователей
Матчасть у Форт систем не сложная. Форт почти всегда без фреймворков (т.к. сам самодостаточен при его использовании)
Всяких реализаций FVM СОТНИ!!! и разных схем решений.

а можно из СОТНИ!!! хоть одну готовую? одну...из СОТНИ!!!.
Огурцов
если парсер у вас есть, то сядьте и напишите за вечер типа il-интерпретатор
а без парсера можно писать и в кодах
переменные в стек, указатель стека, указатель инструкции, регистр состояния

программа получится, например, такая:

положить в стек номер порта
читать порт
положить в стек константу
сравнить
положить в стек адрес перехода
если больше переход
положить в стек номер порта
положить в стек константу
записать в порт
положить в стек адрес перехода
безусловный переход

делов-то

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

программа получится, например, такая:

положить в стек номер порта
читать порт
положить в стек константу
сравнить
положить в стек адрес перехода
если больше переход
положить в стек номер порта
положить в стек константу
записать в порт
положить в стек адрес перехода
безусловный переход

делов-то

программу можно хранить во флеше мк или заливать с пк каждый раз в озу

вы понимаете...я уже тут говорил...советы такого типа они очень абстрактны - как интерфейсы в С#.
так и я умею. столько интерфейсов напишу - закачаетесь.
Kopa
Цитата(Jenya7 @ Jan 27 2016, 19:43) *
задача действительно плевая. для сильных спецов.
а можно из СОТНИ!!! хоть одну готовую? одну...из СОТНИ!!!.

Выбирайте на своё усмотрение что больше будет понятно или достаточно по уровню Ваших технических "претензий"
Применение Форта для ARM, AVR, MSP430, PIC ...
и просмотрите форум, обсуждения, статьи и ссылки на нём по диагонали.
Там же можете доставать непонятными вопросами местных форумчан sm.gif
Книги по Форт на форуме тоже представлены. Начните с 2-ух книг автора Броуди.

P.S. Google есть? sm.gif
Можно прочитать и это Статьи на xabraxabr по Форт тематике
Jenya7
Цитата(Kopa @ Jan 27 2016, 22:55) *
Выбирайте на своё усмотрение что больше будет понятно или достаточно по уровню Ваших технических "претензий"
Применение Форта для ARM, AVR, MSP430, PIC ...
и просмотрите форум, обсуждения и ссылки на нём по диагонали.
Там же можете доставать непонятными вопросами местных форумчан sm.gif

P.S. Google есть? sm.gif

спасибо. посмотрю.
Огурцов
Цитата(Jenya7 @ Jan 27 2016, 16:54) *
вы понимаете...я уже тут говорил...советы такого типа они очень абстрактны - как интерфейсы в С#.

и что не так с интерфейсами в шарпе ?
Jenya7
Цитата(Огурцов @ Jan 27 2016, 22:58) *
и что не так с интерфейсами в шарпе ?

с ними все прекрасно. но их надо реализовывать.
Kopa
Цитата(Jenya7 @ Jan 27 2016, 20:05) *
с ними все прекрасно. но их надо реализовывать.

Lost at C? Forth May Be the Answer

Классический цикл работы FVM
Слова разделены пробелами или переводом строки.

Взяли слово из входного потока.
Ищем слово в словарике.
Нашли слово? то проверяем его признаки: immediate (всегда исполняем) иначе компилируем вызов слова (система в состоянии компиляции) или исполняем.
Если не нашли слово то может это число?
Да число то проверяем состояние системы: компиляция (компилируем литерал) иначе ложим его на стек
Нет - выдаём ошибку


P.S. Immediate слово - слово немедленного исполнения ( : ; IF ELSE THEN. и другие необходимые во время трансляции кода для его добавления к основному "телу" системы
при построении новых слов)
Если для пользователя понадобится Бейсик или какие то другие фишки
то небольшим расширением Форт системы его несложно получить sm.gif
На местном форуме тоже есть несколько тем интересного обсуждения Forth (Форт). Ищется через поле поиска.
Для Форт систем записанных в контроллер, часто в качестве потока ввода/вывода используется UART и терминальная программа общения с контроллером по UART.
(или что то более функциональное). В контроллере может находится и дополнительный сервисый софт - типа встроенного редактора (обычно тоже на Форт добавленного к телу системы)
Программа дописыватся или удаляется в контроллере при использовании режима самопрограммирования контроллера.
Огурцов
Цитата(Jenya7 @ Jan 27 2016, 18:05) *
их надо реализовывать

в смысле, для вас надо написать программу ?

Jenya7
Цитата(Огурцов @ Jan 27 2016, 23:26) *
в смысле, для вас надо написать программу ?

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

не знаю как принято у вас но если бы я дал такой совет
Код
положить в стек номер порта
читать порт
положить в стек константу
сравнить

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

Как в известном анекдоте: @"Ну тады Ой!"
Блок-схема тоже не интересна?
Вы похоже разделом ошиблись.

P.S. Должно было звучать так
"Предлагаю сделать за меня PLC, но не знаю как. Требования к PLC придумайте сами и сами себя мотивируйте для выполнения моей задачи!
Ась? Изучать слишком долго для меня, а мне это нужно? Плачу 500р за готовое устройство" sm.gif
Сколько Вам лет профессор(ша)?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.