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

 
 
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
smalcom
сообщение Jan 27 2016, 10:39
Сообщение #16


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

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



Цитата
в микроконтролере!

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

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

в таком случае воспользуйтесь поиском по форуму - подобный вопрос поднимался неоднократно.
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Jan 27 2016, 10:40
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 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


--------------------
Go to the top of the page
 
+Quote Post
=AK=
сообщение Jan 27 2016, 11:04
Сообщение #18


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
iosifk
сообщение Jan 27 2016, 11:05
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



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

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

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


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 12:14
Сообщение #20


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

Группа: Участник
Сообщений: 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
XVR
сообщение Jan 27 2016, 12:23
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

Ждем, когда ТС 'изобретет' стек, а там уже и до Форта недалеко sm.gif
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jan 27 2016, 12:38
Сообщение #22


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



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

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

Вот только "изобретет" у ТС не получится. Ибо самые большие и самые дорогие ошибки делаются в начале проекта. А у него это как раз и произошло. И объяснить, что подобные задачи многими решены - для него невозможно. Я например делал такой контроллер в ПЛИС из двух микроконтроллеров в связке... Но ведь ТС и понимать ничего не хочет...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 12:44
Сообщение #23


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

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



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

я прекрасно понимаю что эта задача многими решена. поэтому и обратился на форум. только решения не вижу. одна претенциозная болтовня.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jan 27 2016, 13:05
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



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

Вот тяжело с глухим говорить...
Прежде чем спрашивать "где хранить что-то" ответьте на первый вопрос.
Что хотите сделать: компилятор или интерпретатор?


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 13:22
Сообщение #25


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

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



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

я хочу по входному условию установить выходное условие - назовем это задачей. причем задачи надо хранить в памяти. включили питание - побежали задачи. теперь представте есть таких десять задач со всякими входными и выходными условиями. и все они в цикле в рантайм проверяются. вы предлагаете хранить 10 строк и постоянно их парсить. я же один раз распарсил - положил все в структуру - и работаю с ней. структура прекрасно работает. единственно где я падаю - на сложных логических группировках. которые как я понимаю можно хранить в структуре - я просто не могу придумать конструкцию структуры.
Go to the top of the page
 
+Quote Post
XVR
сообщение Jan 27 2016, 13:47
Сообщение #26


Гуру
******

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

Альтернативной стековой машиной, уже упоминавшейся тут, будет Форт
Go to the top of the page
 
+Quote Post
Herz
сообщение Jan 27 2016, 14:11
Сообщение #27


Гуру
******

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



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

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

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

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


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



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

Ей бо глухой...
Для компилятора пишутся исходники. Он их превращает в машинные коды...И это можно сделать на внешнем компьютере. Например Java превращает в байт-код, т.е. полупереваренные коды... И для их размещения нужна область памяти.
Интерпретатор работает непосредственно с исходными кодами. Он их слово за словом и выполняет. И ему нужны только временные переменные в памяти данных.
Если входные сигналы медленные, то какая разница, сколько парсить? Да и программа выполняется "строка за строкой"... И не нужны никакие сложные структуры...
Я вот работал с самодельным логическим контроллером в ПЛИС. Там было 2 микроконтроллера. на них - 50 реле, пяток цапов и ацп... Один микроконтроллер вел "арифметику", другой - битовый вел логику. Общались они через общую память битовых данных. Я делал компилятор в машинный код.
Вы же почему-то сваливаете в одну кучу компиляцию исходников и исполняемую программу. На самом деле Вам надо сделать 2 программы. Одну - для превращения сложной командной строки исходника в более простой набор команд. Что-то вроде "RISC", когда каждая простейшая команда выполняет только одно действие. Либо устанавливает переменную или таймер, либо логически обрабатывает переменную. Ну и вторая часть - будет в контроллере, она и будет выполнять эти простейшие действия. И парсер там будет примитивный...
Вы посмотрите мои статьи о битовом контроллере...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 14:27
Сообщение #29


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

Группа: Участник
Сообщений: 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
sigmaN
сообщение Jan 27 2016, 14:34
Сообщение #30


I WANT TO BELIEVE
******

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



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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Jan 27 2016, 14:35
Сообщение #31


