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

 
 
6 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> мини 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
_pv
сообщение Jan 27 2016, 08:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



вам скорее всего сюда для начала:
http://electronix.ru/forum/index.php?showtopic=132940
если ничего из предложенного не подойдёт тогда можно и свой велосипед поизобретать.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 27 2016, 09:06
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Jenya7 @ Jan 27 2016, 10:11) *
вопрос есть ли какие то готовые библиотеки а-ля-PLC?


Первая и главная задача в PLC это в чем и как вы будете создавать пользовательские программы.
Как проверять и отлавливать ошибки синтаксиса программ.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 09:10
Сообщение #4


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

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



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

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

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

товарищи давайте отделим зерна от плевел. парсинг, проверка синтаксиса и прочее - это отдельная задача. вопрос как организовать хранение и сравнение логики входных условий.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 27 2016, 09:16
Сообщение #5


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



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


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


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

Так в чем вопрос, если с парсингом нет проблем?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 09:33
Сообщение #6


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

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



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

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

Сообщение отредактировал Herz - Jan 27 2016, 14:02
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 27 2016, 09:41
Сообщение #7


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



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


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

Возьмите например парсер JSON, сейчас это очень модно и актуально, и посмотрите как делается парсинг.
В JSON кстати можете закодировать всю вашу пользовательскую программу.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 09:50
Сообщение #8


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

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



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

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

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

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

Сообщение отредактировал Jenya7 - Jan 27 2016, 09:51
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jan 27 2016, 10:02
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



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

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

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

Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 27 2016, 10:04
Сообщение #10


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



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

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


Я вам что-то должен? biggrin.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 10:12
Сообщение #11


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

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



Цитата(RabidRabbit @ Jan 27 2016, 16:02) *
если проблем с парсингом нет, то, например, так:

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

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


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

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

Сообщение отредактировал Jenya7 - Jan 27 2016, 10:10
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Jan 27 2016, 10:14
Сообщение #12


Знающий
****

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



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


--------------------
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jan 27 2016, 10:17
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



задействуйте фантазию 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 межу ними. как это практически связать.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 10:24
Сообщение #14


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

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



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

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

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

вопрос где тут групировка логических гейтов.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jan 27 2016, 10:36
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



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

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

максимально качествоенно разжевал, по-моему sm.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 4th July 2025 - 20:26
Рейтинг@Mail.ru


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