Как уже упоминалось и было продемонстрировано на нескольких примерах, одним из главных достоинств автоматного программирования является представление
логики поведения системы в наиболее понятном и наглядном виде – с использованием графической нотации графов (или диаграмм) переходов. Однако не только логика поведения требует наглядного преставления. Спецификация структуры системы является, наряду со спецификацией поведения, одним из двух основных результатов процесса проектирования и также требует подходящей нотации.
В примерах, приводимых до сих пор, структура системы (объекты управления, автоматы и связи между ними) описывалась словесно. Как могли убедиться читатели, такое описание громоздко и не обладает свойством наглядности. В программировании с явным выделением состояний для описания структуры системы используется графическая нотация схем связей автоматов.
Схема связей строится отдельно для каждого автомата системы. На ней в виде прямоугольника изображается сам автомат (рис. 2.20). Слева от него изображаются источники информации (в событийных системах их также называют поставщиками событий) – сущности из системы или внешней среды, которые формируют входные воздействия автомата. Для каждого события, входной переменной или предиката с номером состояния между автоматом и источником информации проводится линия, помеченная идентификатором и словесным описанием этого события (переменной, предиката). Таким образом, схема связей служит, в частности, для расшифровки сокращенных идентификаторов событий и переменных, используемых на диаграмме переходов.
|
|
Справа от автомата изображаются его объекты управления и подчиненные (вложенные или вызываемые) автоматы. Для каждой выходной переменной между автоматом и соответствующим объектом управления проводится линия, помеченная идентификатором и описанием переменной. Если вызываемому автомату передается одно или несколько событий, то для каждого из этих событий также проводится линия с пометками. Если объекты управления являются также и источниками информации – формируют часть входных переменных автомата – то они изображаются справа, а линии, соответствующие входным переменным изображаются в виде обратных связей.
Программная реализация часов с будильником на языке С
const int h = 1;
const int m = 2;
const int a = 3;
int e; // Текущее событие
int y; // Текущее управляющее состояние
// Реализация объекта управления
int hrs;
int mins;
int alarmHrs;
int alarmMins;
void z1() {
hrs = (hrs + 1) % 24;
}
void z2() {
mins = (mins + 1) % 60;
}
void z3() {
alarmHrs = (alarmHrs + 1) % 24;
}
void z4() {
alarmMins = (alarmMins + 1) % 60;
}
// Реализация управляющего автомата
void A1 () {
switch (y) {
case 1: // Будильник выключен
if (e == h) { z1(); }
else if (e == m) { z2(); }
else if (e == a) { y = 2; }
break;
case 2: // Установка времени будильника
if (e == h) { z3(); }
else if (e == m) { z4(); }
else if (e == a) { y = 3; }
break;
case 3: // Будильник включен
if (e == h) { z1(); }
else if (e == m) { z2(); }
else if (e == a) { y = 1; }
break;
}
}