Знающий
****

Группа: Свой
Сообщений: 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, 14:35
Сообщение #32


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

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



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

вы не объясняйте какой я дурак - вы покажите какой вы умный.
Go to the top of the page
 
+Quote Post
syoma
сообщение Jan 27 2016, 14:41
Сообщение #33


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

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



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

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




Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 27 2016, 14:46
Сообщение #34


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



http://www.beremiz.org


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 15:06
Сообщение #35


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

Группа: Участник
Сообщений: 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
Сообщение #36


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #37


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

Группа: Участник
Сообщений: 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
Kopa
сообщение Jan 27 2016, 16:22
Сообщение #38


Знающий
****

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



Цитата(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 СОТНИ!!! и разных схем решений.
Может Вашим идеям будет созвучен такой "грандиозный" фейковый трактат КОМЛОГИЯ

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


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

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



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

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

разговор с вами - это как в анекдоте: "папа, а где море?".
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 16:43
Сообщение #40


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

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



Цитата(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 СОТНИ!!! и разных схем решений.

а можно из СОТНИ!!! хоть одну готовую? одну...из СОТНИ!!!.

Сообщение отредактировал Jenya7 - Jan 27 2016, 16:45
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Jan 27 2016, 16:46
Сообщение #41


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



если парсер у вас есть, то сядьте и напишите за вечер типа il-интерпретатор
а без парсера можно писать и в кодах
переменные в стек, указатель стека, указатель инструкции, регистр состояния

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

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

делов-то

программу можно хранить во флеше мк или заливать с пк каждый раз в озу
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 16:54
Сообщение #42


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

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



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

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

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

делов-то

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

вы понимаете...я уже тут говорил...советы такого типа они очень абстрактны - как интерфейсы в С#.
так и я умею. столько интерфейсов напишу - закачаетесь.
Go to the top of the page
 
+Quote Post
Kopa
сообщение Jan 27 2016, 16:55
Сообщение #43


Знающий
****

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



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

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

P.S. Google есть? sm.gif
Можно прочитать и это Статьи на xabraxabr по Форт тематике

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


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

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



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

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

спасибо. посмотрю.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Jan 27 2016, 16:58
Сообщение #45


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



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

и что не так с интерфейсами в шарпе ?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 17:05
Сообщение #46


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

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



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

с ними все прекрасно. но их надо реализовывать.
Go to the top of the page
 
+Quote Post
Kopa
сообщение Jan 27 2016, 17:20
Сообщение #47


Знающий
****

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



Цитата(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.
(или что то более функциональное). В контроллере может находится и дополнительный сервисый софт - типа встроенного редактора (обычно тоже на Форт добавленного к телу системы)
Программа дописыватся или удаляется в контроллере при использовании режима самопрограммирования контроллера.

Сообщение отредактировал Kopa - Jan 27 2016, 18:51
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Jan 27 2016, 17:26
Сообщение #48


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(Jenya7 @ Jan 27 2016, 18:05) *
их надо реализовывать

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

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 19:37
Сообщение #49


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

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



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

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

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

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

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


Знающий
****

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



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

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

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

Сообщение отредактировал Kopa - Jan 27 2016, 20:02
Go to the top of the page
 
+Quote Post
syoma
сообщение Jan 27 2016, 20:07
Сообщение #51


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

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Цитата(Kopa @ Jan 27 2016, 22:50) *
P.S. Должно было звучать так
"Предлагаю сделать за меня PLC, но не знаю как. Требования к PLC придумайте сами и сами себя мотивируйте для выполнения моей задачи!
Ась? Изучать слишком долго для меня, а мне это нужно? Плачу 500р за готовое устройство" sm.gif
Сколько Вам лет профессор(ша)?

Самое смешное, что задача решается в лоб по инструкции на видео за 10 минут и 50 бакинских на железо и софт. И сиди себе спокойно на IL программируй свою логику сколько хочешь.
https://m.youtube.com/watch?v=_MeQBfQObgk

Но нет, мы не ищем легких путей. Нам надо изобрести свои парсеры, фреймворки, джейсоны и форты с компиляторами разработать.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 27 2016, 20:12
Сообщение #52


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

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



Цитата(syoma @ Jan 28 2016, 02:07) *
Самое смешное, что задача решается в лоб по инструкции на видео за 10 минут и 50 бакинских на железо и софт. И сиди себе спокойно на IL программируй свою логику сколько хочешь.
https://m.youtube.com/watch?v=_MeQBfQObgk

Но нет, мы не ищем легких путей. Нам надо изобрести свои парсеры, фреймворки, джейсоны и форты с компиляторами разработать.

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

Сообщение отредактировал Jenya7 - Jan 27 2016, 20:15
Go to the top of the page
 
+Quote Post
_pv
сообщение Jan 27 2016, 21:56
Сообщение #53


Гуру
******

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



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

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

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

если непонятно что такое стэк то надо открыть какой-нибудь букварь по программированию прочитать что же это такое, а не жаловаться на четырёх уже страницах что советы "неправильные" дают.

у Страуструпа в книжке есть пример калькулятора на сотню строк, с разбором любых выражений со скобочками и переменными, добавить туда ||, &&, ~ для логической арифметики в стиле С, когда 0 = false. И если хочется именно "скомпилировать", чтобы не парсить каждый раз, надо вместо непосредственно вычисления сложить все операции и значения в стэк и потом просто пройтись по нему и выполнить.
кода для этого написать надо куда меньше чем в этой теме нафлужено.

собственно на первой же странице RabidRabbit всё уже рассказал как сделать.
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jan 28 2016, 00:21
Сообщение #54


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

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



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

о-о-о-о, всё ясно. повидал я таких:
> Сделать то-то. Задача лёгкая, но мне некогда. Потому ценник низкий.

Я понимаю, что современный мир крайне неидеален, но отсутствие логики - это проблема для инженера. Чуть-чуть разжую вам, ато мало ли.
Вы не можете категоризировать сложность задачи, которую не выполнили. Все невыполненные задачи априори сложные.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Jan 28 2016, 01:25
Сообщение #55


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(Jenya7 @ Jan 27 2016, 20:37) *
в смысле конкретный, реальный пример

да легко, давайте небольшую реальную задачу, $20 и будет вам программа и интерпретатор под неё
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 28 2016, 02:07
Сообщение #56


I WANT TO BELIEVE
******

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



И это еще Огурцов реально по-Божески заряжает. Так то я слыхал, обычно со ста тыщ рублей ценник начинается! ))))))))))))))))))
Рекомендую немедленно соглашаться!


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Jan 28 2016, 02:57
Сообщение #57


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



