271
Данная диаграмма состояний описывает алгоритм управления некоторым
устройством.
Как преобразовать ее в привычный исходный текст на языке Си?
Достаточно просто. Для начала, заведем переменную, в
которой мы будем
держать состояние нашего конечного автомата. Сразу замечу: переменная
должна быть статической, т.е. она ни в коем случае не должна находиться в
регистре процессора или в стеке.
unsigned char State=0; // Состояние автомата.
Далее, описываем сам автомат. Переменные Ki – это дискретные выходы.
Pi – дискретные входы. Символом Ti мы
обозначим значение, снятое с
термодатчика, ti – время.
Для реализации автомата на языке Си проще и нагляднее воспользоваться
оператором SWITCH. Каждый CASE является одним из состояний автомата.
Переход из состояния в состояние осуществляется путем записи номера нового
состояния в переменную State.
switch(State)
{
case 0: // INIT
U2=0;
K11=0; K10=0; K4_2=0; K4=0;
if(START) State=1;
// Переход в состояние 1
break;
case 1: // START
// Читаем температуры T5 и T2
// :
if(STOP) State=5;
if(T2 > (T5+2*dT) )
{
State=2;
K11=1;
// Установить задержку для таймера t1
}
break;
case 2: // ON
// Индицируем текущее состояние системы
// :
if(STOP) State=5;
if(t>=300)
{
K4_1=1, K4_2=1, K10=1;
State=3;
}
break;
case 3: //CONTROL
// Выполняем алгоритм управления нашим устройством
// :
if(STOP) State=5;
if(T2 < (T5+dT) )
{
K11=0;
272
State=4;
}
break;
case 4: //OFF
// Индицируем текущее состояние системы
// :
if(STOP) State=5;
if(t >=t2)
{
K4_1=0, K4-2=0,K10=0;
State=1;
}
break;
case 5: // STOP
// Останов системы
// :
// Выполнить проверку P3
if(P3==0)
{
K4-1=0, K4-2=0, K10=0, U2=0;
State=0;
}
break;
}
Как видно из рисунка и исходного текста на языке C, автомат
может
находиться в шести состояниях. Переход от состояния к состоянию
осуществляется после анализа условий. Условия (показаны в квадратных
скобках на дугах) реализованы оператором IF. Если на дугах указано действие
(отмечается символом '/') то оно исполняется внутри IF, в процессе перехода.
Действия, указанные внутри прямоугольников
выполняются каждый раз, при
попадание в данное состояние.
Как видно из исходного текста, оператор SWITCH , запущенный один раз
выполняет только один шаг конечного автомата. Для того, чтобы выполнить
всю программу необходимо каким-то образом повторять вызов описанной
выше конструкции. Это может быть выполнено в
виде банального оператора
цикла WHILE или более сложным способом. В частности автоматы удобно
использовать внутри обработчиков прерывания от таймера, т.к. время
выполнения программы в таком случае достаточно
просто проанализировать
[52].
В чем удобство использования конечных автоматов? Во-первых, –
простота реализации. Во-вторых, детерминированность и,
как следствие
детерминированности – тестопригодность. В каждый момент времени
выполняется конкретный шаг алгоритма. Состояние такого автомата
описывается всего одной переменной, если известно состояние переменной –
однозначно известен текущий шаг.
К
сожалению, автоматные модели далеко не идеальны. Самым крупным
недостатком автоматной модели является трудность описания сложных систем
с большим числом состояний.