roboforum.ru

Технический форум по робототехнике.

Граф состояний, последовательность на Си

Граф состояний, последовательность на Си

executer » 24 мар 2009, 02:52

Вот, в связи с кризисом, писал код для охранной сигнализации, кусок привожу тут, как заготовку.
Работа МК по графу состояний (текстовое описания графа состояний на Си с условиями перехода и задержками):
Код: Выделить всёРазвернуть
int             Step=0;                         // Current step of sequence
int             Next=0;                         // Next step of sequence
long            Delay=0;                        // Delay before next sequence step 
long            DelayPrev=0;                    // Previous delay
long            Time_s;                         // Счетчик равных промежутков времени (на таймере)
unsigned char   Temp;                           // Temporary variable


...
...
        switch(Step)    // переход и обработка только текущего состояния графа
        {

// ******* Step 0 ******* Restart delay
        case 0:
            Next = 1;   // узел с безусловным переходом в узел №1 с задержкой 10 ед.
            Delay = 10;
        break;

// ******* Step 1 ******* Sensor sygnal wait
        case 1:
            ......      ; // действия пока находимся в этом узле

            if(Condition) // условие перехода в узел 2 с задержкой 2 ед.
            {
                Next = 2;
                Delay = 2;       
                ...       // действия будут выполнятся во время задержки перехода
            }
            if(Condition2) // условие перехода в узел N с задержкой T ед.
            {
                Next = N;
                Delay = T;       
                ...       // действия будут выполнятся во время задержки перехода
            }
        break;

// ******* Step X *******    // для каждого узла(состояния) ставим в соответствие уникальный номер, и расписываем
                             // условия выхода из этого узла
        case X:
            {
                Next = Y;
                Delay = Delay; 
            }
        break;             
        };                             
     
// ******* Sequence processing *******     
        if(DelayPrev != Delay)
        {
            DelayPrev=Delay;
            OffDelay(Delay, &DelaySeq, 1);
        }
        Temp = OffDelay(Delay, &DelaySeq, 0);
        Temp = FN(&FrontStore, Temp);
        if(Temp)
        {
            DelayPrev=0;
            Delay=0;
            Step=Next;

            printf("Step number = %u ; Time = %u;\n\r",Step,Time_s); // ну это для отладки
        }

// Вспомогательные функции
unsigned char OffDelay(long Delay, long *Storage, unsigned char Go)  // OffDelay таймер.
{
    if(Go) *Storage = Time_s;
    return ( (Delay + *Storage) >= Time_s );
}

unsigned char FN(unsigned char *Store, unsigned char Value) // определение заднего фронта (спада) аргумента Value
{
    bit tmp;
       
    tmp = *Store && !Value;
    *Store = Value;
    return (unsigned char)tmp;
}

Re: Граф состояний, последовательность на Си

=DeaD= » 24 мар 2009, 09:36

- На что жалуетесь?
- Я не жалуюсь, я хвастаюсь!
(с) известный анекдот

:D

(Это в смысле как пример приведено или какой-то вопрос есть? :))

Re: Граф состояний, последовательность на Си

executer » 24 мар 2009, 09:51

нет, все работает :good: . Поэтому и выложил в роботехнике для начинающих, как пример. Не думал что для всех этот код очевиден :pardon:

Re: Граф состояний, последовательность на Си

=DeaD= » 24 мар 2009, 10:09

Ну граф состояний если понять, что такое, то вроде код самоочевиден, а вот для новичков ли это и какое отношение имеет к основам роботостроения? :) но разово думаю лишним не будет, хотя массово так лучше не делать :).

Re: Граф состояний, последовательность на Си

Myp » 24 мар 2009, 10:39

эммм
а зачем он нужен?

Re: Граф состояний, последовательность на Си

executer » 24 мар 2009, 12:03

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

Re: Граф состояний, последовательность на Си

=DeaD= » 24 мар 2009, 12:37

Граф состояний это зашибительская штука :)

С её помощью можно регулярные выражения отрабатывать!

А еще она очень глюкоустойчивая, в том смысле что наглядная, в ней особо много глюков не сделаешь.

Re: Граф состояний, последовательность на Си

Vooon » 24 мар 2009, 20:31

Dead это не глюкоустойчивая, а дуракоустойчивая штука.
Myp я тебе писал разбор команд как раз таким образом. :)

Re: Граф состояний, последовательность на Си

Виталий » 25 мар 2009, 00:33

И глюкоустойчивая в том числе.


Rambler\'s Top100 Mail.ru counter