казалось бы причём тут зарядка, это ж чисто на пиво, дабы не скучать
а за стотыщ я вам шарп со студией 16 и фреймворком 6.0 напишу
Go to the top of the page
 
+Quote Post
syoma
сообщение Jan 28 2016, 05:26
Сообщение #58


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

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Цитата(Jenya7 @ Jan 27 2016, 23:12) *
ну расбери с линуксом это тоже не совсем тот путь который мне подходит.

Я вам показал интерпретатор, парсер и отладчик для ПЛК в одном флаконе - это то, к чему вы собираетесь идти. Распбери с линуксом там только одна из платформ. Не нравится - возьмите другую.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 28 2016, 06:06
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(RabidRabbit @ Jan 27 2016, 16:02) *
param1
input1
&&
param2
input2
input3
||
&&
||

Это называется "обратная польская нотация". Удобна для обработки стековой машиной.
Цитата(Jenya7 @ Jan 27 2016, 16:12) *
да но вопрос как это сохранить, в какой структре. чтоб потом знать - сделай AND с этой группой а потом сделай OR с той группой а потом сделай AND межу ними. как это практически связать.

Вам уже всё разжевали и даже в рот положили. И правильно указали - что у Вас проблемы уже с парсингом.
Выражения удобно парсить в формат записи обратной польской нотацией. И в ней уже обрабатывать выражения. Скобки проходятся рекурсией.
В обратной польской нотации раньше задавались выражения для программируемых калькуляторов, если кто помнит такие девайсы....
Выражение в обычной записи (a*b+c*(d-e)) в обратной польской нотации будет выглядеть: ab*cde-*+ - это уже удобно для обработки исполнительным алгоритмом и уже без скобок.

