Перейти к содержанию
    

я хочу програмировать задачи - состояния на выходе в зависимости от условий на входе. этакий мини 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вам скорее всего сюда для начала:

http://electronix.ru/forum/index.php?showtopic=132940

если ничего из предложенного не подойдёт тогда можно и свой велосипед поизобретать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вопрос есть ли какие то готовые библиотеки а-ля-PLC?

 

Первая и главная задача в PLC это в чем и как вы будете создавать пользовательские программы.

Как проверять и отлавливать ошибки синтаксиса программ.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вам скорее всего сюда для начала:

http://electronix.ru/forum/index.php?showtopic=132940

если ничего из предложенного не подойдёт тогда можно и свой велосипед поизобретать.

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

 

Первая и главная задача в PLC это в чем и как вы будете создавать пользовательские программы.

Как проверять и отлавливать ошибки синтаксиса программ.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

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

 

Здрасте.

Если вы распарсили, то значит уже храните результат в памяти. Иначе это был не парсинг.

В памяти же хранятся и указатели на действия. Функции действий вы же уже создали?

 

Так в чем вопрос, если с парсингом нет проблем?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я подумал сделать что то вроде этого

создал структуру для параметров, входов и выходов.

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))

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

Изменено пользователем Herz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я подумал сделать что то вроде этого

 

Ну ясно.

Нет у вас никакого парсинга.

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

 

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

В JSON кстати можете закодировать всю вашу пользовательскую программу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну ясно.

Нет у вас никакого парсинга.

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

 

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

В JSON кстати можете закодировать всю вашу пользовательскую программу.

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

 

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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

но если условие более заковыристое

(param1 && input1) || (param2 && (input2 || input3))

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

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

 

param1

input1

&&

param2

input2

input3

||

&&

||

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Я вам что-то должен? :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

param1

input1

&&

param2

input2

input3

||

&&

||

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

 

 

Я вам что-то должен? :biggrin:

нет. у меня претензий нет. очень класный совет.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

задействуйте фантазию :)

 

как пример: для каждой строки (из результата разбора) - uint16_t

старшие 2 бита: тип

0 - параметр: 14 битов - знаковое целое (константа)

1 - значение входа: 14 битов -беззнаковое целое (номер входа)

2 - операция: 14 битов - индекс операции (0 - меньше, 1 - больше, 2 - равно, ....)

3 - маркер завершения

 

обработка:

читаем uint16_t

если это параметр - помещаем int16_t значение в стек

если это значение входа - читаем значение соответствующего входа и помещаем int16_t значение в стек

если это операция - снимаем со стека 2 значения, выполняем операцию, результат кладём в стек

если это маркер завершения, снимаем со стека результат.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

задействуйте фантазию :)

вопрос где тут групировка логических гейтов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вопрос где тут групировка логических гейтов.

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

 

максимально качествоенно разжевал, по-моему :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...