Цитата(RabidRabbit @ Jan 27 2016, 16:17) *
если это операция - снимаем со стека 2 значения, выполняем операцию, результат кладём в стек

Не обязательно 2 операнда. 2 - это для бинарных операций. Для унарных - 1 операнд.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 28 2016, 06:08
Сообщение #60


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

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



Цитата(syoma @ Jan 28 2016, 10:26) *
Я вам показал интерпретатор, парсер и отладчик для ПЛК в одном флаконе - это то, к чему вы собираетесь идти. Распбери с линуксом там только одна из платформ. Не нравится - возьмите другую.

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

Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 28 2016, 06:18
Сообщение #61


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Самое необходимое (и достаточное) условие для решение любой задачи - не мощный камень или язык, а мощная голова... laughing.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 28 2016, 07:14
Сообщение #62


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

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



Цитата(jcxz @ Jan 28 2016, 11:18) *
Самое необходимое (и достаточное) условие для решение любой задачи - не мощный камень или язык, а мощная голова... laughing.gif

это Вы свою имеете ввиду я так понимаю?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jan 28 2016, 07:31
Сообщение #63


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Судя по "постановке задачи" ТС, это похоже на интерпретатор бейсика в "онлайн" режиме,
когда каждая строка выполняется по энтеру.

В PLC системах, один из языков программирования - IL ( Instruction lang.) полностью соотв-ий ассемблеру.
Кроме ASM - есть ST - сильно похожий на C

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

или
промежуточный код (как в Java) - для последующего исполнения вирт. машиной "MyPLC"

или
текст-код, например например на ASM MSP430 для последующей компиляции "настоящим" компилятором ASM430
и заливки реального кода в процессор, где уже "живет" "Операционная система MyPLC"
(тоже круто). Так работают реальные системы разработки для промышленных контроллеров.



Go to the top of the page
 
+Quote Post
adnega
сообщение Jan 28 2016, 07:42
Сообщение #64


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



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

При разработке своего контроллера я подумал побольше и сделал так.
Любая логическая функция из N переменных описывается таблицей истинности из 2^N строк.
Если переменные пронумерованы, то и на результат можно ссылаться числом.
Например, для 5 переменных имеем 32 результата.
Зная значения всех 5 переменных, мы можем получить номер бита в 32-битном хранилище результата.

В байткодах это выгладит так:

TABLE5(result_value)
VAR0
VAR1
VAR2
VAR3
VAR4
GETRESULT

Компилятор должен преобразовать сложное логическое выражение к таблице истинности и получить правильный resul_value.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 28 2016, 07:54
Сообщение #65


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

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



честно говоря я мало что понял.

Сообщение отредактировал Herz - Jan 28 2016, 22:34
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
syoma
сообщение Jan 28 2016, 07:57
Сообщение #66


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

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



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

Я так понял, что у вас задача "програмировать задачи - состояния на выходе в зависимости от условий на входе." в первом посте, а не разработка интерпретатора для своего языка программирования. Среда разработки выше была создана именно с целью решения задачи из вашего первого сообщения. По-моему вы больно ошибетесь, если будете думать, что она "почти решена". Помимо описанного выше - что насчет типов переменных? Как вы собираетесь описывать весь этот язык в документации? Для каких пользователей?
Go to the top of the page
 
+Quote Post
adnega
сообщение Jan 28 2016, 08:50
Сообщение #67


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Jan 28 2016, 10:54) *
честно говоря я мало что понял.

Вы таблицу истинности представляете?
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jan 28 2016, 09:02
Сообщение #68


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(syoma @ Jan 28 2016, 10:57) *
. По-моему вы больно ошибетесь, если будете думать, что она "почти решена". Помимо описанного выше - что насчет типов переменных? Как вы собираетесь описывать весь этот язык в документации? Для каких пользователей?

Просто это типичный случай, который я описал в "Гайке М3". ТС кажется, что как только он "определит гайку", то все остальное получится само по себе. Причем он даже не понимает, что он хочет делать интерпретатор или компилятор... Так же как и не понимает, почему ему хочется обрабатывать сложные скрипты а не простые, обработанные компилятором. Не понимает, что в любом случае, в системе управления будет хост. И еще лучше хост удаленный. А это значит, что валить компиляцию в микроконтроллер - не имеет смысла.
А уж его высказывания все это только и подтверждают. Я читаю эту переписку не как техническую, а как пример общения с глухим и диким, не вежливым и ужасно самонадеяным....


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 28 2016, 09:19
Сообщение #69


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(adnega @ Jan 28 2016, 13:42) *
Компилятор должен преобразовать сложное логическое выражение к таблице истинности и получить правильный resul_value.

А ТС-у нужны только логические функции? Или и арифметические тоже?
Я когда-то давно, когда писал свой типа компилятор wink.gif ну и парсер выражений для него, реализовал поддержку всех операций, что есть в си (с таким-же синтаксисом).
Ничего сложного там нет. Сложно стало когда я попытался сделать ещё фазу оптимизации полученного кода после этого sm.gif
У меня в выражениях поддерживались все сишные операции, скобки, переменные (были только численно-логические (только одного типа), или строковые (с меньшим списком операций)),
константы числовые/строковые, константы литеральные.
Мой компилятор компилил текстовые выражения в байт-код, который выполнялся на этапе выполнения.
Это для я делал скриптовый компилируемый на лету после старта ПО язык в одной из своих программ. sm.gif
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jan 28 2016, 09:23
Сообщение #70


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(jcxz @ Jan 28 2016, 12:19) *
Мой компилятор компилил текстовые выражения в байт-код, который выполнялся на этапе выполнения.
Это для я делал скриптовый компилируемый на лету после старта ПО язык в одной из своих программ. sm.gif

Об этом объяснено еще пару страниц назад, да только все бесполезно...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
adnega
сообщение Jan 28 2016, 09:34
Сообщение #71


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Jan 28 2016, 10:54) *
честно говоря я мало что понял.

Утверждается, что (param1 && input1) || (param2 && (input2 || input3)) соответствует таблица истинности из вложенного файла.
Из значений переменных собираем индекс:
n = (param1 << 4) + (param2 << 3) + (input1 << 2) + (input 2 << 1) + (input3 << 0);
Затем получаем результат:
((0xFEF0EE00) >> n) & 1
Т.е. для вычисления (param1 && input1) || (param2 && (input2 || input3)) нам достаточно знать одно волшебное 32-битное число 0xFEF0EE00.
Причем, для меня важным моментом было время вычисления логической функции любой сложности из максимум 5 переменных.
При таком подходе оно фиксировано и минимально (не зависит от вида функции и от значений переменных).
А самое главное, легко описывается байт-кодом и элементарно вычисляется.

Теперь понятно?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 28 2016, 09:52
Сообщение #72


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

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



да. это интересно.
но условие (param1 && input1) || (param2 && (input2 || input3)) не статическое, оно может поменяться на скажем (param2 || input3) && (param4 || (input5 || input6))
или скажем переменных будет больше 5

ааа...понимаю.. с ростом параметров наша таблица серьезно вырастает…
да. это круто. интересный подход. а как мы заполняем результат функции в true table - 0xFEF0EE00?

Сообщение отредактировал Herz - Jan 28 2016, 22:35
Go to the top of the page
 
+Quote Post
adnega
сообщение Jan 28 2016, 10:43
Сообщение #73


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Jan 28 2016, 12:52) *
да. это интересно.
но условие (param1 && input1) || (param2 && (input2 || input3)) не статическое, оно может поменяться на скажем (param2 || input3) && (param4 || (input5 || input6))
или скажем переменных будет больше 5

ааа...понимаю.. с ростом параметров наша таблица серьезно вырастает…
да. это круто. интересный подход. а как мы заполняем результат функции в true table - 0xFEF0EE00?

При изменении условия меняется и результат.
Как вы по условию будете получать "магическое число" - это ваши проблемы. Главное, что это возможно.
В моем случае исходный текст компилятором преобразуется в байт код, и в задачи компилятора входит данное преобразование.

Насчет логических условий с бОльшим числом переменных могу сказать, что я за долгие годы с такими не встречался (максимум 4).
Но кто сказал, что таблицы нельзя каскадировать? wink.gif
Go to the top of the page
 
+Quote Post
syoma
сообщение Jan 28 2016, 11:06
Сообщение #74


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

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



adnega, неужели в наше время, микропроцессорные ресурсы такие ценные, что пришлось так извращаться?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 28 2016, 11:22
Сообщение #75


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

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



Цитата(adnega @ Jan 28 2016, 15:43) *
При изменении условия меняется и результат.
Как вы по условию будете получать "магическое число" - это ваши проблемы. Главное, что это возможно.
В моем случае исходный текст компилятором преобразуется в байт код, и в задачи компилятора входит данное преобразование.

Насчет логических условий с бОльшим числом переменных могу сказать, что я за долгие годы с такими не встречался (максимум 4).
Но кто сказал, что таблицы нельзя каскадировать? wink.gif

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

как правильно заметил товарищ jcxz - мощная голова - и можно найти элегантное решение без фортов и джэсонов.

Сообщение отредактировал Jenya7 - Jan 28 2016, 11:37
Go to the top of the page
 
+Quote Post
syoma
сообщение Jan 28 2016, 11:31
Сообщение #76


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

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Цитата
оличное решение проблемы. я восхищен, не побоюсь этого слова.

Такое решение называется Look up table, где n - адрес, а магическое число - биты по этому адресу. Используется в ПЛИСах уже не знаю сколько.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jan 28 2016, 12:41
Сообщение #77


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(syoma @ Jan 28 2016, 14:06) *
adnega, неужели в наше время, микропроцессорные ресурсы такие ценные, что пришлось так извращаться?

Конечно, нет. Просто я привык к таблицам истинности и для меня на порядок проще набросать ее, нежели городить пятиэтажные логические формулы.
Кста, иногда решаю обратную задачу - по таблице истинности написать и упростить логическое выражение.
И самая ирония в том, что затем рисую в схемном редакторе схему, соответствующую этой логической формуле на стандартных элементах,
а компилятор "упихивает" ее в LUT внутри ПЛИС ))

Вдогонку добавлю, что LUT замечен даже в gcc.
Делал машину состояний для энкодера на Си в лоб.
Переделал в LUT. Посмотрел листинги и (прошу прощения) офигел - gcc сотворил одинаковый LUT в обоих случаях.
Go to the top of the page
 
+Quote Post
=AK=
сообщение Jan 28 2016, 20:41
Сообщение #78


pontificator
******

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



Цитата(adnega @ Jan 28 2016, 20:04) *
Из значений переменных собираем индекс:
n = (param1 << 4) + (param2 << 3) + (input1 << 2) + (input 2 << 1) + (input3 << 0);
Затем получаем результат:
((0xFEF0EE00) >> n) & 1
Т.е. для вычисления (param1 && input1) || (param2 && (input2 || input3)) нам достаточно знать одно волшебное 32-битное число 0xFEF0EE00.

А теперь немножко расширим подход. Запланируем "таблицу" в 256 значений, соответственно, "волшебное число" будет состоять не из 4-битных полей, а из 8-битных, т.е из байт. "Bолшебное число" не будем ограничивать размерами, а запишем в байтовый массив произвольной длины. А в самой таблице будем держать адреса функций, которые будут выполняться, когда в массиве встретится соответствующий байт. В результате мы получим заготовку для простейшей Форт-машины, а байтовый массив будет содержать то, что называется "программой из байт-кодов".

Для того, чтобы окончательно оформить Форт-машину, сначала зададимся вопросом; а как функции, вызываемые по своим байт-кодам, будут обмениваться информацией друг с другом? И придем к выводу, что проще всего использовать стек, откуда функции будут брать исходные данные для вычислений, и куда они будут класть результаты. Затем задумаемся, а хорошо ли, что наши программы выполняются линейно, в порядке расположения байт-кодов в массиве? Нехорошо, надо бы предусмотреть возможность изменения порядка выполнения байт-кодов при помощи самих байт-кодов. Заведем байт-коды для условной и безусловной передачи управления в произвольное место программы, а также вызовы подпрограмм, состоящих из байт-кодов, и возврата из подпрограмм. Для хранения адресов возврата заведем еще один стек, назовем его "стек возвратов".

Вот теперь мы получили вполне функциональную Форт-машину. Для того, чтобы она была полной по Тьюрингу, достаточно задать всего пару десятков байт-кодов. То есть, на такой машине можно выполнить любые вычисления, хоть искусственный интеллект создать.

Окончательно эта Форт-машина превратится в настоящий Форт после того, как (при помощи программ, написанных в байт-кодах) будет добавлен ввод-вывод, написан транслятор из исходного текста (или клавиатурного ввода) в байт-код, добавлены средства для организации и вызова программ в виде словарей.
Go to the top of the page
 
+Quote Post
Kopa
сообщение Jan 28 2016, 21:36
Сообщение #79


Знающий
****

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



Цитата(=AK= @ Jan 29 2016, 00:41) *
Окончательно эта Форт-машина превратится в настоящий Форт после того, как (при помощи программ, написанных в байт-кодах) будет добавлен ввод-вывод, написан транслятор из исходного текста (или клавиатурного ввода) в байт-код, добавлены средства для организации и вызова программ в виде словарей.

"Скелет" этого варианта? sm.gif
Кросс Форт на C: FVM factory

Сообщение отредактировал Kopa - Jan 28 2016, 21:36
Go to the top of the page
 
+Quote Post
=AK=
сообщение Jan 28 2016, 22:27
Сообщение #80


pontificator
******

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



Цитата(Kopa @ Jan 29 2016, 08:06) *
Кросс Форт на C: FVM factory


Ну да. Жаль, автор давно забросил этот проект. rolleyes.gif Был бы он в нормальной форме, то задача создания встроенного интерпретатора решалась бы за 5 минут. А так его полдня чистить и править надо, прежде чем заработает, скажем, под CodeBlocks.
Go to the top of the page
 
+Quote Post
Kopa
сообщение Jan 28 2016, 22:46
Сообщение #81


Знающий
****

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



Цитата(=AK= @ Jan 29 2016, 02:27) *
Ну да. Жаль, автор давно забросил этот проект. rolleyes.gif Был бы он в нормальной форме, то задача создания встроенного интерпретатора решалась бы за 5 минут. А так его полдня чистить и править надо, прежде чем заработает, скажем, под CodeBlocks.

Всегда есть надежда и вероятность вернуться к "допиливанию" заброшенных (или отложенных для продвижения будущих целей) авторских идей. (на том же sourceforge)
В тематике Форт их достаточно много, даже при "отсутствии" Форт программистов, как одной из движущих сил IT сообщества. sm.gif

P.S. На sourceforge мне был интересен из Форт с С в связке F-- проект.

Сообщение отредактировал Kopa - Jan 28 2016, 22:59
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Jan 29 2016, 02:44
Сообщение #82


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



был бы весьма интересен проект под шарп
и причем, если это будет таки интерпретатор, то с выполнением бинарника от i86, чтобы не замарачиваться с кросс-компиляцией
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 29 2016, 02:58
Сообщение #83


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Одно не пойму - если автор не знает, чего он хочет, чем не устраивает интерпретатор бэйсика?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
=AK=
сообщение Jan 29 2016, 07:59
Сообщение #84


pontificator
******

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



Цитата(Dog Pawlowa @ Jan 29 2016, 13:28) *
Одно не пойму - если автор не знает, чего он хочет, чем не устраивает интерпретатор бэйсика?

А что такое Бэйсик или Форт против языков PLC или даже просто голой LUT? "Это как плотник супротив столяра" (с). Не надо его ни в чем убеждать, он и сам "таких советов может каждый день выдавать пачками". laughing.gif Вот Изаграф ему бы наверное подошел, но только бесплатный.
Go to the top of the page
 
+Quote Post
syoma
сообщение Jan 29 2016, 10:52
Сообщение #85


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

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Цитата
Вот Изаграф ему бы наверное подошел, но только бесплатный.

Изаграф = Codesys = TwinCAT = Beremiz = среда разработки/интерпретатор/парсер/отладчик/исполнитель языков МЭК 61131-3 на различных платформах.
Go to the top of the page
 
+Quote Post

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

 


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


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