12.07.2015 Views

Отсюда можно скачать отчет в формате PDF (670 Kb) - Кафедра ...

Отсюда можно скачать отчет в формате PDF (670 Kb) - Кафедра ...

Отсюда можно скачать отчет в формате PDF (670 Kb) - Кафедра ...

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИСАНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТТОЧНОЙ МЕХАНИКИ И ОПТИКИ (ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)УДК 681.3.06: 62—507ВГК ОКП№ регистрационный 01.20.00 13546Ин<strong>в</strong>. №"УТВЕРЖДАЮ"Ректор СПбГИТМО (ТУ)докт. техн. наук, профессорВасилье<strong>в</strong> В.Н.ОТЧЕТпо научно-исследо<strong>в</strong>ательской работе № 10038"Разработка технологии создания программного обеспечениясистем упра<strong>в</strong>ления на осно<strong>в</strong>е а<strong>в</strong>томатного подхода"Этап 2"Разработка осно<strong>в</strong>ных положений созданияпрограммного обеспечения "реакти<strong>в</strong>ных" систем"Руко<strong>в</strong>одитель НИРдокт. техн. наук,профессор,за<strong>в</strong>едующий кафедры"Информационные системы"Шалыто А.А.Санкт-Петербург2001


Список осно<strong>в</strong>ных исполнителей2Руко<strong>в</strong>одитель НИРДоктор технических наук,профессор,за<strong>в</strong>едующий кафедры"Информационные системы"Шалыто А.А.ИсполнителиИнженер-программистАспирантАспирантАспирантАспирантСтудент группы 639Студент группы 538Студент группы 439Студент группы 438Студент группы 338Студент группы 338Туккель Н.И.Зинчик А.А.Штеннико<strong>в</strong> Д.Г.Тибет Э.М.Шамгуно<strong>в</strong> Н.Н.Казако<strong>в</strong> М.А.Макаро<strong>в</strong> Н.В.Корнее<strong>в</strong> Г.А.Станке<strong>в</strong>ич А.С.Наумо<strong>в</strong> Л.А.Прокушкин И.А.


3РефератОтчет содержит 144 страниц, 50 рисунко<strong>в</strong>, 20источнико<strong>в</strong> литературы.Система упра<strong>в</strong>ления, "реакти<strong>в</strong>ная" система, событийнаясистема, состояние, событие, а<strong>в</strong>томат, граф переходо<strong>в</strong>,протокол, алгоритмизация, а<strong>в</strong>томатное программиро<strong>в</strong>ание,проектиро<strong>в</strong>ание программЦелью настоящей работы я<strong>в</strong>ляется разработка осно<strong>в</strong>ныхположений технологии создания программного обеспечения"реакти<strong>в</strong>ных" (событийных) систем. Эта технологияподдержи<strong>в</strong>ает для рассматри<strong>в</strong>аемого класса систем <strong>в</strong>се этапысоздания программного обеспечения, к которым относятся:изучение предметной области, анализ, проектиро<strong>в</strong>ание,реализация, отладка, сертификация и документиро<strong>в</strong>ание.Расширено по отношению к системам логическогоупра<strong>в</strong>ления понятие "<strong>в</strong>ходное <strong>в</strong>оздейст<strong>в</strong>ие" за счетиспользо<strong>в</strong>ания "событий", которые <strong>в</strong> отличие от "<strong>в</strong>ходныхпеременных", не опраши<strong>в</strong>аются программой, а <strong>в</strong>ызы<strong>в</strong>аютсоот<strong>в</strong>етст<strong>в</strong>ующие им обработчики. Расширено также понятие"<strong>в</strong>ыходное <strong>в</strong>оздейст<strong>в</strong>ие" за счет перехода от д<strong>в</strong>оичныхпеременных к произ<strong>в</strong>ольным подпрограммам (функциям).Дополнена нотация, применяемая при построении графо<strong>в</strong>переходо<strong>в</strong>, например, за счет перечисления <strong>в</strong>ложенныха<strong>в</strong>томато<strong>в</strong>.При использо<strong>в</strong>ании предлагаемой технологии <strong>в</strong> отличиеот объектно-ориентиро<strong>в</strong>анного проектиро<strong>в</strong>ания программпостроение <strong>в</strong>сех осно<strong>в</strong>ных моделей осно<strong>в</strong>ано на применениитолько а<strong>в</strong>томатной терминологии, а для описания динамикииспользуется модель только одного типа — система<strong>в</strong>заимос<strong>в</strong>язанных графо<strong>в</strong> переходо<strong>в</strong>. Использо<strong>в</strong>ание графо<strong>в</strong>переходо<strong>в</strong> <strong>в</strong> качест<strong>в</strong>е языка спецификации делает обозримым


Содержание5В<strong>в</strong>едение .........................................................71. Классификация задач, решаемых с использо<strong>в</strong>анием а<strong>в</strong>томатногоподхода .........................................................141.1. Системы логического упра<strong>в</strong>ления.............................161.1.1. Реализация на программируемых логических контроллерах ...161.1.2. Моделиро<strong>в</strong>ание контроллера <strong>в</strong> однозадачных операционныхсистемах ........................................................181.1.3. Моделиро<strong>в</strong>ание контроллера <strong>в</strong> многозадачных операционныхсистемах ........................................................191.2. "Реакти<strong>в</strong>ные" (событийные) системы..........................222. А<strong>в</strong>томаты .....................................................262.1. Нотация схемы с<strong>в</strong>язей.......................................272.2. Нотация графо<strong>в</strong> переходо<strong>в</strong>...................................302.3. Нотация схемы <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>.....................362.4. Модель а<strong>в</strong>томата............................................382.4.1. Запуск а<strong>в</strong>томата .........................................382.4.2. Входные <strong>в</strong>оздейст<strong>в</strong>ия и переходы ..........................392.4.3. Выходные <strong>в</strong>оздейст<strong>в</strong>ия ....................................402.4.4. Вложенные а<strong>в</strong>томаты ......................................403. Создание программного обеспечения событийных систем ..........433.1. Предлагаемая технология....................................433.1.1. Изучение предметной области .............................443.1.2. Проектиро<strong>в</strong>ание ..........................................443.1.3. Реализация ..............................................453.1.4. Отладка и сертификация ..................................503.1.5. Документиро<strong>в</strong>ание ........................................524. Практическое применение предлагаемой технологии ..............534.1. Сра<strong>в</strong>нение традиционного подхода с предлагаемым.............534.2. Подсистема упра<strong>в</strong>ления печатью..............................644.2.1. А<strong>в</strong>томат контроля режима печати ..........................664.2.2. А<strong>в</strong>томат буферизации пред<strong>в</strong>арительного просмотра ..........694.2.3. А<strong>в</strong>томат <strong>в</strong>ы<strong>в</strong>ода на печать ................................734.2.4. Системоза<strong>в</strong>исимая часть модуля печати ....................764.2.5. Системоза<strong>в</strong>исимая часть менеджера печати .................814.2.6. Протоколы функциониро<strong>в</strong>ания модуля печати ................854.3. Система упра<strong>в</strong>ления судо<strong>в</strong>ым дизель-генератором..............87


4.3.1. Документиро<strong>в</strong>ание процесса проектиро<strong>в</strong>ания системыупра<strong>в</strong>ления ......................................................884.3.2. А<strong>в</strong>томат <strong>в</strong>ключения-отключения системы упра<strong>в</strong>ления .........904.3.3. А<strong>в</strong>томат переключения режимо<strong>в</strong> работы системы упра<strong>в</strong>ления ..934.3.4. А<strong>в</strong>томат предпуско<strong>в</strong>ых операций ...........................984.3.5. А<strong>в</strong>томат контроля про<strong>в</strong>орота .............................1044.3.6. А<strong>в</strong>томат остано<strong>в</strong>а .......................................1064.3.7. А<strong>в</strong>томат ожидания разрешения <strong>в</strong>ыполнения предпуско<strong>в</strong>ыхопераций .......................................................1104.3.8. А<strong>в</strong>томат а<strong>в</strong>арийной и предупредительной сигнализации .....1124.3.9. А<strong>в</strong>томат контроля температуры масла .....................1154.3.10. А<strong>в</strong>томат контроля да<strong>в</strong>ления масла .......................1184.3.11. Протоколы функциониро<strong>в</strong>ания системы упра<strong>в</strong>ления .........1204.4. Программный имитатор дизель-генератора....................1254.4.1. А<strong>в</strong>томат имитации исполнительного устройст<strong>в</strong>а ............1264.4.2. А<strong>в</strong>томат имитации регулятора частоты <strong>в</strong>ращения ...........1284.4.3. А<strong>в</strong>томат имитации дизель-генератора .....................1294.4.4. А<strong>в</strong>томат имитации изменения частоты <strong>в</strong>ращения ............1325. Заключение ..................................................1346. Публикации по результатам этапа .............................139Список литературы ..............................................142Глоссарий ......................................................1436


7В<strong>в</strong>едениеВ <strong>отчет</strong>е излагаются осно<strong>в</strong>ные положения технологиисоздания программного обеспечения "реакти<strong>в</strong>ных"("reactive") систем, реагирующих на события. Системыэтого класса могут быть также наз<strong>в</strong>аны событийными. Этатехнология базируется на осно<strong>в</strong>е теории а<strong>в</strong>томато<strong>в</strong>.Отчет создан <strong>в</strong> ходе <strong>в</strong>ыполнения работ по теме"Разработка технологии создания программного обеспечениясистем упра<strong>в</strong>ления на осно<strong>в</strong>е а<strong>в</strong>томатного подхода"(регистрационный номер темы <strong>в</strong>о Всероссийском научнотехническомцентре (ВНТИЦ) - 01.20.00 13546), <strong>в</strong>торой этапкоторой, <strong>в</strong>ыполненный <strong>в</strong> 2001 г., имеет наимено<strong>в</strong>ание"Разработка осно<strong>в</strong>ных положений технологии созданияпрограммного обеспечения реакти<strong>в</strong>ных систем".Выполненная работа я<strong>в</strong>ляется продолжениемисследо<strong>в</strong>аний, про<strong>в</strong>еденных <strong>в</strong> 2000 г. по пер<strong>в</strong>ому этапутемы: "Разработка осно<strong>в</strong>ных положений технологии созданияпрограммного обеспечения систем логического упра<strong>в</strong>ления"(ин<strong>в</strong>ентарный номер <strong>отчет</strong>а <strong>в</strong>о ВНТИЦ - 02.2.00 102948), <strong>в</strong>рамках которого была разработана SWITCH-технология,предназначенная для алгоритмизации и программиро<strong>в</strong>аниязадач логического упра<strong>в</strong>ления.Перечислим осно<strong>в</strong>ные особенности этой технологии:− четко <strong>в</strong>ыделен этап проектиро<strong>в</strong>ания, предшест<strong>в</strong>ующийэтапу реализации. При этом строятся схемы и диаграммы,которые <strong>в</strong> дальнейшем формально и изоморфно преобразуются<strong>в</strong> текст программы. Такая организация процесса разработкианалогична принятой при создании аппаратуры, изгото<strong>в</strong>лениекоторой <strong>в</strong>ыполняется только по проектной документации;− опыт использо<strong>в</strong>ания предлагаемой технологиипоказы<strong>в</strong>ает, что при тщательном проектиро<strong>в</strong>ании построеннаяна этапе реализации программа либо сразу работает


8пра<strong>в</strong>ильно, либо требует сущест<strong>в</strong>енно меньшего <strong>в</strong>ремени наотладку, чем при традиционном подходе;− использо<strong>в</strong>ание понятия "<strong>в</strong>нутреннее состояние" (<strong>в</strong>дальнейшем "состояние") <strong>в</strong> качест<strong>в</strong>е центрального;− состояния рассматри<strong>в</strong>аются <strong>в</strong> качест<strong>в</strong>е абстракций,которые применяются при алгоритмизации <strong>в</strong> я<strong>в</strong>ном <strong>в</strong>иде, чтопоз<strong>в</strong>оляет дать следующее наз<strong>в</strong>ание предлагаемому подходу:"программиро<strong>в</strong>ание с я<strong>в</strong>ным <strong>в</strong>ыделением состояний";− понятие "состояние" со<strong>в</strong>местно с понятием "<strong>в</strong>ходное<strong>в</strong>оздейст<strong>в</strong>ие" порождает понятие "а<strong>в</strong>томат без <strong>в</strong>ыхода", апосле <strong>в</strong><strong>в</strong>едения понятия "<strong>в</strong>ыходное <strong>в</strong>оздейст<strong>в</strong>ие" - понятие"а<strong>в</strong>томат" (конечный, детерминиро<strong>в</strong>анный);− использо<strong>в</strong>ание понятия "а<strong>в</strong>томат" <strong>в</strong> качест<strong>в</strong>е базо<strong>в</strong>ого<strong>в</strong> таких понятиях как "а<strong>в</strong>томатное программиро<strong>в</strong>ание" и"а<strong>в</strong>томатное проектиро<strong>в</strong>ание программ";− применение а<strong>в</strong>томато<strong>в</strong> <strong>в</strong> качест<strong>в</strong>е осно<strong>в</strong>ной модели приалгоритмизации и программиро<strong>в</strong>ании задач логическогоупра<strong>в</strong>ления;− <strong>в</strong><strong>в</strong>едено понятие "упра<strong>в</strong>ляющий а<strong>в</strong>томат", под которымпонимается со<strong>в</strong>окупность а<strong>в</strong>томата и функциональныхэлементо<strong>в</strong> задержки, с которыми а<strong>в</strong>томат <strong>в</strong>заимодейст<strong>в</strong>уеттакже как с объектами упра<strong>в</strong>ления;− для описания интерфейса каждого а<strong>в</strong>томатаразрабаты<strong>в</strong>ается схема его с<strong>в</strong>язей, содержащая <strong>в</strong> общемслучае источники информации, а<strong>в</strong>томат, функциональныеэлементы задержки, исполнительные механизмы объекто<strong>в</strong>упра<strong>в</strong>ления и средст<strong>в</strong>а предста<strong>в</strong>ления информации, чтопоз<strong>в</strong>оляет отказаться от сло<strong>в</strong>есных обозначений на графепереходо<strong>в</strong> а<strong>в</strong>томата и перейти к сим<strong>в</strong>олам соот<strong>в</strong>етст<strong>в</strong>ующихпеременных;


9− <strong>в</strong> качест<strong>в</strong>е структурных моделей, как и припроектиро<strong>в</strong>ании аппаратуры, применяются такие модели, кака<strong>в</strong>томат Мура, а<strong>в</strong>томат Мили, смешанный а<strong>в</strong>томат;− каждый а<strong>в</strong>томат не должен за<strong>в</strong>исеть от глубокойпредыстории ("будущее за<strong>в</strong>исит от настоящего и не за<strong>в</strong>иситот прошлого"), что достигается, если не использо<strong>в</strong>атьфлаги и умолчания;− для описания по<strong>в</strong>едения а<strong>в</strong>томато<strong>в</strong> применяется такой<strong>в</strong>изуальный формализм, как графы переходо<strong>в</strong>;− каждый граф переходо<strong>в</strong> должен быть семантически исинтаксически корректен. Пер<strong>в</strong>ое с<strong>в</strong>ойст<strong>в</strong>о определяет,пра<strong>в</strong>ильная ли построена модель, а <strong>в</strong>торое - пра<strong>в</strong>ильно лиона построена. При про<strong>в</strong>ерке синтаксической корректностиграф переходо<strong>в</strong> про<strong>в</strong>еряется на достижимость, полноту,непроти<strong>в</strong>оречи<strong>в</strong>ость, реализуемость и отсутст<strong>в</strong>иегенерирующих контуро<strong>в</strong>;− число <strong>в</strong>ершин <strong>в</strong> графе переходо<strong>в</strong> должно со<strong>в</strong>падать счислом состояний <strong>в</strong> а<strong>в</strong>томате, что наиболее характерно дляа<strong>в</strong>томато<strong>в</strong> Мура без флаго<strong>в</strong> и умолчаний;− <strong>в</strong> общем случае при алгоритмизации применяется неодин а<strong>в</strong>томат, а система <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong>,которая описы<strong>в</strong>ается системой <strong>в</strong>заимос<strong>в</strong>язанных графо<strong>в</strong>переходо<strong>в</strong>, что поддержи<strong>в</strong>ает <strong>в</strong>оз<strong>можно</strong>сть композиции идекомпозиции алгоритмо<strong>в</strong> и обеспечи<strong>в</strong>ает практическоеприменение технологии при построении сложных системупра<strong>в</strong>ления;− <strong>в</strong> программиро<strong>в</strong>ание <strong>в</strong><strong>в</strong>едено но<strong>в</strong>ое понятие"кодиро<strong>в</strong>ание состояний", широко используемое припроектиро<strong>в</strong>ании аппаратуры;− <strong>в</strong> качест<strong>в</strong>е осно<strong>в</strong>ного <strong>в</strong>ида кодиро<strong>в</strong>ания применяетсямногозначное кодиро<strong>в</strong>ание, поз<strong>в</strong>оляющее использо<strong>в</strong>ать толькоодну переменную для различения произ<strong>в</strong>ольного числа


10состояний, что особенно <strong>в</strong>ажно <strong>в</strong> случае, когда <strong>в</strong> разныхсостояниях формируются одинако<strong>в</strong>ые значения <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ий;− значение многозначной переменной состояния а<strong>в</strong>томатаполностью характеризует "положение" программы,реализующей один а<strong>в</strong>томат, <strong>в</strong> пространст<strong>в</strong>е ее состояний.Это поз<strong>в</strong>оляет <strong>в</strong><strong>в</strong>ести <strong>в</strong> программиро<strong>в</strong>ание понятие"наблюдаемость" (по одной <strong>в</strong>нутренней переменной);− для обеспечения наблюдаемости каждого состоянияа<strong>в</strong>томата на программную реализацию наклады<strong>в</strong>аетсяограничение, состоящее <strong>в</strong> том, что <strong>в</strong> каждом программномцикле <strong>в</strong> а<strong>в</strong>томате <strong>в</strong>ыполняется не более одного перехода;− при программной реализации N а<strong>в</strong>томато<strong>в</strong> с любымчислом состояний даже с учетом их <strong>в</strong>заимодейст<strong>в</strong>ияиспользуется только N многозначных переменных, кодирующихсостояния этих а<strong>в</strong>томато<strong>в</strong>;− "наблюдаемость" каждого а<strong>в</strong>томата обеспечи<strong>в</strong>ает<strong>в</strong>оз<strong>можно</strong>сть одно<strong>в</strong>ременной индикации значений переменныхсостояний <strong>в</strong>сех а<strong>в</strong>томато<strong>в</strong> на одном экране;− граф переходо<strong>в</strong> с многозначным кодиро<strong>в</strong>анием <strong>в</strong>ершин,соот<strong>в</strong>етст<strong>в</strong>ующий <strong>в</strong>ыбранной структурной модели а<strong>в</strong>томата,формально и изоморфно реализуется одной или д<strong>в</strong>умяконструкциями switch языка Си или их аналогами <strong>в</strong> другихязыках программиро<strong>в</strong>ания, что и определило наз<strong>в</strong>аниепредлагаемой технологии, а кроме того, сло<strong>в</strong>о switch(переключатель) ассоциируется с теорией переключательныхсхем, я<strong>в</strong>ляющейся осно<strong>в</strong>ой теории логического упра<strong>в</strong>ления;− указанная реализация графа переходо<strong>в</strong> эк<strong>в</strong>и<strong>в</strong>алентнасхеме алгоритма, начинающейся с дешифратора состояний, ане с дешифратора <strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ий, как это делаетсятрадиционно;


11− при формальном и изоморфном переходе к программе отграфа переходо<strong>в</strong> без флаго<strong>в</strong> и умолчаний последний я<strong>в</strong>ляетсясертификационным тестом для ее про<strong>в</strong>ерки;− кроме обмена номерами состояний между а<strong>в</strong>томатами,реализуемыми последо<strong>в</strong>ательным расположением <strong>в</strong> программеконструкций switch, графы переходо<strong>в</strong> могут<strong>в</strong>заимодейст<strong>в</strong>о<strong>в</strong>ать и по принципу <strong>в</strong>ложенности, что можетбыть реализо<strong>в</strong>ано <strong>в</strong>ложенными конструкциями switchпроиз<strong>в</strong>ольной глубины или <strong>в</strong>ызо<strong>в</strong>ом функций, построенных изэтих конструкций, которые реализуют графы переходо<strong>в</strong>соот<strong>в</strong>етст<strong>в</strong>ующего уро<strong>в</strong>ня <strong>в</strong>ложенности;− графы переходо<strong>в</strong> могут использо<strong>в</strong>аться также и присоздании моделей объекто<strong>в</strong> логического упра<strong>в</strong>ления. Этопоз<strong>в</strong>оляет с единых позиций про<strong>в</strong>одить описание и <strong>в</strong>ыполнятьмоделиро<strong>в</strong>ание как разомкнутого, так и замкнутогокомплекса "упра<strong>в</strong>ляющий алгоритм - модель объектаупра<strong>в</strong>ления";− предлагаемая технология поз<strong>в</strong>оляет Заказчику,Проектанту (Технологу), Разработчику, Программисту,Пользо<strong>в</strong>ателю и Контролеру однозначно понимать, что должнобыть сделано, что делается и что сделано <strong>в</strong> программнореализуемом проекте."Реакти<strong>в</strong>ные" системы обладают спецификой, требующейразработки <strong>в</strong>арианта SWITCH-технологии. Перечислимосно<strong>в</strong>ные отличия рассматри<strong>в</strong>аемых классо<strong>в</strong> систем.Если <strong>в</strong> системах логического упра<strong>в</strong>ления <strong>в</strong> качест<strong>в</strong>е<strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ий используются опраши<strong>в</strong>аемые программойд<strong>в</strong>оичные <strong>в</strong>ходные переменные и предикаты, соот<strong>в</strong>етст<strong>в</strong>ующиеопределенным состояниям а<strong>в</strong>томато<strong>в</strong>, <strong>в</strong>заимодейст<strong>в</strong>ующих срассматри<strong>в</strong>аемым а<strong>в</strong>томатом, то для "реакти<strong>в</strong>ных" систем этопонятие расширено. Во-пер<strong>в</strong>ых, <strong>в</strong> качест<strong>в</strong>е <strong>в</strong>ходныхпеременных используются любые подпрограммы (функции),


12<strong>в</strong>оз<strong>в</strong>ращающие д<strong>в</strong>оичные значения, а <strong>в</strong>о-<strong>в</strong>торых, <strong>в</strong><strong>в</strong>еденысобытия, не только обеспечи<strong>в</strong>ающие <strong>в</strong>оз<strong>можно</strong>сть <strong>в</strong>ыполненияпереходо<strong>в</strong> <strong>в</strong> а<strong>в</strong>томатах, но инициирующие их запуск. Событиямогут также иницииро<strong>в</strong>ать реализацию <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий<strong>в</strong> случае, когда состояние а<strong>в</strong>томата не изменяется.Другое отличие "реакти<strong>в</strong>ных" систем от системлогического упра<strong>в</strong>ления состоит <strong>в</strong> том, что <strong>в</strong> них <strong>в</strong>качест<strong>в</strong>е <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий применяются не д<strong>в</strong>оичныепеременные, а произ<strong>в</strong>ольные подпрограммы.Еще одно отличие систем рассматри<strong>в</strong>аемого класса посра<strong>в</strong>нению с системами логического упра<strong>в</strong>ления состоит <strong>в</strong>используемой операционной системе. Если <strong>в</strong> системахлогического упра<strong>в</strong>ления при их реализации напрограммируемых логических контроллерах применяются"<strong>в</strong>строенные" операционные системы, работающие обычноциклически, то для "реакти<strong>в</strong>ных" систем характерноприменение операционных систем реального <strong>в</strong>ремени (ОС РВ),таких как, например, ОС РВ QNX, с<strong>в</strong>ойст<strong>в</strong>а которых <strong>в</strong>лияютна программную реализацию алгоритмо<strong>в</strong>. В рассматри<strong>в</strong>аемыхсистемах преры<strong>в</strong>ания обрабаты<strong>в</strong>аются операционной системойи передаются программе <strong>в</strong> <strong>в</strong>иде сообщений, которые, <strong>в</strong> с<strong>в</strong>оиочередь, обрабаты<strong>в</strong>аются как события с помощьюсоот<strong>в</strong>етст<strong>в</strong>ующих обработчико<strong>в</strong>. При этом после обработкиочередного события а<strong>в</strong>томат сохраняет с<strong>в</strong>ое состояние и"засыпает" до поя<strong>в</strong>ления следующего события.Также как и <strong>в</strong> системах логического упра<strong>в</strong>ления, <strong>в</strong>"реакти<strong>в</strong>ных" системах алгоритмы предста<strong>в</strong>ляются <strong>в</strong> <strong>в</strong>идесистемы <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong>. При этом, если <strong>в</strong>системах пер<strong>в</strong>ого типа <strong>в</strong>заимодейст<strong>в</strong>ие а<strong>в</strong>томато<strong>в</strong> <strong>в</strong> осно<strong>в</strong>номосущест<strong>в</strong>ляется за счет обмена номерами состояний, а<strong>в</strong>ложенность присутст<strong>в</strong>ует <strong>в</strong> "зачаточном" состоянии, то <strong>в</strong>"реакти<strong>в</strong>ных" системах число способо<strong>в</strong> <strong>в</strong>заимодейст<strong>в</strong>ияу<strong>в</strong>еличилось.


14за<strong>в</strong>ершение работы а<strong>в</strong>томато<strong>в</strong>, <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия и <strong>в</strong>ремяначала <strong>в</strong>ыполнения каждого из них;− а<strong>в</strong>томатическое построение "короткого" протокола <strong>в</strong>дополнение к "полному", <strong>в</strong> котором фиксируются толькособытия и инициируемые ими <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия,интересующие Заказчика.Разрабаты<strong>в</strong>аемая технология поддержи<strong>в</strong>ает <strong>в</strong>се этапысоздания программного обеспечения: изучение предметнойобласти, анализ, проектиро<strong>в</strong>ание, реализация, отладка,сертификация и документиро<strong>в</strong>ание.Технология, описы<strong>в</strong>аемая <strong>в</strong> настоящей работе,применялась а<strong>в</strong>торами при создании программногообеспечения для ряда "реакти<strong>в</strong>ных" систем, что отражено <strong>в</strong>соот<strong>в</strong>етст<strong>в</strong>ующих разделах <strong>отчет</strong>а.1. Классификация задач, решаемых с использо<strong>в</strong>аниема<strong>в</strong>томатного подходаОпыт разработки и применения а<strong>в</strong>томатногопрограммиро<strong>в</strong>ания (SWITCH-технология) поз<strong>в</strong>олил <strong>в</strong>ыделитьтри класса задач, <strong>в</strong> которых может быть примененпредлагаемый подход:− системы логического упра<strong>в</strong>ления, характернойособенностью которых я<strong>в</strong>ляется д<strong>в</strong>оичная формапредста<strong>в</strong>ления <strong>в</strong>ходных и <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий и <strong>в</strong><strong>в</strong>од<strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ий путем опроса;− "реакти<strong>в</strong>ные" системы, характерной особенностьюкоторых я<strong>в</strong>ляется наличие среди <strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ийсобытий;− <strong>в</strong>ычислительные алгоритмы, такие как, например,алгоритмы сортиро<strong>в</strong>ки, поиска и т.п.


Специфика каждого из перечисленных классо<strong>в</strong> задачя<strong>в</strong>ляется причиной различных особенностей <strong>в</strong> реализации(табл. 1).Таблица 1. Особенности реализации различных классо<strong>в</strong> задач,решаемых с использо<strong>в</strong>анием а<strong>в</strong>томатного подходаОсобенности реализацииТипы <strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ийа<strong>в</strong>томата (без учета обменаномерами состояний)Типы <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ийа<strong>в</strong>томатаСпособы реализации <strong>в</strong>ходных и<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ийСпособы запуска а<strong>в</strong>томато<strong>в</strong>Системылогическогоупра<strong>в</strong>ления• д<strong>в</strong>оичныепеременные• дейст<strong>в</strong>ия• деятельности• переменные• функции• бесконечныйцикл• периодическийКлассы решаемых задач"Реакти<strong>в</strong>ные"(событийные)системы• д<strong>в</strong>оичныепеременные• события• дейст<strong>в</strong>ия• переменные• функции• по событиям15Вычислительныеалгоритмы• д<strong>в</strong>оичныепеременные• дейст<strong>в</strong>ия• функции• конечный циклРазличные <strong>в</strong>арианты реализации перечисленных классо<strong>в</strong>задач порождают различные структуры получаемого <strong>в</strong>результате программного обеспечения.Важнейшая особенность структур программногообеспечения, разрабаты<strong>в</strong>аемого с использо<strong>в</strong>анием SWITCHтехнологии,заключается <strong>в</strong> том, что <strong>в</strong> центре находитсяупра<strong>в</strong>ляющий а<strong>в</strong>томат, а <strong>в</strong> общем случае — система<strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong> [1-3]. При этом структурыпрограммного обеспечения <strong>можно</strong> классифициро<strong>в</strong>ать поспособу реализации <strong>в</strong>ходных и <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий испособу запуска а<strong>в</strong>томато<strong>в</strong> (рис. 1).


16Классификация способо<strong>в</strong> реализации программ, разрабаты<strong>в</strong>аемых сприменением SWITCH-технологии1Способ реализации <strong>в</strong>ходных и<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий2Способ запуска а<strong>в</strong>томато<strong>в</strong>1.1Переменные1.2Функции2.1Непреры<strong>в</strong>ный2.2Периодический2.3Пособытиям2.1.1Бесконечныйцикл2.1.2КонечныйциклРис. 1. Классификация способо<strong>в</strong> реализации программ,разрабаты<strong>в</strong>аемых с применением SWITCH-технологииОтметим, что каждый из указанных способо<strong>в</strong> запуска<strong>в</strong>ыполняется циклически, а их осно<strong>в</strong>ные отличия состоят <strong>в</strong>особенностях реализации тела цикла.Рассмотрим осно<strong>в</strong>ные из множест<strong>в</strong>а <strong>в</strong>озможных структурпрограммного обеспечения, получаемых путем комбинацииразличных способо<strong>в</strong> реализации.1.1. Системы логического упра<strong>в</strong>ления1.1.1. Реализация на программируемых логическихконтроллерахВ системах логического упра<strong>в</strong>ления (при их реализациина программируемых логических контроллерах) а<strong>в</strong>томатызапускаются <strong>в</strong> бесконечном цикле <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии с принятой<strong>в</strong> контроллерах организацией исполнения упра<strong>в</strong>ляющихпрограмм. При этом тело цикла состоит из трех частей(рис. 2).


17Входной преобразо<strong>в</strong>ательФормиро<strong>в</strong>ание значений <strong>в</strong>ходных переменных - запоминание текущихзначений <strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ий (фотография <strong>в</strong>ходо<strong>в</strong>)Система <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong>(используются <strong>в</strong>ходные переменные и формируются значения <strong>в</strong>ыходныхпеременных)Выходной преобразо<strong>в</strong>ательРеализация <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии со значениями<strong>в</strong>ыходных переменныхРис. 2. Структура программного обеспечения систем логическогоупра<strong>в</strong>ления, реализуемых на программируемых логических контроллерахСначала контроллер осущест<strong>в</strong>ляет опрос <strong>в</strong>ходныхпеременных и помещает их текущие значения <strong>в</strong> операти<strong>в</strong>нуюпамять (<strong>в</strong>ыполняется фотография <strong>в</strong>ходо<strong>в</strong>). После этого <strong>в</strong>сеа<strong>в</strong>томаты <strong>в</strong>ыполняются последо<strong>в</strong>ательно <strong>в</strong> заданном порядке.В за<strong>в</strong>ершении цикла контроллер записы<strong>в</strong>ает текущие значения<strong>в</strong>ыходных переменных <strong>в</strong> <strong>в</strong>ыходные регистры, после чего циклпо<strong>в</strong>торяется. Особенность данного способа заключается <strong>в</strong>том, что шаги цикла <strong>в</strong>ыполняются с частотой, определяемойпроиз<strong>в</strong>одительностью контроллера. Благодаря этому задержкареакции упра<strong>в</strong>ляющей программы на изменение значений<strong>в</strong>ходных переменных не будет пре<strong>в</strong>ышать длительности одногопрограммного цикла.Таким образом, рассмотренная реализация соот<strong>в</strong>етст<strong>в</strong>уетпунктам 1.1 и 2.1.1 классификации (рис. 1).


1.1.2. Моделиро<strong>в</strong>ание контроллера <strong>в</strong> однозадачныхоперационных системах18Используемый <strong>в</strong> контроллерах способ <strong>в</strong>ыполненияупра<strong>в</strong>ляющих программ может быть промоделиро<strong>в</strong>ан накомпьютере. Для реализации бесконечного цикла <strong>в</strong> случаеприменения языка Си может использо<strong>в</strong>аться операторfor(;;), а <strong>в</strong>ыходной преобразо<strong>в</strong>атель <strong>в</strong> общем случаепредста<strong>в</strong>ляет собой набор операторо<strong>в</strong> усло<strong>в</strong>ного перехода,<strong>в</strong>ыбирающих необходимые <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия <strong>в</strong> за<strong>в</strong>исимостиот значений <strong>в</strong>ыходных переменных.При реализации систем упра<strong>в</strong>ления на компьютерах,<strong>в</strong>ходные и <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия могут быть реализо<strong>в</strong>аны <strong>в</strong><strong>в</strong>иде функций (рис. 3). Благодаря этому поя<strong>в</strong>ляется<strong>в</strong>оз<strong>можно</strong>сть создания с использо<strong>в</strong>анием SWITCH-технологиисистем упра<strong>в</strong>ления более широкого класса, чем системылогического упра<strong>в</strong>ления. Такая реализация соот<strong>в</strong>етст<strong>в</strong>уетпунктам 1.2 и 2.1.1 классификации (рис. 1).Система <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong> (функции, реализующие <strong>в</strong>ходные и<strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия, <strong>в</strong>ызы<strong>в</strong>аются при необходимости)Вызо<strong>в</strong> функций<strong>в</strong>ходныхпеременныхФункции <strong>в</strong>ходныхпеременных,осущест<strong>в</strong>ляющие опросисточнико<strong>в</strong> информацииФункции <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ийВызо<strong>в</strong> функций,реализующих <strong>в</strong>ыходные<strong>в</strong>оздейст<strong>в</strong>ияРис. 3. Структура программного обеспечения систем упра<strong>в</strong>ления среализацией <strong>в</strong>ходных и <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий <strong>в</strong> <strong>в</strong>иде функций


19Реализация <strong>в</strong>ходных и <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий <strong>в</strong> <strong>в</strong>идефункций имеет сущест<strong>в</strong>енные отличия по сра<strong>в</strong>нению с ихреализацией <strong>в</strong> <strong>в</strong>иде переменных. Из структуры программногообеспечения исчезают <strong>в</strong>ходной и <strong>в</strong>ыходной преобразо<strong>в</strong>атели,так как функции, реализующие <strong>в</strong>ходные переменные<strong>в</strong>ызы<strong>в</strong>аются только тогда, когда эти переменные <strong>в</strong>стречаются<strong>в</strong> усло<strong>в</strong>иях переходо<strong>в</strong>, а функции, реализующие <strong>в</strong>ыходные<strong>в</strong>оздейст<strong>в</strong>ия, <strong>в</strong>ызы<strong>в</strong>аются однократно при <strong>в</strong>ыдачесоот<strong>в</strong>етст<strong>в</strong>ующего <strong>в</strong>оздейст<strong>в</strong>ия. При этом количест<strong>в</strong>о<strong>в</strong>ыходных функций уд<strong>в</strong>аи<strong>в</strong>ается по сра<strong>в</strong>нению с аналогичнымколичест<strong>в</strong>ом <strong>в</strong>ыходных переменных. Например, для упра<strong>в</strong>ленияс<strong>в</strong>ето<strong>в</strong>ым индикатором, который находится <strong>в</strong> <strong>в</strong>ыключенном или<strong>в</strong>ключенном состоянии, может использо<strong>в</strong>аться одна <strong>в</strong>ыходнаяпеременная, нуле<strong>в</strong>ое значение которой <strong>в</strong>ыключает индикатор,а значение ра<strong>в</strong>ное единице — <strong>в</strong>ключает. При реализации<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий <strong>в</strong> <strong>в</strong>иде функций, для упра<strong>в</strong>ления такиминдикатором потребуются д<strong>в</strong>е <strong>в</strong>ыходные функции, одна изкоторых <strong>в</strong>ыключает индикатор, а другая <strong>в</strong>ключает. Прижелании д<strong>в</strong>е эти функции могут быть заменены однойфункцией с параметром и усло<strong>в</strong>ным переходом <strong>в</strong>нутри нее.1.1.3. Моделиро<strong>в</strong>ание контроллера <strong>в</strong> многозадачныхоперационных системахРассмотренный <strong>в</strong>ыше способ запуска а<strong>в</strong>томато<strong>в</strong> <strong>в</strong>непреры<strong>в</strong>ном цикле я<strong>в</strong>ляется естест<strong>в</strong>енным для контроллеро<strong>в</strong>,может быть использо<strong>в</strong>ан <strong>в</strong> программном обеспечении,функционирующем под упра<strong>в</strong>лением однозадачных операционныхсистем, но я<strong>в</strong>ляется нежелательным <strong>в</strong> случае использо<strong>в</strong>аниямногозадачных операционных систем.При разработке программ для многозадачныхоперационных систем, непреры<strong>в</strong>ный цикл может быть замененциклом, тело которого <strong>в</strong>ыполняется только при приходекакого-либо сообщения, например сообщения о срабаты<strong>в</strong>ании


20таймера, период срабаты<strong>в</strong>ания которого ра<strong>в</strong>ен требуемому<strong>в</strong>ремени задержки реакции системы упра<strong>в</strong>ления на изменениезначений <strong>в</strong>ходных переменных.Сообщения от таймера принадлежат к разно<strong>в</strong>идности<strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ий, назы<strong>в</strong>аемых событиями. Отметим, что <strong>в</strong>большинст<strong>в</strong>е контроллеро<strong>в</strong> отсутст<strong>в</strong>ует <strong>в</strong>оз<strong>можно</strong>стьпорождения и обработки программных событий.При запуске а<strong>в</strong>томато<strong>в</strong> от таймера-генераторасинхроимпульсо<strong>в</strong> <strong>в</strong> структуру программы доба<strong>в</strong>ляетсяобработчик события "Срабаты<strong>в</strong>ание таймера" (рис. 4). Такаяреализация соот<strong>в</strong>етст<strong>в</strong>ует пунктам 1.2 и 2.2 классификации(рис. 1).Событие "Срабаты<strong>в</strong>ание таймера"Обработчик события <strong>в</strong>ызы<strong>в</strong>ается, например,средст<strong>в</strong>ами операционной системыФункция-обработчик события «срабаты<strong>в</strong>ание таймера»Обработчик события <strong>в</strong>ызы<strong>в</strong>ает а<strong>в</strong>томатыСистема <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong> (функции, реализующие <strong>в</strong>ходные и<strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия, <strong>в</strong>ызы<strong>в</strong>аются при необходимости)Вызо<strong>в</strong> функций<strong>в</strong>ходныхпеременныхФункции <strong>в</strong>ходныхпеременных,осущест<strong>в</strong>ляющие опросисточнико<strong>в</strong> информацииВызо<strong>в</strong> функций,реализующих <strong>в</strong>ыходные<strong>в</strong>оздейст<strong>в</strong>ияФункции <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ийРис. 4. Структура программ с периодическим запускома<strong>в</strong>томато<strong>в</strong> от таймераПри запуске а<strong>в</strong>томато<strong>в</strong> от таймера из структурыпрограммы исчезает <strong>в</strong> я<strong>в</strong>ном <strong>в</strong>иде бесконечный цикл. Однако


21запуск а<strong>в</strong>томато<strong>в</strong> остается циклическим, учиты<strong>в</strong>аяциклический способ обработки событий <strong>в</strong> многозадачныхоперационных системах (рис. 5).Ожидание события(информация особытии поступает <strong>в</strong><strong>в</strong>иде сообщения)Обработка события (дляобработки события<strong>в</strong>ызы<strong>в</strong>аетсясоот<strong>в</strong>етст<strong>в</strong>ующаяфункция-обработчик)Рис. 5. Обработка событий<strong>в</strong> многозадачныхоперационных системахДля уменьшения загрузки процессора <strong>в</strong> многозадачнойсистеме период срабаты<strong>в</strong>ания таймера, запускающегоа<strong>в</strong>томаты, может изменяться <strong>в</strong> за<strong>в</strong>исимости от состояния, <strong>в</strong>котором находится система упра<strong>в</strong>ления.Пусть, например, к разрабаты<strong>в</strong>аемой системеупра<strong>в</strong>ления, функционирующей <strong>в</strong> режимах "Остано<strong>в</strong>", "Работа"и "А<strong>в</strong>ария" предъя<strong>в</strong>лено требо<strong>в</strong>ание, состоящее <strong>в</strong> том, чтозадержка реакции на изменение <strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ий неможет пре<strong>в</strong>ышать 0.1 с. Для <strong>в</strong>ыполнения этого требо<strong>в</strong>аниянеобходимо запрограммиро<strong>в</strong>ать таймер, используемый <strong>в</strong>качест<strong>в</strong>е генератора синхроимпульсо<strong>в</strong>, на период, непре<strong>в</strong>ышающий указанный. Однако далее это требо<strong>в</strong>ание можетбыть уточнено и <strong>в</strong>ыяснится, например, что онопредъя<strong>в</strong>лялось только для режима "Работа", а <strong>в</strong> режиме"А<strong>в</strong>ария" задержка реакции ограничи<strong>в</strong>ается значением 1 с, <strong>в</strong>режиме "Остано<strong>в</strong>" — 10 с.


1.2. "Реакти<strong>в</strong>ные" (событийные) системы22В отличие от систем логического упра<strong>в</strong>ления, <strong>в</strong>событийных системах <strong>в</strong>ходные <strong>в</strong>оздейст<strong>в</strong>ия разделяются над<strong>в</strong>а типа: <strong>в</strong>ходные переменные и события. Воз<strong>можно</strong>стьприменения <strong>в</strong> качест<strong>в</strong>е <strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ий событийпоз<strong>в</strong>оляет использо<strong>в</strong>ать SWITCH-технологию при созданиипрограммного обеспечения систем упра<strong>в</strong>ления, принадлежащихк "реакти<strong>в</strong>ным" системам (системам, реагирующим насобытия). К таким системам относятся, например, <strong>в</strong>сесистемы реализующие пользо<strong>в</strong>ательский интерфейс <strong>в</strong>со<strong>в</strong>ременных графических оболочках.При этом раз<strong>в</strong>и<strong>в</strong>ая структуру программ, предста<strong>в</strong>леннуюна рис. 4, <strong>в</strong> которой а<strong>в</strong>томаты запускались из обработчикасобытия срабаты<strong>в</strong>ания таймера, будем запускать а<strong>в</strong>томаты изобработчико<strong>в</strong> <strong>в</strong>сех событий, присутст<strong>в</strong>ующих среди <strong>в</strong>ходных<strong>в</strong>оздейст<strong>в</strong>ий.Отметим, что один и тот же источник <strong>в</strong>ходных<strong>в</strong>оздейст<strong>в</strong>ий может одно<strong>в</strong>ременно я<strong>в</strong>ляться источником и<strong>в</strong>ходных переменных и событий. Поясним это на примерекнопки, которая может я<strong>в</strong>ляться источником <strong>в</strong>ходных<strong>в</strong>оздейст<strong>в</strong>ий (рис. 6), перечисленных ниже:− событие "Нажатие кнопки";− событие "Отпускание кнопки";− <strong>в</strong>ходная переменная "Кнопка нажата" (либо ееин<strong>в</strong>ерсия — "Кнопка отпущена").


23Кнопка нажатаКнопка отпущенаВремяСобытие"Нажатиекнопки"Событие"Отпусканиекнопки"Рис. 6. Временная диаграмма нажатия кнопкиТаким образом, <strong>в</strong>ходные переменные указы<strong>в</strong>ают натекущее значение <strong>в</strong>ходного <strong>в</strong>оздейст<strong>в</strong>ия, а события — наизменение этого значения. Поэтому <strong>в</strong>ходные переменные на<strong>в</strong>ременной диаграмме отмечаются на <strong>в</strong>ертикальной оси, асобытия — на оси <strong>в</strong>ремени. Такое <strong>в</strong>ремя <strong>в</strong> [4] наз<strong>в</strong>ано"событийным".Из изложенного следует, что <strong>в</strong> событийных системах<strong>в</strong>ремя присутст<strong>в</strong>ует <strong>в</strong> я<strong>в</strong>ном <strong>в</strong>иде среди <strong>в</strong>ходных<strong>в</strong>оздейст<strong>в</strong>ий, <strong>в</strong> отличие от систем логического упра<strong>в</strong>ления,<strong>в</strong> которых оно может присутст<strong>в</strong>о<strong>в</strong>ать только <strong>в</strong> <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>иях (функциональные элементы задержки). В<strong>в</strong>ычислительных алгоритмах <strong>в</strong>ремя <strong>в</strong> я<strong>в</strong>ном <strong>в</strong>иде неиспользуется.В качест<strong>в</strong>е наз<strong>в</strong>аний д<strong>в</strong>оичных <strong>в</strong>ходных переменныхиспользуются предложения <strong>в</strong> по<strong>в</strong>ест<strong>в</strong>о<strong>в</strong>ательной форме(например, "Кнопка нажата"). Наз<strong>в</strong>ания событий содержатотглагольные сущест<strong>в</strong>ительные (например, "Нажатиекнопки").В случае, когда необходимо решить, <strong>в</strong> каком <strong>в</strong>идерассматри<strong>в</strong>ать <strong>в</strong>ходное <strong>в</strong>оздейст<strong>в</strong>ие, <strong>в</strong>озможны <strong>в</strong>арианты,перечисленные ниже.1. Входная переменная. Этот <strong>в</strong>ариант я<strong>в</strong>ляется наиболеепредпочтительным, не считая ситуаций, описанных <strong>в</strong>следующих пунктах.


242. Событие. Использо<strong>в</strong>ание событий целесообразно, <strong>в</strong>пер<strong>в</strong>ую очередь, для <strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ий имеющихкратко<strong>в</strong>ременный характер. К источникам таких <strong>в</strong>оздейст<strong>в</strong>ий<strong>можно</strong> отнести, например, кнопки без памяти и таймеры.Отметим однако, что факт <strong>в</strong>озникно<strong>в</strong>ения подобных <strong>в</strong>ходных<strong>в</strong>оздейст<strong>в</strong>ий может быть запомнен, после чего они могутрассматри<strong>в</strong>аться как <strong>в</strong>ходные переменные.3. Входная переменная и событие одно<strong>в</strong>ременно. Дляускорения реакции на изменение <strong>в</strong>ходной переменной, этоизменение может рассматри<strong>в</strong>аться как событие. В качест<strong>в</strong>епримера <strong>в</strong>ходного <strong>в</strong>оздейст<strong>в</strong>ия, которое необходиморассматри<strong>в</strong>ать одно<strong>в</strong>ременно и как <strong>в</strong>ходную переменную, икак событие, <strong>можно</strong> при<strong>в</strong>ести сигнализатор открытогоположения д<strong>в</strong>ери микро<strong>в</strong>олно<strong>в</strong>ой печи. Входное <strong>в</strong>оздейст<strong>в</strong>иеот этого сигнализатора должно рассматри<strong>в</strong>аться как <strong>в</strong>ходнаяпеременная, так как его необходимо опраши<strong>в</strong>ать, про<strong>в</strong>еряядопустимость <strong>в</strong>ключения печи. В то же <strong>в</strong>ремя, при открытиид<strong>в</strong>ери печи <strong>в</strong>о <strong>в</strong>ремя ее работы, она должна быть отключенанемедленно, а не тогда, когда <strong>в</strong>ходная переменная "Д<strong>в</strong>ерьоткрыта", будет опрошена <strong>в</strong> результате прихода какого-либодругого события. Отметим, что <strong>в</strong> данном примерерассматри<strong>в</strong>ается модель микро<strong>в</strong>олно<strong>в</strong>ой печи, так как <strong>в</strong>реальности откры<strong>в</strong>ание д<strong>в</strong>ери непосредст<strong>в</strong>енно размыкает еепитающую цепь.Запуск а<strong>в</strong>томато<strong>в</strong> <strong>в</strong> событийных системах происходит изобработчико<strong>в</strong> событий. При этом <strong>в</strong> функцию, реализующуюа<strong>в</strong>томат, номер произошедшего события передается <strong>в</strong> <strong>в</strong>идепараметра. Структура программ <strong>в</strong> общем случае содержит(рис. 7):− обработчики событий;− систему <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong>;− функции, реализующие <strong>в</strong>ходные переменные;


25− функции, реализующие <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия;− функции протоколиро<strong>в</strong>ания;− <strong>в</strong>спомогательные модули.Такая реализация соот<strong>в</strong>етст<strong>в</strong>ует пунктам 1.2 и 2.3классификации (рис. 1).События(например, от пользо<strong>в</strong>ательского интерфейса, операционной системы,аппаратуры и т.п.)Обработчики событий <strong>в</strong>ызы<strong>в</strong>аются, например,средст<strong>в</strong>ами операционной системыФункции обработчико<strong>в</strong> событий(например, обработчик события «срабаты<strong>в</strong>ание таймера»)Обработчики событий <strong>в</strong>ызы<strong>в</strong>ают а<strong>в</strong>томаты, переда<strong>в</strong>аяим номера произошедших событийСистема <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong> - системонеза<strong>в</strong>исимая частьпрограммы(<strong>в</strong>заимодейст<strong>в</strong>ие а<strong>в</strong>томато<strong>в</strong> по <strong>в</strong>ложенностии обмену номерами состояний (y))Вызо<strong>в</strong> функций<strong>в</strong>ходныхпеременныхВызо<strong>в</strong>функций,реализующих<strong>в</strong>ыходные<strong>в</strong>оздейст<strong>в</strong>ияВзаимодейст<strong>в</strong>ие по<strong>в</strong>ызы<strong>в</strong>аемости спередачей<strong>в</strong>нутренних событийФункции <strong>в</strong>ходныхпеременных (x),осущест<strong>в</strong>ляющие опросисточнико<strong>в</strong> информацииФункциипротоколиро<strong>в</strong>анияФункции <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ий (z)Вызо<strong>в</strong><strong>в</strong>спомогательныхфункцийВызо<strong>в</strong><strong>в</strong>спомогательныхфункцийПорождение некоторыхсобытий, например,запуск таймеро<strong>в</strong>Вспомогательные модули и библиотеки(например, модуль упра<strong>в</strong>ления таймерами)Рис. 7. Структура программного обеспечения реакти<strong>в</strong>ных систем


2. А<strong>в</strong>томаты26В схемах с<strong>в</strong>язей, графах переходо<strong>в</strong> и схемах<strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong> могут использо<strong>в</strong>атьсяобозначения, при<strong>в</strong>еденные <strong>в</strong> табл. 2.Таблица 2. Сокращенные обозначения, применяемые <strong>в</strong> схемах с<strong>в</strong>язей,графах переходо<strong>в</strong> и схемах <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>ОбозначениеAnynyb = pxjCn_renzkzd_mTsА<strong>в</strong>томат с номером nРасшифро<strong>в</strong>каПеременная состояния а<strong>в</strong>томата с номером nПредикат, про<strong>в</strong>еряющий ра<strong>в</strong>енст<strong>в</strong>о номератекущего состояния а<strong>в</strong>томата с номером bзначению p. При программной реализациия<strong>в</strong>ляется сокращенной записью предиката"yb == p"Входная переменная с номером jПроиз<strong>в</strong>ольная логическая формула с номером rдля а<strong>в</strong>томата с номером nСобытие с номером 'n'. При программнойреализации обозначение "en" я<strong>в</strong>ляетсясокращенной записью предиката "e == n", а"en " — сокращенной записью предиката"e != n"Выходное <strong>в</strong>оздейст<strong>в</strong>ие с номером 'k''m'-ое значение <strong>в</strong>ыходного <strong>в</strong>оздейст<strong>в</strong>ия сномером 'd'Таймер с номером 's'i: Численное обозначение приоритета усло<strong>в</strong>ияперехода ('1' - наи<strong>в</strong>ысший приоритет)


2.1. Нотация схемы с<strong>в</strong>язей27При построении схемы с<strong>в</strong>язей а<strong>в</strong>томата используетсянотация, при<strong>в</strong>еденная на рис. 8.1. Наз<strong>в</strong>аниедокумента2. Обозначениеа<strong>в</strong>томата, <strong>в</strong>который <strong>в</strong>ложенрассматри<strong>в</strong>аемый3. А<strong>в</strong>томат4. Перечислениеобозначенийа<strong>в</strong>томато<strong>в</strong>, <strong>в</strong>ложенных<strong>в</strong> рассматри<strong>в</strong>аемый5. Обозначениеа<strong>в</strong>томата6. ВходнаяпеременнаяА<strong>в</strong>томат переключения режимо<strong>в</strong> работы системы. Схема с<strong>в</strong>язейВложен <strong>в</strong> а<strong>в</strong>томат A20. Вложенные а<strong>в</strong>томаты: A1, A2, A3, A4, A8, A9, A10, A11, A12A09. Обобщенноеобозначение<strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ий7. Опроспеременнойсостояния другогоа<strong>в</strong>томатаДатчик частоты<strong>в</strong>ращенияА<strong>в</strong>томат остано<strong>в</strong>аA3Нуле<strong>в</strong>ая частота <strong>в</strong>ращенияНачато <strong>в</strong>ыполнение остано<strong>в</strong>аЗа<strong>в</strong>ершено <strong>в</strong>ыполнение остано<strong>в</strong>аx10y3 ≠ 0y3 = 0А0z10z20_0z20_1z20_2z20_3Индикация состояния "Остано<strong>в</strong>лен"Индикация состояния "Запущен"Индикация состояния "Запускается"Индикация состояния "Остана<strong>в</strong>ли<strong>в</strong>ается"Доба<strong>в</strong>ить сообщение <strong>в</strong>очередь сообщений оба<strong>в</strong>арияхМнемосхема10. Выходные<strong>в</strong>оздейст<strong>в</strong>ия,с<strong>в</strong>язанные снекоторымобъектомупра<strong>в</strong>ления11. Выходные<strong>в</strong>оздейст<strong>в</strong>ия,<strong>в</strong>ызы<strong>в</strong>ающиеа<strong>в</strong>томат8. СобытияОбработчикисобытийНажатие кнопки СТОПНажатие кнопки ПУСКСигнал опроса датчико<strong>в</strong>Срабаты<strong>в</strong>ание таймера Т40e10e20e30e40Выдать команду на закрытиеклапана подачи <strong>в</strong>оздуха (e420)z30_0Выдать команду на открытиеклапана подачи <strong>в</strong>оздуха (e410)z30_1z40_0 Остано<strong>в</strong>ить таймер Таймер контроляЗапустить таймер<strong>в</strong>ремени про<strong>в</strong>орота Т40z40_160 сА<strong>в</strong>томатупра<strong>в</strong>ленияклапаном собратнойс<strong>в</strong>язью A80Клапанподачи<strong>в</strong>оздуха12. Выходные<strong>в</strong>оздейст<strong>в</strong>ия,упра<strong>в</strong>ляющиетаймерами13. Обратная с<strong>в</strong>язьВходные<strong>в</strong>оздейст<strong>в</strong>ияА<strong>в</strong>томатВыходные<strong>в</strong>оздейст<strong>в</strong>ияРис. 8. Нотация, используемая <strong>в</strong> схемах с<strong>в</strong>язей а<strong>в</strong>томато<strong>в</strong>В рассматри<strong>в</strong>аемой нотации используются перечисленныениже обозначения.1. Наз<strong>в</strong>ание документа. Наз<strong>в</strong>ание документарасполагается посередине <strong>в</strong> <strong>в</strong>ерхней части листа и содержитназ<strong>в</strong>ание а<strong>в</strong>томата и наз<strong>в</strong>ание собст<strong>в</strong>енно документа —"Схема с<strong>в</strong>язей".2. Обозначение а<strong>в</strong>томата, <strong>в</strong> который <strong>в</strong>ложенрассматри<strong>в</strong>аемый. Содержит информацию о том, <strong>в</strong> какойа<strong>в</strong>томат <strong>в</strong>ложен рассматри<strong>в</strong>аемый а<strong>в</strong>томат. Если а<strong>в</strong>томат нея<strong>в</strong>ляется <strong>в</strong>ложенным, то данный элемент нотацииотсутст<strong>в</strong>ует.


283. А<strong>в</strong>томат. На схеме с<strong>в</strong>язей а<strong>в</strong>томат усло<strong>в</strong>нообозначается прямоугольником, <strong>в</strong> <strong>в</strong>ерху которого при<strong>в</strong>еденообозначение а<strong>в</strong>томата. Ширина прямоугольника <strong>в</strong>ыбираетсятаким образом, чтобы <strong>в</strong>нутри него с<strong>в</strong>ободно помещалисьобозначения <strong>в</strong>ходных и <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий.4. Перечисление обозначений а<strong>в</strong>томато<strong>в</strong>, <strong>в</strong>ложенных <strong>в</strong>рассматри<strong>в</strong>аемый. Если рассматри<strong>в</strong>аемый а<strong>в</strong>томат не содержит<strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>, то данный элемент нотацииотсутст<strong>в</strong>ует.5. Обозначение а<strong>в</strong>томата, располагается <strong>в</strong> пра<strong>в</strong>ом<strong>в</strong>ерхнем углу листа на одном уро<strong>в</strong>не с наз<strong>в</strong>анием документа.6. Входная переменная. Перечисление <strong>в</strong>ходныхпеременных <strong>в</strong>ыполняется <strong>в</strong> ле<strong>в</strong>ой <strong>в</strong>ерхней части схемыс<strong>в</strong>язей. Для каждой <strong>в</strong>ходной переменной указы<strong>в</strong>ается ееисточник, соединенный горизонтальной линией спрямоугольником, обозначающим а<strong>в</strong>томат. Над этой линиейзаписы<strong>в</strong>ается полное наз<strong>в</strong>ание <strong>в</strong>ходной переменной, а <strong>в</strong>нутрипрямоугольника, обозначающего а<strong>в</strong>томат, <strong>в</strong> месте егосоединения с линией — обозначение <strong>в</strong>ходной переменной.7. Опрос переменной состояния другого а<strong>в</strong>томата. Если<strong>в</strong> усло<strong>в</strong>иях переходо<strong>в</strong> а<strong>в</strong>томата присутст<strong>в</strong>ует предикат,про<strong>в</strong>еряющей значение переменной состояния другогоа<strong>в</strong>томата, то на схеме с<strong>в</strong>язей это отображается по аналогиис <strong>в</strong>ходной переменной, после перечисления <strong>в</strong>ходныхпеременных. Указы<strong>в</strong>ается обозначение и наз<strong>в</strong>ание а<strong>в</strong>томата,переменная состояния которого опраши<strong>в</strong>ается, надсоединительной линией указы<strong>в</strong>ается смысло<strong>в</strong>ое значениепредиката, а <strong>в</strong>нутри обозначающего а<strong>в</strong>томат прямоугольника— сам предикат.8. События. Обработчики событий указы<strong>в</strong>аются обобщенно<strong>в</strong> ле<strong>в</strong>ой нижней части схемы с<strong>в</strong>язей. Для каждого событиярисуется линия, соединяющая усло<strong>в</strong>ное обозначение


29обработчико<strong>в</strong> событий с усло<strong>в</strong>ным обозначением а<strong>в</strong>томата.Над этой линией записы<strong>в</strong>ается наз<strong>в</strong>ание события, а <strong>в</strong>нутрипрямоугольника, обозначающего а<strong>в</strong>томат, <strong>в</strong> месте егосоединения с линией — обозначение события.9. Обобщенное обозначение <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий. Вобщем случае <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия обозначаются сиспользо<strong>в</strong>анием сим<strong>в</strong>ола "Подпрограмма", <strong>в</strong>нутри которогозаписы<strong>в</strong>ается наз<strong>в</strong>ание этого <strong>в</strong>ыходного <strong>в</strong>оздейст<strong>в</strong>ия. Этотсим<strong>в</strong>ол соединяется линией с прямоугольником, обозначающима<strong>в</strong>томат, <strong>в</strong>нутри которого записы<strong>в</strong>ается обозначение<strong>в</strong>ыходного <strong>в</strong>оздейст<strong>в</strong>ия.10. Выходные <strong>в</strong>оздейст<strong>в</strong>ия, с<strong>в</strong>язанные с некоторымобъектом упра<strong>в</strong>ления. Если с<strong>в</strong>язь <strong>в</strong>ыходного <strong>в</strong>оздейст<strong>в</strong>ия снекоторым объектом упра<strong>в</strong>ления может быть легкопроиллюстриро<strong>в</strong>ана, то записы<strong>в</strong>ается наз<strong>в</strong>ание этогообъекта, а полное наз<strong>в</strong>ание <strong>в</strong>ыходного <strong>в</strong>оздейст<strong>в</strong>ияпереносится на соединительную линию.11. Выходные <strong>в</strong>оздейст<strong>в</strong>ия, <strong>в</strong>ызы<strong>в</strong>ающие а<strong>в</strong>томат. Если из<strong>в</strong>ыходного <strong>в</strong>оздейст<strong>в</strong>ия осущест<strong>в</strong>ляется <strong>в</strong>ызо<strong>в</strong> а<strong>в</strong>томата, тоуказы<strong>в</strong>аются обозначение и наз<strong>в</strong>ание этого а<strong>в</strong>томата, апосле наз<strong>в</strong>ания <strong>в</strong>ыходного <strong>в</strong>оздейст<strong>в</strong>ия указы<strong>в</strong>ается событие,с которым <strong>в</strong>ызы<strong>в</strong>ается а<strong>в</strong>томат. Как следст<strong>в</strong>ие изложенногоотметим, что а<strong>в</strong>томаты могут <strong>в</strong>ызы<strong>в</strong>аться не только изсостояний, но также с дуг и петель.12. Выходные <strong>в</strong>оздейст<strong>в</strong>ия, упра<strong>в</strong>ляющие таймерами. Для<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий, упра<strong>в</strong>ляющих таймерами указы<strong>в</strong>аютсяобозначение и наз<strong>в</strong>ание таймера. При этом номера таймера,<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий, упра<strong>в</strong>ляющих им, и порождаемого имсобытия должны со<strong>в</strong>падать.13. Обратная с<strong>в</strong>язь. Во <strong>в</strong>сех случаях, когда этопоз<strong>в</strong>оляет размер схемы с<strong>в</strong>язей, на ней должны быть указаныобратные с<strong>в</strong>язи от объекто<strong>в</strong> упра<strong>в</strong>ления ко <strong>в</strong>ходам а<strong>в</strong>томата.


2.2. Нотация графо<strong>в</strong> переходо<strong>в</strong>30При построении графо<strong>в</strong> переходо<strong>в</strong> а<strong>в</strong>томата используетсянотация, содержащая при<strong>в</strong>еденные на рис. 9 обозначения.1. Наз<strong>в</strong>аниедокумента2. Состояние3. Номер иназ<strong>в</strong>аниесостояния4. Усло<strong>в</strong>иеперехода с i-мприоритетом5. Обозначениеа<strong>в</strong>томата6. Обобщение<strong>в</strong>ходящих <strong>в</strong><strong>в</strong>ершину дугА<strong>в</strong>томат упра<strong>в</strong>ления клапаном подачи <strong>в</strong>оды. Граф переходо<strong>в</strong>A10C10_0 = x10 ⋅ (x20 ∨ e120 ⋅ (y5 = 3))10. Произ<strong>в</strong>ольнаялогическаяформула7. Группо<strong>в</strong>ойпереход0. Клапан закрытi : e9011. Дуга,обозначающаяпереходC10_08. Усло<strong>в</strong>иеперехода пособытиюакти<strong>в</strong>ации9. Группасостоянийe0 e203. Клапан не откры<strong>в</strong>аетсяz: 30_4; 40y1 = 21. Открыть клапанA1; A2; A3z100C10_0z30_0z20_12. Подача <strong>в</strong>одыz:e10060;7012. Усло<strong>в</strong>иеперехода попроиз<strong>в</strong>ольнойлогической формуле13. Усло<strong>в</strong>иеперехода иперечисление<strong>в</strong>ыполняемыхпоследо<strong>в</strong>ательнодейст<strong>в</strong>ий на петле14. Перечислениедейст<strong>в</strong>ий,<strong>в</strong>ыполняемых <strong>в</strong>состоянии15. Усло<strong>в</strong>ие переходапо номеру состояниядругого а<strong>в</strong>томата16. Перечисление<strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>17. Усло<strong>в</strong>иеперехода идейст<strong>в</strong>ия на дуге18. Петля (можетбыть группо<strong>в</strong>ой)Рис. 9. Нотация, применяемая <strong>в</strong> графах переходо<strong>в</strong> а<strong>в</strong>томато<strong>в</strong>В рассматри<strong>в</strong>аемой нотации используются перечисленныениже обозначения.1. Наз<strong>в</strong>ание документа. Наз<strong>в</strong>ание документарасполагается посередине <strong>в</strong> <strong>в</strong>ерхней части листа и содержитполное наз<strong>в</strong>ание а<strong>в</strong>томата и наз<strong>в</strong>ание собст<strong>в</strong>енно документа— "Граф переходо<strong>в</strong>".2. Состояние. Состояние а<strong>в</strong>томата (<strong>в</strong>ершина графапереходо<strong>в</strong>) обозначается прямоугольником с закругленнымиуглами с типо<strong>в</strong>ым соотношением ширины к <strong>в</strong>ысоте 2:1,разделенным на три горизонтальные области одинако<strong>в</strong>ой<strong>в</strong>ысоты.


313. Номер и наз<strong>в</strong>ание состояния. Верхняя область<strong>в</strong>ершины графа переходо<strong>в</strong> содержит номер состояния а<strong>в</strong>томатаи, через точку, краткое наз<strong>в</strong>ание этого состояния.4. Усло<strong>в</strong>ие перехода с i-м приоритетом. Усло<strong>в</strong>ияпереходо<strong>в</strong> могут пред<strong>в</strong>аряться номером приоритета этогоперехода, отделенного д<strong>в</strong>оеточием. Усло<strong>в</strong>ия переходо<strong>в</strong>записы<strong>в</strong>аются ближе к началу дуги, которую помечают, такимобразом, чтобы исключить неоднозначное толко<strong>в</strong>аниепринадлежности к той или иной дуге.5. Обозначение а<strong>в</strong>томата, располагается <strong>в</strong> <strong>в</strong>ерхнемпра<strong>в</strong>ом углу листа на одном уро<strong>в</strong>не с наз<strong>в</strong>анием документа.6. Обобщение <strong>в</strong>ходящих <strong>в</strong> <strong>в</strong>ершину дуг. Входящие <strong>в</strong><strong>в</strong>ершину дуги могут быть объединены <strong>в</strong> единую линию дляболее компактного их отображения.7. Группо<strong>в</strong>ой переход. Переход, общий для группысостояний, назы<strong>в</strong>ается группо<strong>в</strong>ым. Петли также могут бытьгруппо<strong>в</strong>ыми.8. Усло<strong>в</strong>ие перехода по событию акти<strong>в</strong>ации. Событиеакти<strong>в</strong>ации, получаемое а<strong>в</strong>томатом от с<strong>в</strong>оего голо<strong>в</strong>ногоа<strong>в</strong>томата имеет сокращенное наз<strong>в</strong>ание e0.9. Группа состояний. Состояния, имеющие общиепереходы, могут быть объединены <strong>в</strong> группы для болеекомпактного отображения этих переходо<strong>в</strong>.10. Произ<strong>в</strong>ольная логическая формула. Если некотораялогическая формула по<strong>в</strong>торяется <strong>в</strong> усло<strong>в</strong>иях переходо<strong>в</strong>а<strong>в</strong>томата несколько раз или слишком длинна, она может бытьзаписана <strong>в</strong>не графа переходо<strong>в</strong> на том же листе и обозначенаидентификатором, начинающимся с бук<strong>в</strong>ы 'C', после которойследует номер а<strong>в</strong>томата и порядко<strong>в</strong>ый номер формулы.11. Дуга, обозначающая переход. Переходы а<strong>в</strong>томатаобозначаются <strong>в</strong> графе переходо<strong>в</strong> дугами, соединяющимисоот<strong>в</strong>етст<strong>в</strong>ующие <strong>в</strong>ершины.


3212. Усло<strong>в</strong>ие перехода по произ<strong>в</strong>ольной логическойформуле. Идентификаторы, обозначающие <strong>в</strong>ынесенные иза<strong>в</strong>томата произ<strong>в</strong>ольные логические формулы, используются <strong>в</strong>усло<strong>в</strong>иях переходо<strong>в</strong> также, как и другие <strong>в</strong>ходные<strong>в</strong>оздейст<strong>в</strong>ия.13. Усло<strong>в</strong>ие перехода и перечисление <strong>в</strong>ыполняемыхпоследо<strong>в</strong>ательно дейст<strong>в</strong>ий на петле. Петли, как и дуги,могут помечаться приоритетами, усло<strong>в</strong>иями перехода идейст<strong>в</strong>иями, <strong>в</strong>ыполняемыми при переходе. Так как припереходе по петле а<strong>в</strong>томат сохраняет с<strong>в</strong>ое состояние, топетли используются для обозначения дейст<strong>в</strong>ий, <strong>в</strong>ыполняемых<strong>в</strong> состоянии при некоторых усло<strong>в</strong>иях.14. Перечисление дейст<strong>в</strong>ий, <strong>в</strong>ыполняемых <strong>в</strong> состоянии.Нижняя область <strong>в</strong>ершины графа переходо<strong>в</strong> может содержатьперечисление <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий, <strong>в</strong>ыполняемых <strong>в</strong>соот<strong>в</strong>етст<strong>в</strong>ующем состоянии. В случае, если <strong>в</strong> состоянии<strong>в</strong>ыполняется одно единст<strong>в</strong>енное <strong>в</strong>ыходное <strong>в</strong>оздейст<strong>в</strong>ие,записы<strong>в</strong>ается его сокращенное наз<strong>в</strong>ание (например, "z100").В случае, когда <strong>в</strong> состоянии <strong>в</strong>ыполняется несколько<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий, сим<strong>в</strong>ол 'z' записы<strong>в</strong>ается только одинраз, а после него ста<strong>в</strong>ится д<strong>в</strong>оеточие и перечисляютсяразделенные точкой с запятой номера <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий(например, "z: 30_4; 40").15. Усло<strong>в</strong>ие перехода по номеру состояния другогоа<strong>в</strong>томата. В усло<strong>в</strong>иях переходо<strong>в</strong> а<strong>в</strong>томата можетприсутст<strong>в</strong>о<strong>в</strong>ать предикат, про<strong>в</strong>еряющий значение переменнойсостояния другого а<strong>в</strong>томата.16. Перечисление <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>. Средняя область<strong>в</strong>ершины графа переходо<strong>в</strong> может содержать перечислениеа<strong>в</strong>томато<strong>в</strong>, <strong>в</strong>ложенных <strong>в</strong> это состояние. Если <strong>в</strong> состояние<strong>в</strong>ложено более одного а<strong>в</strong>томата, то при перечислении


33сокращенные наз<strong>в</strong>ания а<strong>в</strong>томато<strong>в</strong> разделяются точкой сзапятой.17. Усло<strong>в</strong>ие перехода и дейст<strong>в</strong>ия на дуге. Кромеприоритето<strong>в</strong> и собст<strong>в</strong>енно усло<strong>в</strong>ий переходо<strong>в</strong> дуги могуттакже помечаться перечислением <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий,<strong>в</strong>ыполняемых при переходе. В этом случае <strong>в</strong>ыходные<strong>в</strong>оздейст<strong>в</strong>ия записы<strong>в</strong>аются под усло<strong>в</strong>ием перехода иотделяются от него горизонтальной линией. Выходные<strong>в</strong>оздейст<strong>в</strong>ия перечисляются также, как и <strong>в</strong> <strong>в</strong>ершинах графапереходо<strong>в</strong>.18. Петля. Сохранение а<strong>в</strong>томатом с<strong>в</strong>оего состояния награфе переходо<strong>в</strong> обозначается петлями, напра<strong>в</strong>ленными почасо<strong>в</strong>ой стрелке. Состояния а<strong>в</strong>томата предполагаютсяустойчи<strong>в</strong>ыми, поэтому петли, не содержащие <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ий, умалчи<strong>в</strong>аются. Петли могут быть группо<strong>в</strong>ыми.


34На рис. 10 нотация, применяемая <strong>в</strong> графах переходо<strong>в</strong>при описании состояний, рассматри<strong>в</strong>ается более подробно.1. Состояние2. Номерсостояния3. Наз<strong>в</strong>аниесостояния4. Обобщениенескольких петель5. Областьназ<strong>в</strong>ания6. Областьперечисления<strong>в</strong>ложенныха<strong>в</strong>томато<strong>в</strong>7. Областьперечисления<strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ий8. Пометка"иначе"0. Клапан закрытA1; A2; A3z: 10; 20_1; 30_0иначе1: e110⋅z500_2⋅x70e110⋅x80z:500_0;240e110 x80z:500_0;51;2409. Исходящая дугаe1010. Входящая дугаРис. 10. Нотация, используемая <strong>в</strong> графах переходо<strong>в</strong>а<strong>в</strong>томато<strong>в</strong> при описании <strong>в</strong>ершинВ рассматри<strong>в</strong>аемой нотации используются перечисленныениже обозначения.1. Состояние. При необходимости <strong>в</strong>ысотапрямоугольника, обозначающего <strong>в</strong>ершину графа переходо<strong>в</strong>может быть у<strong>в</strong>еличена.2. Номер состояния. В качест<strong>в</strong>е номеро<strong>в</strong> состоянийприменяются целые числа. При этом должна обеспечи<strong>в</strong>атьсяуникальность номеро<strong>в</strong> <strong>в</strong>нутри одного графа переходо<strong>в</strong>.Нумерация (кодиро<strong>в</strong>ание) состояний начинается с нуля(нуле<strong>в</strong>ой номер прис<strong>в</strong>аи<strong>в</strong>ается начальному состоянию) идалее, по <strong>в</strong>оз<strong>можно</strong>сти без пропуско<strong>в</strong>. Для отображенияномера состояния используется тот же шрифт, что и дляотображения наз<strong>в</strong>ания состояния.


353. Наз<strong>в</strong>ание состояния. Наз<strong>в</strong>ание состояния можетопределяться состоянием объекта упра<strong>в</strong>ления и, по<strong>в</strong>оз<strong>можно</strong>сти, должно быть кратким.4. Обобщение нескольких петель. Если у <strong>в</strong>ершины графапереходо<strong>в</strong> имеется несколько петель, пометки этих петельмогут быть записаны обобщенно для большей компактности.5. Область наз<strong>в</strong>ания. Краткое наз<strong>в</strong>ание состояниязаписы<strong>в</strong>ается после номера состояния с использо<strong>в</strong>аниемпропорционального шрифта. При необходимости размериспользуемого шрифта может меняться. Если применяетсяслишком длинные наз<strong>в</strong>ания состояний, то они могут бытьзаписаны <strong>в</strong> несколько строк, при этом <strong>в</strong>ысота областиназ<strong>в</strong>ания соот<strong>в</strong>етст<strong>в</strong>ующим образом у<strong>в</strong>еличи<strong>в</strong>ается.6. Область перечисления <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>.Обозначения <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong> перечисляются через точкус запятой с использо<strong>в</strong>анием пропорционального шрифта. Принеобходимости размер используемого шрифта может меняться,а <strong>в</strong>ысота области может у<strong>в</strong>еличи<strong>в</strong>аться.7. Область перечисления <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий.Выходные <strong>в</strong>оздейст<strong>в</strong>ия записы<strong>в</strong>аются с использо<strong>в</strong>аниемпропорционального шрифта. При необходимости размериспользуемого шрифта может меняться, а <strong>в</strong>ысота области —у<strong>в</strong>еличи<strong>в</strong>аться.8. Пометка "иначе". Некоторые дуги на графахпереходо<strong>в</strong> могут помечаться сло<strong>в</strong>ом "иначе". Это означает,что указанный переход <strong>в</strong>ыполняется <strong>в</strong> случае, если не<strong>в</strong>ыполнились <strong>в</strong>се остальные усло<strong>в</strong>ия переходо<strong>в</strong> на <strong>в</strong>сехисходящих дугах и петлях рассматри<strong>в</strong>аемой <strong>в</strong>ершины. Усло<strong>в</strong>ие"иначе" не может иметь приоритета и не может помечатьгруппо<strong>в</strong>ые дуги и петли.


369. Исходящая дуга. Дуга, обозначающая переход израссматри<strong>в</strong>аемого состояния <strong>в</strong> какое-либо другое, я<strong>в</strong>ляетсядля соот<strong>в</strong>етст<strong>в</strong>ующей <strong>в</strong>ершины исходящей.10. Входящая дуга. Дуга, обозначающая переход изкакого-либо другого состояния <strong>в</strong> рассматри<strong>в</strong>аемое, я<strong>в</strong>ляетсядля соот<strong>в</strong>етст<strong>в</strong>ующей <strong>в</strong>ершины <strong>в</strong>ходящей.2.3. Нотация схемы <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>А<strong>в</strong>томаты могут <strong>в</strong>заимодейст<strong>в</strong>о<strong>в</strong>ать между собой за счетобмена номерами состояний, <strong>в</strong>ложенности и <strong>в</strong>ызы<strong>в</strong>аемости.Они также могут быть одно<strong>в</strong>ременно <strong>в</strong>ложенными и<strong>в</strong>ызы<strong>в</strong>аемыми.Указанные <strong>в</strong>иды <strong>в</strong>заимодейст<strong>в</strong>ия формализуются с помощьюсхемы <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>, нотация для построениякоторой при<strong>в</strong>едена на рис. 11.1. Наз<strong>в</strong>аниедокумента2. Обобщенноеизображениеобработчико<strong>в</strong>событий3. Вызо<strong>в</strong> а<strong>в</strong>томата изобработчико<strong>в</strong>событийСистема упра<strong>в</strong>ления дизель-генератором.Схема <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>ОбработчикисобытийA0А<strong>в</strong>томат<strong>в</strong>ключенияотключения6. Обозначениеа<strong>в</strong>томата7. Переченьа<strong>в</strong>томато<strong>в</strong>,переменныесостояния которыхопраши<strong>в</strong>аются израссматри<strong>в</strong>аемогоа<strong>в</strong>томата4. А<strong>в</strong>томат5. ВложенностьA1А<strong>в</strong>томатпредпуско<strong>в</strong>ыхоперацийА<strong>в</strong>томат остано<strong>в</strong>аA38. Переченьа<strong>в</strong>томато<strong>в</strong>, которыеопраши<strong>в</strong>аютпеременнуюсостояниярассматри<strong>в</strong>аемогоа<strong>в</strong>томатаA15, A3, A4, A7 A4A5, A60, A80A0, A1, A2, A9A5, A60, A61, A809. Перечень<strong>в</strong>ызы<strong>в</strong>аемыха<strong>в</strong>томато<strong>в</strong>Рис. 11. Нотация схемы <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>


371. Наз<strong>в</strong>ание документа. Наз<strong>в</strong>ание документарасполагается посередине <strong>в</strong> <strong>в</strong>ерхней части листа и содержитназ<strong>в</strong>ание разрабаты<strong>в</strong>аемой системы и наз<strong>в</strong>ание собст<strong>в</strong>еннодокумента — "Схема <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>".2. Обобщенное изображение обработчико<strong>в</strong> событий. В<strong>в</strong>ерхней части схемы обобщенно изображаются обработчикисобытий, <strong>в</strong>ызы<strong>в</strong>ающие а<strong>в</strong>томаты.3. Вызо<strong>в</strong> а<strong>в</strong>томата из обработчико<strong>в</strong> событий. Вызо<strong>в</strong>а<strong>в</strong>томато<strong>в</strong> непосредст<strong>в</strong>енно из обработчико<strong>в</strong> событийобозначается пунктирной линией со стрелкой.4. А<strong>в</strong>томат. А<strong>в</strong>томаты на схеме <strong>в</strong>заимодейст<strong>в</strong>ияа<strong>в</strong>томато<strong>в</strong> обозначаются прямоугольниками, содержащиминаз<strong>в</strong>ание и обозначение а<strong>в</strong>томата. В примыкающих снизупрямоугольниках, могут указы<strong>в</strong>аться перечни а<strong>в</strong>томато<strong>в</strong>,<strong>в</strong>заимодейст<strong>в</strong>ующих с рассматри<strong>в</strong>аемым по обмену номерамисостояний и по <strong>в</strong>ызы<strong>в</strong>аемости.5. Вложенность. Вложенность обозначается линией,заканчи<strong>в</strong>ающейся ромбом, по аналогии с обозначением<strong>в</strong>ложенности на диаграммах классо<strong>в</strong> [5].6. Обозначение а<strong>в</strong>томата. Обозначение а<strong>в</strong>томатауказы<strong>в</strong>ается <strong>в</strong> пра<strong>в</strong>ом <strong>в</strong>ерхнем углу соот<strong>в</strong>етст<strong>в</strong>ующегопрямоугольника.7. Перечень а<strong>в</strong>томато<strong>в</strong>, переменные состояния которыхопраши<strong>в</strong>аются из рассматри<strong>в</strong>аемого а<strong>в</strong>томата, указы<strong>в</strong>ается <strong>в</strong>прямоугольнике сразу после прямоугольника, егообозначающего.8. Перечень а<strong>в</strong>томато<strong>в</strong>, которые опраши<strong>в</strong>ают переменнуюсостояния рассматри<strong>в</strong>аемого а<strong>в</strong>томата, указы<strong>в</strong>ается <strong>в</strong>следующем прямоугольнике.9. Перечень <strong>в</strong>ызы<strong>в</strong>аемых а<strong>в</strong>томато<strong>в</strong>. Для отражения<strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong> по <strong>в</strong>ызы<strong>в</strong>аемости, <strong>в</strong> третьем из


38прямоугольнико<strong>в</strong> перечисляются а<strong>в</strong>томаты, <strong>в</strong>ызы<strong>в</strong>аемые израссматри<strong>в</strong>аемого.2.4. Модель а<strong>в</strong>томата2.4.1. Запуск а<strong>в</strong>томатаИсходя из того, что а<strong>в</strong>томат реализуется функцией(подпрограммой), под его запуском будем понимать <strong>в</strong>ызо<strong>в</strong>этой функции. Из этого определения следует, что переходыи <strong>в</strong>ыдача <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий <strong>в</strong> а<strong>в</strong>томате происходяттолько при <strong>в</strong>ыполнении реализующей его функции.Для обеспечения реакции а<strong>в</strong>томата на <strong>в</strong>ходные<strong>в</strong>оздейст<strong>в</strong>ия будем запускать его при <strong>в</strong>озникно<strong>в</strong>ении любогособытия, используемого <strong>в</strong> а<strong>в</strong>томате. Запуск а<strong>в</strong>томата припоступлении события e будем назы<strong>в</strong>ать "запуск а<strong>в</strong>томата ссобытием e" (например, "запуск а<strong>в</strong>томата с событиемнажатия ле<strong>в</strong>ой кнопки мыши e10").События, используемые <strong>в</strong> а<strong>в</strong>томате, будем такженазы<strong>в</strong>ать "события, с которыми запускается а<strong>в</strong>томат".Отметим, что на схеме с<strong>в</strong>язей а<strong>в</strong>томата указы<strong>в</strong>аются <strong>в</strong>сесобытия, с которыми он запускается, <strong>в</strong>не за<strong>в</strong>исимости оттого, присутст<strong>в</strong>уют ли они <strong>в</strong> графе переходо<strong>в</strong> этогоа<strong>в</strong>томата.Каждому событию прис<strong>в</strong>аи<strong>в</strong>ается уникальный номер. Приэтом номер события, с которым запускается а<strong>в</strong>томат,передается <strong>в</strong> качест<strong>в</strong>е параметра функции, реализующейа<strong>в</strong>томат. В качест<strong>в</strong>е параметро<strong>в</strong> может переда<strong>в</strong>аться также идополнительная информация о событии.Вызо<strong>в</strong> реализующей а<strong>в</strong>томат функции <strong>в</strong>ыполняется изобработчико<strong>в</strong> событий, с которыми запускается а<strong>в</strong>томат. Поаналогии с логическим упра<strong>в</strong>лением при каждом запускеа<strong>в</strong>томат <strong>в</strong>ыполняет не более одного перехода, после чего


39реализующая его функция за<strong>в</strong>ершает с<strong>в</strong>ою работу —<strong>в</strong>оз<strong>в</strong>ращает упра<strong>в</strong>ление <strong>в</strong> <strong>в</strong>ыз<strong>в</strong>а<strong>в</strong>ший ее обработчик события.Из изложенного следует, что события обрабаты<strong>в</strong>аютсяа<strong>в</strong>томатом последо<strong>в</strong>ательно <strong>в</strong> порядке их поступления. Приэтом <strong>в</strong> некоторых реализациях может <strong>в</strong>озникнутьнеобходимость создания очереди событий для предот<strong>в</strong>ращенияих потери.2.4.2. Входные <strong>в</strong>оздейст<strong>в</strong>ия и переходыПосле запуска а<strong>в</strong>томат <strong>в</strong>ыполняет про<strong>в</strong>ерку усло<strong>в</strong>ийпереходо<strong>в</strong> из текущего состояния (начальным состояниемсчитается состояние с номером 0). В пер<strong>в</strong>ую очередь,про<strong>в</strong>еряются усло<strong>в</strong>ия переходо<strong>в</strong> на группо<strong>в</strong>ых исходящихдугах и группо<strong>в</strong>ых петлях <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии с <strong>в</strong>ыбраннымиприоритетами. После этого на осно<strong>в</strong>ании указанныхприоритето<strong>в</strong> про<strong>в</strong>еряются усло<strong>в</strong>ия переходо<strong>в</strong> на остальныхисходящих дугах и петлях. Усло<strong>в</strong>ия переходо<strong>в</strong> безприоритето<strong>в</strong> про<strong>в</strong>еряются <strong>в</strong> произ<strong>в</strong>ольном порядке.При про<strong>в</strong>ерке усло<strong>в</strong>ий переходо<strong>в</strong> определяются значения:− предикато<strong>в</strong>, про<strong>в</strong>еряющих номер произошедшегособытия;− предикато<strong>в</strong>, про<strong>в</strong>еряющих номера состояний другиха<strong>в</strong>томато<strong>в</strong>;− <strong>в</strong>ходных переменных.Если очередное про<strong>в</strong>еряемое усло<strong>в</strong>ие перехода истинно,дальнейшая про<strong>в</strong>ерка прекращается. А<strong>в</strong>томат <strong>в</strong>ыполняетуказанные на соот<strong>в</strong>етст<strong>в</strong>ующей дуге <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия(при их наличии) и переходит <strong>в</strong> но<strong>в</strong>ое состояние. Еслиистинно усло<strong>в</strong>ие перехода, указанное на петле, то<strong>в</strong>ыполняются указанные на ней <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия, асостояние а<strong>в</strong>томата сохраняется.Входные переменные реализуются функциями(подпрограммами). Опрос <strong>в</strong>ходных переменных заключается <strong>в</strong>


40<strong>в</strong>ызо<strong>в</strong>е указанных функций из функции, реализующей а<strong>в</strong>томат.После <strong>в</strong>ыполнения дейст<strong>в</strong>ий, <strong>в</strong> общем случае произ<strong>в</strong>ольных,реализующая <strong>в</strong>ходную переменную функция за<strong>в</strong>ершается,<strong>в</strong>оз<strong>в</strong>ращая д<strong>в</strong>оичный результат. Благодаря такой реализацииопраши<strong>в</strong>аются только те <strong>в</strong>ходные переменные, которыеучаст<strong>в</strong>уют <strong>в</strong> про<strong>в</strong>еряемых усло<strong>в</strong>иях переходо<strong>в</strong>, <strong>в</strong> отличие отконтроллеро<strong>в</strong>, где опрос <strong>в</strong>сех <strong>в</strong>ходных переменных<strong>в</strong>ыполняется циклически.После перехода <strong>в</strong> но<strong>в</strong>ое состояние а<strong>в</strong>томат <strong>в</strong>ыполняетуказанные <strong>в</strong> нем <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия.2.4.3. Выходные <strong>в</strong>оздейст<strong>в</strong>ияВыходные <strong>в</strong>оздейст<strong>в</strong>ия реализуются функциями(подпрограммами), <strong>в</strong>ыполняющими <strong>в</strong> общем случаепроиз<strong>в</strong>ольные дейст<strong>в</strong>ия. Эти <strong>в</strong>оздейст<strong>в</strong>ия могутформиро<strong>в</strong>аться на дугах, петлях и <strong>в</strong> <strong>в</strong>ершинах графапереходо<strong>в</strong>.Выходные <strong>в</strong>оздейст<strong>в</strong>ия на дуге формируются приистинности соот<strong>в</strong>етст<strong>в</strong>ующего ей усло<strong>в</strong>ия перехода, до того,как а<strong>в</strong>томат перейдет <strong>в</strong> но<strong>в</strong>ое состояние. Выходные<strong>в</strong>оздейст<strong>в</strong>ия на петле формируются аналогично, но безизменения состояния а<strong>в</strong>томата.Выходные <strong>в</strong>оздейст<strong>в</strong>ия <strong>в</strong> <strong>в</strong>ершине формируются послеперехода а<strong>в</strong>томата <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ующее состояние.2.4.4. Вложенные а<strong>в</strong>томатыВысказы<strong>в</strong>ание "а<strong>в</strong>томат A1 <strong>в</strong>ложен <strong>в</strong> а<strong>в</strong>томат A0"означает, что а<strong>в</strong>томат A1 <strong>в</strong>ложен <strong>в</strong> одно или несколькосостояний а<strong>в</strong>томата A0. При этом,− а<strong>в</strong>томат A0 я<strong>в</strong>ляется голо<strong>в</strong>ным, а а<strong>в</strong>томат A1<strong>в</strong>ложенным;


41− если при запуске а<strong>в</strong>томат A0 находится <strong>в</strong> состоянии,<strong>в</strong> которое <strong>в</strong>ложен а<strong>в</strong>томат A1, то последний запускается стем же событием, с которым был запущен а<strong>в</strong>томат A0;− при переходе а<strong>в</strong>томата A0 <strong>в</strong> состояние, <strong>в</strong> которое<strong>в</strong>ложен а<strong>в</strong>томат A1, последний запускается с событиемакти<strong>в</strong>ации e0.Продолжая для краткости обозначать голо<strong>в</strong>ной а<strong>в</strong>томаткак A0, а <strong>в</strong>ложенный как A1, рассмотрим различные <strong>в</strong>арианты<strong>в</strong>ложенности.1. Вложенность <strong>в</strong> одно состояние. Пусть а<strong>в</strong>томат A1<strong>в</strong>ложен <strong>в</strong> одно из состояний а<strong>в</strong>томата A0. Это означает, чтоа<strong>в</strong>томат A1 запускается, <strong>в</strong>о-пер<strong>в</strong>ых, когда а<strong>в</strong>томат A0 призапуске находится <strong>в</strong> том состоянии, <strong>в</strong> которое <strong>в</strong>ложена<strong>в</strong>томат A1, а <strong>в</strong>о-<strong>в</strong>торых, при переходе а<strong>в</strong>томата A0 <strong>в</strong> этосостояние. При этом а<strong>в</strong>томат A1 детализирует по<strong>в</strong>едениесистемы <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ующем состоянии а<strong>в</strong>томата A0.2. Вложенность <strong>в</strong> несколько состояний. Пусть а<strong>в</strong>томатA1 <strong>в</strong>ложен <strong>в</strong> несколько состояний а<strong>в</strong>томата A0. Такой<strong>в</strong>ариант <strong>в</strong>ложенности может рассматри<strong>в</strong>аться как случай<strong>в</strong>заимодейст<strong>в</strong>ия параллельных процессо<strong>в</strong>, <strong>в</strong> котором процесс,определяемый а<strong>в</strong>томатом A1, <strong>в</strong>ыполняется только тогда,когда процесс, определяемый а<strong>в</strong>томатом A0, находится <strong>в</strong>одном из состояний, <strong>в</strong> которые <strong>в</strong>ложен а<strong>в</strong>томат A1.3. Вложенность <strong>в</strong>о <strong>в</strong>се состояния. Пусть а<strong>в</strong>томат A1<strong>в</strong>ложен <strong>в</strong>о <strong>в</strong>се состояния а<strong>в</strong>томата A0. Такую суперпозицию<strong>можно</strong> применять <strong>в</strong> случае, когда необходимо <strong>в</strong>ызы<strong>в</strong>ать<strong>в</strong>ложенный а<strong>в</strong>томат каждый раз, когда голо<strong>в</strong>ной а<strong>в</strong>томатизменяет с<strong>в</strong>ое состояние. При этом, при любом изменениисостояния а<strong>в</strong>томата A0, а<strong>в</strong>томат A1 будет <strong>в</strong>ызы<strong>в</strong>аться ссобытием акти<strong>в</strong>ации e0. Если такая необходимостьотсутст<strong>в</strong>ует, то это означает, что а<strong>в</strong>томат A1 не<strong>в</strong>заимодейст<strong>в</strong>ует по <strong>в</strong>ложенности с а<strong>в</strong>томатом A0 и должен


42быть расположен на одном уро<strong>в</strong>не <strong>в</strong>ложенности с а<strong>в</strong>томатомA0.Отметим, что <strong>в</strong>ложенный а<strong>в</strong>томат A1 может бытьпреобразо<strong>в</strong>ан <strong>в</strong> а<strong>в</strong>томат, расположенный на одном уро<strong>в</strong>не<strong>в</strong>ложенности с а<strong>в</strong>томатом A0. Это достигаетсясоот<strong>в</strong>етст<strong>в</strong>ующими преобразо<strong>в</strong>аниями усло<strong>в</strong>ий переходо<strong>в</strong>а<strong>в</strong>томата A1, блокирующими какие-либо переходы приопределенных состояниях а<strong>в</strong>томата A0. В случае, если <strong>в</strong>сепреобразо<strong>в</strong>ания были <strong>в</strong>ыполнены пра<strong>в</strong>ильно, полученные <strong>в</strong>результате д<strong>в</strong>а а<strong>в</strong>томата будут работать также, как иисходные, но при этом значительно у<strong>в</strong>еличится количест<strong>в</strong>озапуско<strong>в</strong> а<strong>в</strong>томата A1.Обобщим особенности реализации <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>.При запуске а<strong>в</strong>томата с некоторым событием, передпро<strong>в</strong>еркой усло<strong>в</strong>ий переходо<strong>в</strong>, <strong>в</strong>се <strong>в</strong>ложенные <strong>в</strong> текущеесостояние а<strong>в</strong>томаты последо<strong>в</strong>ательно запускаются с тем жесобытием. В случае многоуро<strong>в</strong>не<strong>в</strong>ой <strong>в</strong>ложенности, порядокзапуска а<strong>в</strong>томато<strong>в</strong> определяется их текущими состояниями —путем <strong>в</strong> схеме <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>. При этомпоследо<strong>в</strong>ательность запуска и за<strong>в</strong>ершения работы а<strong>в</strong>томато<strong>в</strong>напоминает алгоритм поиска <strong>в</strong> глубину [6].Отметим, что при переходе а<strong>в</strong>томата <strong>в</strong> состояние,содержащее <strong>в</strong>ложенные а<strong>в</strong>томаты, перед формиро<strong>в</strong>анием<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий <strong>в</strong> этом состоянии, <strong>в</strong>ложенные а<strong>в</strong>томатыпоследо<strong>в</strong>ательно <strong>в</strong>ызы<strong>в</strong>аются с событием акти<strong>в</strong>ации e0,которое также как и другие события распространяется<strong>в</strong>глубь иерархии <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>.


3. Создание программного обеспечения событийных систем433.1. Предлагаемая технологияПредлагаемая технология характеризуется следующимиособенностями:− применяется процедурный (императи<strong>в</strong>ный) подход кразработке программ;− <strong>в</strong> качест<strong>в</strong>е базо<strong>в</strong>ого используется понятие "а<strong>в</strong>томат",а не "класс", "объект", "алгоритм" или "агент", как этоимеет место при других подходах. В отличие от объектногомоделиро<strong>в</strong>ания [5] построение <strong>в</strong>сех осно<strong>в</strong>ных моделейосно<strong>в</strong>ано на применении только а<strong>в</strong>томатной терминологии.При этом используется динамическая модель только одноготипа — система <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong>. Применениетакой динамической модели поз<strong>в</strong>оляет эффекти<strong>в</strong>но описы<strong>в</strong>атьи реализо<strong>в</strong>ы<strong>в</strong>ать задачи рассматри<strong>в</strong>аемого класса даже прибольшой их размерности. Применение графо<strong>в</strong> переходо<strong>в</strong> <strong>в</strong>качест<strong>в</strong>е языка спецификаций алгоритмо<strong>в</strong> делает обозримымдаже <strong>в</strong>есьма сложное по<strong>в</strong>едение программы и поз<strong>в</strong>оляет легко<strong>в</strong>носить изменения как <strong>в</strong> спецификацию, так и <strong>в</strong> еереализацию;− <strong>в</strong> общем случае а<strong>в</strong>томаты рассматри<strong>в</strong>аются неизолиро<strong>в</strong>анно, а как соста<strong>в</strong>ные части <strong>в</strong>заимос<strong>в</strong>язаннойсистемы — системы <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong>, по<strong>в</strong>едениекоторой формализуется с помощью системы <strong>в</strong>заимос<strong>в</strong>язанныхграфо<strong>в</strong> переходо<strong>в</strong>;− <strong>в</strong> качест<strong>в</strong>е осно<strong>в</strong>ной применяется модель смешанногоа<strong>в</strong>томата, для описания по<strong>в</strong>едения которого используетсясоот<strong>в</strong>етст<strong>в</strong>ующий граф переходо<strong>в</strong>, содержащий только"простые" состояния;


44− расширена, по сра<strong>в</strong>нению с [1], нотация, применяемаяпри построении схем с<strong>в</strong>язей и графо<strong>в</strong> переходо<strong>в</strong> (рис.8-11).3.1.1. Изучение предметной областиНа осно<strong>в</strong>е технического задания, которое приа<strong>в</strong>томатизации технологических процессо<strong>в</strong> обычно <strong>в</strong>ыдаетсяЗаказчиком <strong>в</strong> сло<strong>в</strong>есной форме <strong>в</strong> <strong>в</strong>иде со<strong>в</strong>окупностисценарие<strong>в</strong> и случае<strong>в</strong> использо<strong>в</strong>ания [5], строитсяструктурная схема системы, поз<strong>в</strong>оляющая получить общеепредста<strong>в</strong>ление об организации упра<strong>в</strong>ления, применяемойаппаратуре и интерфейсе объекта упра<strong>в</strong>ления.3.1.2. Проектиро<strong>в</strong>аниеПеречислим осно<strong>в</strong>ные стадии процесса проектиро<strong>в</strong>ания.1. Выделяются соста<strong>в</strong>ные части алгоритма упра<strong>в</strong>ления,каждая из которых реализуется а<strong>в</strong>томатом (например,а<strong>в</strong>томат упра<strong>в</strong>ления насосом или а<strong>в</strong>томат контролятемпературы). Соста<strong>в</strong>ляется перечень а<strong>в</strong>томато<strong>в</strong>.2. Строится схема <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>.3. Состояния каждого а<strong>в</strong>томата пер<strong>в</strong>оначальноопределяются по <strong>в</strong>ыделенным состояниям объекта упра<strong>в</strong>ления<strong>в</strong> целом или его части, а при большом их количест<strong>в</strong>е — поалгоритму упра<strong>в</strong>ления, построенному <strong>в</strong> <strong>в</strong>иде схемы алгоритма[7]. В а<strong>в</strong>томаты также могут быть <strong>в</strong><strong>в</strong>едены и другиесостояния, с<strong>в</strong>язанные, например, с непра<strong>в</strong>ильнымидейст<strong>в</strong>иями Оператора. Каждый а<strong>в</strong>томат при необходимостидекомпозируется. Процесс <strong>в</strong>ыделения состояний за<strong>в</strong>ершаетсясозданием перечня состояний для каждого а<strong>в</strong>томата.4. В отличие от традиционного программиро<strong>в</strong>ания<strong>в</strong><strong>в</strong>одится подэтап — кодиро<strong>в</strong>ание состояний а<strong>в</strong>томата. Приэтом <strong>в</strong> каждом а<strong>в</strong>томате его состояниям прис<strong>в</strong>аи<strong>в</strong>аютсядесятичные номера.


455. С<strong>в</strong>язи каждого а<strong>в</strong>томата с его "окружением"формализуются схемой с<strong>в</strong>язей а<strong>в</strong>томата, предназначенной дляполного описания его интерфейса. В этой схеме указы<strong>в</strong>аютсяисточники и приемники информации, полные наз<strong>в</strong>ания <strong>в</strong>сех<strong>в</strong>оздейст<strong>в</strong>ий и их обозначения, а также информация о том, <strong>в</strong>какой а<strong>в</strong>томат он <strong>в</strong>ложен и какие а<strong>в</strong>томаты <strong>в</strong>ложены <strong>в</strong> него.Входные <strong>в</strong>оздейст<strong>в</strong>ия, которые одно<strong>в</strong>ременно я<strong>в</strong>ляются исобытиями и <strong>в</strong>ходными переменными, целесообразнорассматри<strong>в</strong>ать как <strong>в</strong>ходные переменные. Отметим, чтонекоторые <strong>в</strong>ходные переменные могут формиро<strong>в</strong>аться <strong>в</strong>результате сра<strong>в</strong>нения <strong>в</strong>ходных аналого<strong>в</strong>ых сигнало<strong>в</strong> суста<strong>в</strong>ками.6. Строится граф переходо<strong>в</strong> каждого а<strong>в</strong>томата. При этомдуги и петли графо<strong>в</strong> переходо<strong>в</strong> помечаются произ<strong>в</strong>ольнымилогическими формулами, которые могут содержать <strong>в</strong>ходныепеременные и предикаты, про<strong>в</strong>еряющие номера состоянийдругих а<strong>в</strong>томато<strong>в</strong> и номера событий.Дуги, петли и <strong>в</strong>ершины могут содержать спискипоследо<strong>в</strong>ательно формируемых <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий.Вершины <strong>в</strong> графах переходо<strong>в</strong>, я<strong>в</strong>ляющиеся устойчи<strong>в</strong>ыми,содержат петли. Если на петле не формируются <strong>в</strong>ыходные<strong>в</strong>оздейст<strong>в</strong>ия, то она умалчи<strong>в</strong>ается. В проти<strong>в</strong>ном случаеизображаются одна или несколько петель.Каждый граф переходо<strong>в</strong> про<strong>в</strong>еряется на достижимость,непроти<strong>в</strong>оречи<strong>в</strong>ость, полноту и отсутст<strong>в</strong>ие генерирующихконтуро<strong>в</strong>.3.1.3. РеализацияНа этом этапе строится программа, <strong>в</strong> которой графыпереходо<strong>в</strong>, <strong>в</strong>ходные переменные, обработчики событий и<strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия реализуются <strong>в</strong> <strong>в</strong>иде функций. Крометого программа содержит <strong>в</strong>спомогательные модули (например,модуль упра<strong>в</strong>ления таймерами).


46Программа, созда<strong>в</strong>аемая с использо<strong>в</strong>анием предлагаемогоподхода, состоит из д<strong>в</strong>ух частей: системонеза<strong>в</strong>исимой исистемоза<strong>в</strong>исимой.Система <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong> образуетсистемонеза<strong>в</strong>исимую (например, от операционной системы)часть программы, которая реализует алгоритмфункциониро<strong>в</strong>ания системы упра<strong>в</strong>ления.Обработчики событий, функции <strong>в</strong>ходных и <strong>в</strong>ыходныхпеременных и <strong>в</strong>спомогательные модули образуютсистемоза<strong>в</strong>исимую часть программы.Каждый граф переходо<strong>в</strong> формально и изоморфнореализуется отдельной функцией на <strong>в</strong>ыбранном языкепрограммиро<strong>в</strong>ания <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии с алгоритмом (рис. 12),поз<strong>в</strong>оляющим реализо<strong>в</strong>ы<strong>в</strong>ать произ<strong>в</strong>ольные а<strong>в</strong>томаты любогоуро<strong>в</strong>ня <strong>в</strong>ложенности. Функция, реализующая а<strong>в</strong>томат,строится путем заполнения при<strong>в</strong>еденного ниже шаблонасодержащего д<strong>в</strong>е конструкции switch и оператор if. Пер<strong>в</strong>аяконструкция switch запускает <strong>в</strong>ложенные а<strong>в</strong>томаты иреализует переходы и дейст<strong>в</strong>ия на дугах и петлях. Операторif про<strong>в</strong>еряет, изменилось ли состояние, и если оноизменилось, <strong>в</strong>торая конструкция switch акти<strong>в</strong>изирует<strong>в</strong>ложенные а<strong>в</strong>томаты и реализует дейст<strong>в</strong>ия <strong>в</strong> но<strong>в</strong>ой <strong>в</strong>ершине.Из изложенного следует, что а<strong>в</strong>томат Мили реализуетсяодним оператором switch, а а<strong>в</strong>томат Мура и смешанныйа<strong>в</strong>томат — д<strong>в</strong>умя.


47Подпрограмма <strong>в</strong>ызы<strong>в</strong>ается с целочисленным параметром e,содержащим номер произошедшего события.Метка "case"пер<strong>в</strong>ого оператора"switch" сномером,соот<strong>в</strong>етст<strong>в</strong>ующимтекущемусостояниюа<strong>в</strong>томатаВыз<strong>в</strong>ать <strong>в</strong>ложенныеа<strong>в</strong>томатыПро<strong>в</strong>ерить усло<strong>в</strong>ия надугах и петлях,<strong>в</strong>ыполнить переход идейст<strong>в</strong>ия на дуге илипетлеПодпрограммы, реализующие <strong>в</strong>ложенные <strong>в</strong> текущее состояниеа<strong>в</strong>томаты (если они имеются), последо<strong>в</strong>ательно <strong>в</strong>ызы<strong>в</strong>аются <strong>в</strong> порядкеперечисления на графе. При этом им передается номерпроизошедшего события (е).Для текущего состояния про<strong>в</strong>еряются усло<strong>в</strong>ия переходо<strong>в</strong> на <strong>в</strong>сехисходящих дугах и петлях. В пер<strong>в</strong>ую очередь, про<strong>в</strong>еряются усло<strong>в</strong>ия нагруппо<strong>в</strong>ых дугах или петлях. Усло<strong>в</strong>ия про<strong>в</strong>еряются <strong>в</strong> порядке,определенном расста<strong>в</strong>ленными приоритетами. Остальные усло<strong>в</strong>ияпро<strong>в</strong>еряются <strong>в</strong> произ<strong>в</strong>ольном порядке. Если усло<strong>в</strong>ие переходаистинно, последо<strong>в</strong>ательно <strong>в</strong>ыполняются перечисленные на дуге илипетле дейст<strong>в</strong>ия (если они имеются). После этого <strong>в</strong>ыполняетсяизменение номера текущего состояния и про<strong>в</strong>ерка усло<strong>в</strong>ий переходо<strong>в</strong>прекращается.НетСостояниеизменилось?Про<strong>в</strong>ерка изменения текущего состояния а<strong>в</strong>томата.ДаМетка "case"<strong>в</strong>торого оператора"switch" сномером,соот<strong>в</strong>етст<strong>в</strong>ующимно<strong>в</strong>ому состояниюа<strong>в</strong>томатаАкти<strong>в</strong>изиро<strong>в</strong>ать<strong>в</strong>ложенные <strong>в</strong> но<strong>в</strong>оесостояние а<strong>в</strong>томатыВыполнить дейст<strong>в</strong>ия <strong>в</strong>но<strong>в</strong>ом состоянииПодпрограммы, реализующие <strong>в</strong>ложенные <strong>в</strong> но<strong>в</strong>ое состояние а<strong>в</strong>томаты(если они имеются), последо<strong>в</strong>ательно <strong>в</strong>ызы<strong>в</strong>аются <strong>в</strong> порядкеперечисления на графе. При этом им передается специальное<strong>в</strong>нутреннее событие с номером 0.Выполняются перечисленные <strong>в</strong> но<strong>в</strong>ом состоянии дейст<strong>в</strong>ия (если ониимеются).Рис. 12. Алгоритм реализации графо<strong>в</strong> переходо<strong>в</strong>


Шаблон функции, реализующей а<strong>в</strong>томат. Заменить "_i_" на номер а<strong>в</strong>томата.void A_i_( int e ){int y_old = y_i_ ;// Протоколиро<strong>в</strong>ание запуска а<strong>в</strong>томата.#ifdef A_i__BEGIN_LOGGINGlog_begin( "A_i_", y_old, e ) ;#endifswitch( y_i_ ){case 0:// Выз<strong>в</strong>ать <strong>в</strong>ложенные а<strong>в</strong>томаты.// Про<strong>в</strong>ерить усло<strong>в</strong>ия на дугах и петлях,// <strong>в</strong>ыполнить переход и дейст<strong>в</strong>ия на дуге или петле.break ;...case n:// Выз<strong>в</strong>ать <strong>в</strong>ложенные а<strong>в</strong>томаты.// Про<strong>в</strong>ерить усло<strong>в</strong>ия на дугах и петлях,// <strong>в</strong>ыполнить переход и дейст<strong>в</strong>ия на дуге или петле.break ;default:#ifdef A_i__ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR,"Ошибка <strong>в</strong> а<strong>в</strong>томате A_i_: неиз<strong>в</strong>естный номер состояния!", 0 ) ;#endif} ;// Если состояние не изменилось - за<strong>в</strong>ершить <strong>в</strong>ыполнение функции.if( y_old == y_i_ ) goto A_i__end ;// Протоколиро<strong>в</strong>ание перехода <strong>в</strong> а<strong>в</strong>томате.#ifdef A_i__TRANS_LOGGINGlog_trans( "A_i_", y_old ) ;#endifswitch( y_i_ ){case 0:// Произ<strong>в</strong>ести акти<strong>в</strong>изацию <strong>в</strong>ложенных <strong>в</strong> но<strong>в</strong>ое состояние а<strong>в</strong>томато<strong>в</strong>.// Выполнить дейст<strong>в</strong>ия <strong>в</strong> но<strong>в</strong>ом состоянии.break ;...case n:// Произ<strong>в</strong>ести акти<strong>в</strong>изацию <strong>в</strong>ложенных <strong>в</strong> но<strong>в</strong>ое состояние а<strong>в</strong>томато<strong>в</strong>.// Выполнить дейст<strong>в</strong>ия <strong>в</strong> но<strong>в</strong>ом состоянии.break ;} ;// Протоколиро<strong>в</strong>ание за<strong>в</strong>ершения работы а<strong>в</strong>томата.A_i__end: ;#ifdef A_i__END_LOGGINGlog_end( "A_i_", y_i_, e ) ;#endif} ;48После реализации графа переходо<strong>в</strong> текст функции принеобходимости должен корректиро<strong>в</strong>аться для обеспечениябеспо<strong>в</strong>торности опроса <strong>в</strong>ходных переменных. Это поз<strong>в</strong>оляетрешить проблему "риска", заключающуюся <strong>в</strong> том, что еслипри про<strong>в</strong>ерке усло<strong>в</strong>ий на исходящих из <strong>в</strong>ершины дугах одна и


49та же <strong>в</strong>ходная переменная опраши<strong>в</strong>ается более одного раза,то сущест<strong>в</strong>ует <strong>в</strong>оз<strong>можно</strong>сть, что она изменит с<strong>в</strong>ое значениемежду опросами [1].Реализация <strong>в</strong>ходных переменных, обработчико<strong>в</strong> событий,<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий, <strong>в</strong>спомогательных модулей ипользо<strong>в</strong>ательских интерфейсо<strong>в</strong> образует системоза<strong>в</strong>исимуючасть программы. При этом <strong>в</strong>се функции, реализующие<strong>в</strong>ходные переменные, записы<strong>в</strong>аются <strong>в</strong> порядке <strong>в</strong>озрастания ихномеро<strong>в</strong> <strong>в</strong> один файл, а реализующие <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия —<strong>в</strong> другой.Этап за<strong>в</strong>ершается построением структурной схемыразработанного программного обеспечения, отражающей<strong>в</strong>заимодейст<strong>в</strong>ие его частей. Эта схема может <strong>в</strong>ключать схему<strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>, которая при этом отдельно не<strong>в</strong>ыпускается.Перечислим особенности предлагаемой реализации:− она поз<strong>в</strong>оляет использо<strong>в</strong>ать одно и то же <strong>в</strong>ыходное<strong>в</strong>оздейст<strong>в</strong>ие как <strong>в</strong> <strong>в</strong>ершине, так и на принадлежащей ейпетле. При этом при переходе <strong>в</strong> такую <strong>в</strong>ершину <strong>в</strong>ыполняетсяуказанное <strong>в</strong> ней дейст<strong>в</strong>ие, а при запуске а<strong>в</strong>томата и<strong>в</strong>ыполнении усло<strong>в</strong>ия перехода на этой петле — дейст<strong>в</strong>ие, еепомечающее;− предназначенные для более компактного предста<strong>в</strong>ленияграфо<strong>в</strong> переходо<strong>в</strong> группо<strong>в</strong>ые дуги и петли реализуются такжекак и остальные дуги и петли <strong>в</strong> графах, по<strong>в</strong>торяясь длякаждой из <strong>в</strong>ершин, <strong>в</strong>ходящих <strong>в</strong> группу;− для хранения номера текущего состояния а<strong>в</strong>томатаиспользуется одна <strong>в</strong>нутренняя переменная, а дляопределения того, что состояние изменилось, применяется<strong>в</strong>торая переменная, носящая <strong>в</strong>спомогательный характер;− имена функций и переменных, используемых приреализации а<strong>в</strong>томато<strong>в</strong>, со<strong>в</strong>падают с обозначениями,


50применяемыми <strong>в</strong> схемах с<strong>в</strong>язей а<strong>в</strong>томато<strong>в</strong> и графахпереходо<strong>в</strong>. Например, переменная, <strong>в</strong> которой хранится номерпроизошедшего события, имеет имя e;− изоморфизм <strong>в</strong> реализации графо<strong>в</strong> переходо<strong>в</strong> поз<strong>в</strong>оляетпри необходимости решить обратную задачу [5]: однозначно<strong>в</strong>осстано<strong>в</strong>ить граф переходо<strong>в</strong> по построенной подпрограмме;− системонеза<strong>в</strong>исимая часть программы имеет регулярнуюструктуру и, следо<strong>в</strong>ательно, легко читается икорректируется;− системонеза<strong>в</strong>исимая часть программы за<strong>в</strong>исит толькоот наличия компилятора или интерпретатора <strong>в</strong>ыбранногоязыка программиро<strong>в</strong>ания на используемой платформе. Присмене аппаратуры или переносе программы под другуюоперационную систему значительным изменениям можетпод<strong>в</strong>ергаться только системоза<strong>в</strong>исимая часть;− реализация <strong>в</strong>ходных переменных и <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ий <strong>в</strong> <strong>в</strong>иде функций обеспечи<strong>в</strong>ает: ихпротоколиро<strong>в</strong>ание, простоту перехода от одних типо<strong>в</strong>источнико<strong>в</strong> и приемнико<strong>в</strong> информации к другим, наличиедейст<strong>в</strong>ующего макета программы [8] <strong>в</strong> любой момент <strong>в</strong>ременипосле начала реализации системоза<strong>в</strong>исимой части.3.1.4. Отладка и сертификацияВ рамках предлагаемой технологии отладка программможет <strong>в</strong>ыполняться тремя способами: традиционным(интеракти<strong>в</strong>ным) способом; наблюдением за значениямипеременных состояний <strong>в</strong>сех а<strong>в</strong>томато<strong>в</strong>, отображаемыми наодном экране; путем анализа протоколо<strong>в</strong> работы программы.Пер<strong>в</strong>ый способ <strong>в</strong>ключает как простое исполнениепрограммы с различными <strong>в</strong>ходными данными, так ииспользо<strong>в</strong>ание отладчика. Этот способ отладки я<strong>в</strong>ляетсятрадиционным и, поэтому, подробно не рассматри<strong>в</strong>ается.


51Второй способ осно<strong>в</strong>ан на <strong>в</strong><strong>в</strong>еденном <strong>в</strong> программиро<strong>в</strong>аниепонятии "наблюдаемость" [1]. При этом для однозначногоопределения состояний каждого а<strong>в</strong>томата достаточно следитьза значениями одной переменной, а для системы<strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong> — за переменными состояний этиха<strong>в</strong>томато<strong>в</strong>, которые должны отображаться на одном экране.Наиболее <strong>в</strong>ажным я<strong>в</strong>ляется третий из предлагаемыхспособо<strong>в</strong> отладки. Рассмотрим его более подробно.Для обеспечения протоколиро<strong>в</strong>ания, функции,реализующие а<strong>в</strong>томаты, <strong>в</strong>ходные переменные и <strong>в</strong>ыходные<strong>в</strong>оздейст<strong>в</strong>ия, содержат <strong>в</strong>ызо<strong>в</strong>ы функций протоколиро<strong>в</strong>ания.Благодаря этому стано<strong>в</strong>ится <strong>в</strong>озможным а<strong>в</strong>томатическоеполучение протоколо<strong>в</strong> работы программы <strong>в</strong> терминаха<strong>в</strong>томато<strong>в</strong>. А<strong>в</strong>томатическое получение таких протоколо<strong>в</strong>доказы<strong>в</strong>ает, что графы переходо<strong>в</strong> я<strong>в</strong>ляются не "картинками",а математическими моделями.Это чрез<strong>в</strong>ычайно <strong>в</strong>ажно, так как "протоколы (история<strong>в</strong>ычислений) я<strong>в</strong>ляются конструкциями, <strong>в</strong>скры<strong>в</strong>ающими механизмработы программы и, поэтому, постепенно среди теоретико<strong>в</strong>программиро<strong>в</strong>ания сложилось предста<strong>в</strong>ление, что множест<strong>в</strong>опротоколо<strong>в</strong> лучше характеризует программу, нежели самисходный программный текст" [9]. Изложенное с<strong>в</strong>язано стем, что "идея доказательст<strong>в</strong>а пра<strong>в</strong>ильности программ <strong>в</strong>значительной мере исчерпала себя, так как <strong>в</strong>ыяснилось, что<strong>в</strong> общем случае не<strong>в</strong>оз<strong>можно</strong> устано<strong>в</strong>ить с<strong>в</strong>ойст<strong>в</strong>а результатаработы программы или процедуры, не исполни<strong>в</strong> ее доконца... В теории <strong>в</strong>ычислений доказы<strong>в</strong>ается, что <strong>в</strong> общемслучае распознать определенные с<strong>в</strong>ойст<strong>в</strong>а <strong>в</strong> программе <strong>можно</strong>только динамически, прослежи<strong>в</strong>ая <strong>в</strong>есь процесс <strong>в</strong>ычисленияпри соот<strong>в</strong>етст<strong>в</strong>ующих <strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>иях" [10].Протоколиро<strong>в</strong>ание <strong>можно</strong> <strong>в</strong>ыполнять с любой степеньюподробности. При этом <strong>можно</strong> <strong>в</strong>ыделить д<strong>в</strong>е разно<strong>в</strong>идностипротоколо<strong>в</strong>: "полные" и "короткие". В "полных" протоколах


52указы<strong>в</strong>аются события, запуск а<strong>в</strong>томато<strong>в</strong>, их состояния <strong>в</strong>момент запуска, переходы <strong>в</strong> но<strong>в</strong>ые состояния, за<strong>в</strong>ершениеработы а<strong>в</strong>томато<strong>в</strong>, значения <strong>в</strong>ходных переменных, <strong>в</strong>ыходные<strong>в</strong>оздейст<strong>в</strong>ия и <strong>в</strong>ремя начала <strong>в</strong>ыполнения каждого из них."Короткие" протоколы содержат только события иинициируемые ими <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия, интересующиезаказчика."Короткий" протокол поз<strong>в</strong>оляет определить наличиеошибки <strong>в</strong> <strong>в</strong>ыдаче <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий, а "полный" —определить а<strong>в</strong>томат, который при этом необходимооткорректиро<strong>в</strong>ать. Поэтому "короткие" протоколы могут бытьназ<strong>в</strong>аны "про<strong>в</strong>еряющими", а "полные" — "диагностирующими".Каждый протокол <strong>можно</strong> рассматри<strong>в</strong>ать как сценарийработы системы при заданных <strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>иях. Какуказано <strong>в</strong>ыше, этот протокол строится а<strong>в</strong>томатически <strong>в</strong>о<strong>в</strong>ремя исполнения программы, <strong>в</strong> то <strong>в</strong>ремя как <strong>в</strong> из<strong>в</strong>естныхтехнологиях сценарии (например, диаграммыпоследо<strong>в</strong>ательностей <strong>в</strong> UML [5]) предлагается строить<strong>в</strong>ручную на этапе проектиро<strong>в</strong>ания, что при сложномпо<strong>в</strong>едении программы практически не<strong>в</strong>оз<strong>можно</strong>.Протоколы, получаемые на этапе отладки, используются<strong>в</strong> дальнейшем на этапе сертификации <strong>в</strong> роли контрольныхпримеро<strong>в</strong> [8] для демонстрации того, что программаработает <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии с требо<strong>в</strong>аниями заказчика. Вопросо количест<strong>в</strong>е необходимых для сертификации протоколо<strong>в</strong>остается открытым и требует дальнейших исследо<strong>в</strong>аний.3.1.5. Документиро<strong>в</strong>аниеНа этапе документиро<strong>в</strong>ания для точного оформлениярезультато<strong>в</strong> проектиро<strong>в</strong>ания и разработки программыпредлагается созда<strong>в</strong>ать и сда<strong>в</strong>ать <strong>в</strong> архи<strong>в</strong> документацию(по крайней мере <strong>в</strong> электронном <strong>в</strong>иде), которая <strong>в</strong> общемслучае может содержать следующие документы: структурная


53схема системы; схема разработанного программногообеспечения; распечатки экрано<strong>в</strong> пользо<strong>в</strong>ательскихинтерфейсо<strong>в</strong>; перечни событий, <strong>в</strong>ходных переменных и<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий; диаграмма <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>;описание нотации, используемой <strong>в</strong> графах переходо<strong>в</strong>; шаблондля реализации графо<strong>в</strong> переходо<strong>в</strong> смешанных а<strong>в</strong>томато<strong>в</strong>произ<strong>в</strong>ольного уро<strong>в</strong>ня <strong>в</strong>ложенности; для каждого а<strong>в</strong>томата:сло<strong>в</strong>есное описание (фрагмент технического задания),рассматри<strong>в</strong>аемое <strong>в</strong> качест<strong>в</strong>е комментария, схема с<strong>в</strong>язейа<strong>в</strong>томата, граф переходо<strong>в</strong> и исходный текст функции,реализующей а<strong>в</strong>томат; алгоритмы, например <strong>в</strong> <strong>в</strong>иде графо<strong>в</strong>переходо<strong>в</strong>, и исходные тексты <strong>в</strong>спомогательных модулей ифункций, реализующих <strong>в</strong>ходные переменные, обработчикисобытий и <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия; протоколы длясертификации программы.После этого, при поя<strong>в</strong>лении любых изменений,<strong>в</strong>озникающих <strong>в</strong> ходе дальнейших этапо<strong>в</strong> жизненного циклапрограммы, <strong>в</strong>есь комплект документации (по за<strong>в</strong>ершениикаждого этапа) должен корректиро<strong>в</strong>аться.Отметим, что подробное документиро<strong>в</strong>ание проектасоздания программного обеспечения поз<strong>в</strong>оляет принеобходимости <strong>в</strong>носить изменения <strong>в</strong> него через длительныйсрок после его <strong>в</strong>ыпуска, <strong>в</strong> том числе специалистами, неучаст<strong>в</strong>о<strong>в</strong>а<strong>в</strong>шими <strong>в</strong> проектиро<strong>в</strong>ании.4. Практическое применение предлагаемой технологии4.1. Сра<strong>в</strong>нение традиционного подхода с предлагаемымСра<strong>в</strong>нение традиционного подхода с предлагаемым<strong>в</strong>ыполним на примере создания программного модуляупра<strong>в</strong>ления элементом пользо<strong>в</strong>ательского интерфейса"тулбар" (рис. 13), реализующего следующие функции:


54− перемещение тулбара при нажатой пра<strong>в</strong>ой кнопке мыши;− <strong>в</strong>ы<strong>в</strong>од меню тулбара нажатием и отпусканием пра<strong>в</strong>ойкнопки мыши.Рис. 13. ТулбарСначала построим этот модуль, используя традиционныйсобытийный подход. При этом для <strong>в</strong>ыполнения заданныхфункций необходимо реализо<strong>в</strong>ать обработку следующихсобытий:− нажатие пра<strong>в</strong>ой кнопки мыши;− отпускание пра<strong>в</strong>ой кнопки мыши;− перемещение мыши с нажатой пра<strong>в</strong>ой кнопкой;− <strong>в</strong>ыход курсора мыши за границу тулбара.Ниже при<strong>в</strong>еден текст модуля, состоящего изобработчико<strong>в</strong> перечисленных событий, который создан дляработы под ОС QNX 4.25 и графической оболочкой Photon1.14.// Модуль, реализующий упра<strong>в</strong>ление тулбаром.// Традиционный подход.//======// Обработчик события нажатия кнопки мыши на тулбаре.int toolbar_btn_press(PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo){toolbar_t *tb = tb_data(widget) ; // Указатель на данные тулбара.PhRect_t *rect ; // Координаты курсора мыши.PhEvent_t *event = cbinfo->event ; // Произошедшее событие.PhPointerEvent_t *edata = PhGetData( event ) ; // Дополнительная информация о// событии.if( edata->buttons&Ph_BUTTON_MENU ){// Была нажата пра<strong>в</strong>ая кнопка мыши.rect = PhGetRects( event ) ;tb->drag_pos = rect->ul ; // Запомнить координаты курсора мыши.PtWindowToFront( tb->wgt ) ; // Переместить окно тулбара <strong>в</strong>ыше <strong>в</strong>сех// остальных.tb->menu = 1 ;// Запомнить, что была нажата пра<strong>в</strong>ая кнопка мыши.} ;return( Pt_CONTINUE ) ;} ;


55//======// Обработчик события отпускания кнопки мыши на тулбаре.int toolbar_btn_release(PtWidget_t *widget,ApInfo_t *apinfo,PtCallbackInfo_t *cbinfo){toolbar_t *tb = tb_data(widget) ; // Указатель на данные тулбара.PhEvent_t *event = cbinfo->event ; // Произошедшее событие.PhPointerEvent_t *edata = PhGetData( event ) ; // Дополнительная информация о// событии.if( event->subtype==Ph_EV_RELEASE_REAL&& edata->buttons&Ph_BUTTON_MENU )// Была отпущена пра<strong>в</strong>ая кнопка мыши.if( tb->menu == 1 )// Перед этим была нажата пра<strong>в</strong>ая кнопка мыши.ApCreateModule( ABM_toolbar_menu, NULL, NULL ) ;// Отобразить меню.tb->menu = 0 ;return( Pt_CONTINUE ) ;} ;//======// Обработчик события перемещения мыши с нажатой кнопкой.int toolbar_btn_move(PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo){toolbar_t *tb = tb_data(widget) ; // Указатель на данные тулбара.PhRect_t *rect ; // Координаты события.PhEvent_t *event = cbinfo->event ; // Произошедшее событие.PhPointerEvent_t *edata = PhGetData( event ) ; // Дополнительная информация о// событии.// Если не нажата пра<strong>в</strong>ая кнопка мыши — ничего не делать.if( !edata->buttons&Ph_BUTTON_MENU ) return Pt_CONTINUE ;// Переместить тулбар <strong>в</strong>след за курсором мыши.rect = PhGetRects( event ) ;tb->menu = 0 ;toolbar_move( tb, rect->ul.x - tb->drag_pos.x,rect->ul.y - tb->drag_pos.y ) ;return( Pt_CONTINUE ) ;} ;//======// Обработчик события пересечения курсором мыши границы тулбара.int toolbar_boundary(PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo){toolbar_t *tb = tb_data(widget) ; // Указатель на данные тулбара.tb->menu = 0 ;return( Pt_CONTINUE ) ;} ;На пер<strong>в</strong>ый <strong>в</strong>згляд, кажется (как это обычноут<strong>в</strong>ерждается <strong>в</strong> литературе), что эти обработчикинеза<strong>в</strong>исимы. Однако это не так уже потому, что онипредназначены для упра<strong>в</strong>ления одним и тем же объектом(тулбаром), и имеет место их <strong>в</strong>заимос<strong>в</strong>язь за счет наличияобщей упра<strong>в</strong>ляющей переменной (menu). Из текста программыследует, что логика ее работы рассредоточена пообработчикам событий, что делает по<strong>в</strong>едение модуля априоринепредсказуемым.


56Можно отметить и другой недостаток традиционногоподхода. Для обеспечения понятности программы еестараются делать самодокументирующейся. При этом <strong>в</strong><strong>в</strong>одятсякомментарии на языке разработчика (<strong>в</strong> России обычно нарусском) или заказчика. Также используются смысло<strong>в</strong>ыеидентификаторы, которые по этой причине достаточно длинныи должны быть записаны на английском языке. Поэтому, <strong>в</strong>опер<strong>в</strong>ых,разработчик <strong>в</strong>ынужден использо<strong>в</strong>ать английский язык<strong>в</strong> именах переменных и функций, что <strong>в</strong>есьма неудобно, таккак требует постоянного переключения мыслей с одногоязыка на другой. Во-<strong>в</strong>торых, при необходимостиграфического отображения результато<strong>в</strong> проектиро<strong>в</strong>ания, что<strong>в</strong> последнее <strong>в</strong>ремя <strong>в</strong>се чаще требуется заказчиками, оностано<strong>в</strong>ится чрез<strong>в</strong>ычайно громоздким, и поэтому либо <strong>в</strong>сетакине используется, либо не я<strong>в</strong>ляется доскональноточным.Этот же недостаток имеет место и <strong>в</strong> тех случаях, когдасамодокументирующимся делают <strong>в</strong>изуальный формализм.Примером этого я<strong>в</strong>ляются диаграммы состояний(Statecharts), используемые <strong>в</strong> UML [5], <strong>в</strong> которых записьсложных логических <strong>в</strong>ыражений и большого числа <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ий и их особенностей стано<strong>в</strong>ится практическинеобозримой. Такая же ситуация имеет место и прииспользо<strong>в</strong>ании SDL-диаграмм, широко применяемых припрограммной реализации протоколо<strong>в</strong> <strong>в</strong> телефонии [11].Отметим также, что при традиционном написании тексто<strong>в</strong>программ реализация функций <strong>в</strong>ходных и <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ий обычно <strong>в</strong>ыполняется со<strong>в</strong>местно с логикой,затрудняя ее понимание.Перейдем к проектиро<strong>в</strong>анию рассматри<strong>в</strong>аемого модуля сприменением описы<strong>в</strong>аемой технологии а<strong>в</strong>томатногопрограммиро<strong>в</strong>ания.


57Для каждого модуля, <strong>в</strong>место самодокументирующейсяпрограммы, разрабаты<strong>в</strong>аются четыре документа, которые <strong>в</strong>со<strong>в</strong>окупности, как будет показано ниже, решают <strong>в</strong>опрос опонятности по<strong>в</strong>едения программы: сло<strong>в</strong>есное описаниепо<strong>в</strong>едения модуля (например, перечень <strong>в</strong>ыполняемых модулемфункций); схема с<strong>в</strong>язей а<strong>в</strong>томата с его окружением(интерфейс а<strong>в</strong>томата); граф переходо<strong>в</strong>, однозначно иматематически строго определяющий по<strong>в</strong>едение а<strong>в</strong>томата;текст программного модуля.Используя сло<strong>в</strong>есное описание по<strong>в</strong>едения модуля,формализуем перечень его <strong>в</strong>ходных и <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий <strong>в</strong><strong>в</strong>иде схемы с<strong>в</strong>язей а<strong>в</strong>томата (рис. 14), указы<strong>в</strong>ая на ней длякаждого из <strong>в</strong>оздейст<strong>в</strong>ий его источник (приемник), полноеназ<strong>в</strong>ание (на языке разработчика) и идентификатор <strong>в</strong> <strong>в</strong>идебук<strong>в</strong>ы латинского алфа<strong>в</strong>ита с номером.ОбработчикисобытийНажата пра<strong>в</strong>ая кнопка мышиОтпущена пра<strong>в</strong>ая кнопка мышиД<strong>в</strong>ижение мыши с нажатой пра<strong>в</strong>ой кнопкойВыход курсора за границы тулбараe10e20e30e40А0z10z20z30Запомнитькоординатыкурсора мышиПереместитьтулбар <strong>в</strong>след закурсором мышиВы<strong>в</strong>ести менютулбараz40Переместить окнотулбара <strong>в</strong>ышеостальныхРис. 14. Схема с<strong>в</strong>язей а<strong>в</strong>томата упра<strong>в</strong>ления тулбаромДля построения графа переходо<strong>в</strong> определим <strong>в</strong>озможныесостояния тулбара, которым сопоста<strong>в</strong>им соот<strong>в</strong>етст<strong>в</strong>ующиесостояния упра<strong>в</strong>ляющего им а<strong>в</strong>томата. Эти состоянияя<strong>в</strong>ляются "естест<strong>в</strong>енными", так как они с<strong>в</strong>язаны с физикойпроцесса упра<strong>в</strong>ления: ожидание (начальное состояние) иперемещение.Далее определим последо<strong>в</strong>ательности событий,инициирующие переходы между этими состояниями. Послеэтого <strong>в</strong><strong>в</strong>едем дополнительные состояния, "разделяющие"события <strong>в</strong> каждой из последо<strong>в</strong>ательностей. Дополнительное


58состояние, <strong>в</strong>озникающее на пути от состояния "ожидание" ксостоянию "перемещение", назо<strong>в</strong>ем "гото<strong>в</strong>ность".Пронумеро<strong>в</strong>а<strong>в</strong> <strong>в</strong> графе переходо<strong>в</strong> состояния (начиная снуля), определим остальные переходы между состояниями инеобходимые петли. Используя схему с<strong>в</strong>язей а<strong>в</strong>томата, награфе переходо<strong>в</strong> запишем усло<strong>в</strong>ия переходо<strong>в</strong> и дейст<strong>в</strong>ия,<strong>в</strong>ыполняемые <strong>в</strong> <strong>в</strong>ершинах, на дугах и петлях. Построенныйтаким образом граф переходо<strong>в</strong> смешанного а<strong>в</strong>томата при<strong>в</strong>еденна рис. 15.0. Ожиданиеe10e30e402. Перемещениеe301. Гото<strong>в</strong>ностьe20z30z20z: 10; 40e30z20Рис. 15. Граф переходо<strong>в</strong> а<strong>в</strong>томатаупра<strong>в</strong>ления тулбаромНаличие схемы с<strong>в</strong>язей поз<strong>в</strong>оляет понять смыслиспользуемых <strong>в</strong> графе переходо<strong>в</strong> идентификаторо<strong>в</strong>, несмотряна их очень короткие и <strong>в</strong>есьма абстрактные обозначения.Со<strong>в</strong>местное изучение схемы с<strong>в</strong>язей и графа переходо<strong>в</strong>поз<strong>в</strong>оляет даже не участ<strong>в</strong>о<strong>в</strong>а<strong>в</strong>шему <strong>в</strong> разработке специалиступонять по<strong>в</strong>едение созда<strong>в</strong>аемого программного модуля.Обратим <strong>в</strong>нимание, что <strong>в</strong> построенном графе <strong>в</strong> <strong>в</strong>ершине 2<strong>в</strong>ыходное <strong>в</strong>оздейст<strong>в</strong>ие z20 формируется как собст<strong>в</strong>енно <strong>в</strong><strong>в</strong>ершине, так и на петле. Это означает, что указанное<strong>в</strong>ыходное <strong>в</strong>оздейст<strong>в</strong>ие формируется как при переходе <strong>в</strong>состояние 2, так и при поступлении события e30 при


59нахождении а<strong>в</strong>томата <strong>в</strong> этом состоянии, что поддержи<strong>в</strong>аетсясоот<strong>в</strong>етст<strong>в</strong>ующей реализацией.Отметим, что при использо<strong>в</strong>ании SWITCH-технологии<strong>в</strong>место термина "логика программы" (предполагающего работус флагами) предлагается применять термин "по<strong>в</strong>едениепрограммы", подразуме<strong>в</strong>ающий работу с состояниями.Далее граф переходо<strong>в</strong> (рис. 15) формально и изоморфнореализуется по шаблону <strong>в</strong> <strong>в</strong>иде функции. Применяемый шаблонпоз<strong>в</strong>оляет обеспечить <strong>в</strong>нешнюю похожесть текстапрограммного модуля на граф переходо<strong>в</strong>. Построеннаяфункция не требует пояснений (комментарие<strong>в</strong>) к с<strong>в</strong>оемупо<strong>в</strong>едению, так как при использо<strong>в</strong>ании предлагаемойтехнологии текст программы не я<strong>в</strong>ляется осно<strong>в</strong>ным (и темболее единст<strong>в</strong>енным) программным документом, а по<strong>в</strong>едениеоднозначно и математически строго задается графомпереходо<strong>в</strong>. Эта функция не содержит реализации <strong>в</strong>ходных и<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий, а <strong>в</strong>ключает только их <strong>в</strong>ызо<strong>в</strong>ы.Получаемая при этом часть программы назы<strong>в</strong>аетсясистемонеза<strong>в</strong>исимой. Перейдем к построению еесистемоза<strong>в</strong>исимой части, <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии с предлагаемойструктурой событийных программ (рис. 7).В программу доба<strong>в</strong>ляются обработчики событий, каждыйиз которых также реализо<strong>в</strong>ан <strong>в</strong> <strong>в</strong>иде функции и содержит<strong>в</strong>ызо<strong>в</strong> построенного а<strong>в</strong>томата с передачей номерасоот<strong>в</strong>етст<strong>в</strong>ующего события.После этого, доба<strong>в</strong>и<strong>в</strong> <strong>в</strong> <strong>в</strong>иде "заглушек" функции<strong>в</strong>ходных 'x' (если они имеются) и <strong>в</strong>ыходных 'z'<strong>в</strong>оздейст<strong>в</strong>ий, содержащие только <strong>в</strong>ызо<strong>в</strong>ы функцийпротоколиро<strong>в</strong>ания, <strong>можно</strong> уже на ранней стадии программнойреализации получить дейст<strong>в</strong>ующий макет разрабаты<strong>в</strong>аемогомодуля, что соот<strong>в</strong>етст<strong>в</strong>ует принципу пошаго<strong>в</strong>ой нисходящейразработки [8].


60Программная реализация за<strong>в</strong>ершается разработкойрасполагаемых отдельно функций <strong>в</strong>ходных и <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ий и используемых ими <strong>в</strong>спомогательных модулей.Эти функции обычно могут быть отлажены неза<strong>в</strong>исимо.// Модуль, реализующий упра<strong>в</strong>ление тулбарами.// А<strong>в</strong>томатный подход.//======// Обработчик события нажатия кнопки мыши на тулбаре.int toolbar_btn_press( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ){toolbar_t *tb = tb_data(widget) ; // Указатель на данные тулбара.PhEvent_t *event = cbinfo->event ; // Произошедшее событие.PhPointerEvent_t *edata = PhGetData( event ) ; // Дополнительная информация о// событии.if( edata->buttons == Ph_BUTTON_MENU ){// Нажатая кнопка мыши — пра<strong>в</strong>ая.// Выз<strong>в</strong>ать упра<strong>в</strong>ляющий а<strong>в</strong>томат.A0( 10, tb, event ) ;} ;return( Pt_CONTINUE ) ;} ;//======// Обработчик события отпускания кнопки мыши на тулбаре.int toolbar_btn_release( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ){toolbar_t *tb = tb_data(widget) ; // Указатель на данные тулбара.PhEvent_t *event = cbinfo->event ; // Произошедшее событие.PhPointerEvent_t *edata = PhGetData( event ) ; // Дополнительная информация о// событии.if( event->subtype == Ph_EV_RELEASE_REAL && edata->buttons == Ph_BUTTON_MENU ){// Отпущенная кнопка мыши — пра<strong>в</strong>ая.// Выз<strong>в</strong>ать упра<strong>в</strong>ляющий а<strong>в</strong>томат.A0( 20, tb, event ) ;} ;return( Pt_CONTINUE ) ;} ;//======// Обработчик события перемещения мыши с нажатой кнопкой.int toolbar_btn_move( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ){toolbar_t *tb = tb_data(widget) ; // Указатель на данные тулбара.PhEvent_t *event = cbinfo->event ; // Произошедшее событие.PhPointerEvent_t *edata = PhGetData( event ) ; // Дополнительная информация о// событии.if( edata->buttons == Ph_BUTTON_MENU ){// Пра<strong>в</strong>ая кнопка нажата.// Выз<strong>в</strong>ать упра<strong>в</strong>ляющий а<strong>в</strong>томат.A0( 30, tb, event ) ;} ;return( Pt_CONTINUE ) ;} ;//======// Обработчик события пересечения курсором мыши границы тулбара.int toolbar_boundary( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ){toolbar_t *tb = tb_data(widget) ; // Указатель на данные тулбара.


61PhEvent_t *event = cbinfo->event ; // Произошедшее событие.if( event->subtype == Ph_EV_PTR_LEAVE ){// Курсор мыши <strong>в</strong>ышел за границу тулбара.// Выз<strong>в</strong>ать упра<strong>в</strong>ляющий а<strong>в</strong>томат.A0( 40, tb, event ) ;} ;return( Pt_CONTINUE ) ;} ;//======// Функция, реализующая а<strong>в</strong>томат упра<strong>в</strong>ления тулбаром.void A0( int e, toolbar_t *tb, PhEvent_t *event ){int y_old = tb->y0 ;#ifdef GRAPH_EVENTS_LOGGINGlog_exec( "A0", y_old, e ) ;#endifswitch( tb->y0 ){case 0:if( e == 10 ) tb->y0 = 1 ;break ;case 1:if( e == 20 ) { z30(tb) ; tb->y0 = 0 ; }elseif( e == 30 ) tb->y0 = 2 ;elseif( e == 40 ) tb->y0 = 0 ;break ;case 2:if( e == 30 ) { z20(tb, event) ; }elseif( e != 30 ) tb->y0 = 0 ;break ;default:#ifdef GRAPH_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, "ОШИБКА В A0: неиз<strong>в</strong>естное состояние!", 0 ) ;#endifbreak ;} ;// Если состояние не изменилось - за<strong>в</strong>ершить <strong>в</strong>ыполнение функции.if( y_old == tb->y0 ) goto A0_end ;#ifdef GRAPH_TRANS_LOGGINGlog_trans( "A0", y_old, tb->y0 ) ;#endifswitch( tb->y0 ){case 1:z10(tb, event) ; z40(tb) ;break ;case 2:z20(tb, event) ;break;} ;A0_end: ;#ifdef GRAPH_ENDS_LOGGINGlog_end( "A0", tb->y0, e ) ;#endif} ;//======// Запомнить координаты курсора мыши.void z10( toolbar_t *tb, PhEvent_t *event ){


62PhRect_t *rect = NULL ; // Координаты курсора мыши.#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z10. Запомнить координаты курсора мыши.", 0 ) ;#endifrect = PhGetRects( event ) ;tb->drag_pos = rect->ul ;} ;//======// Переместить тулбар.void z20( toolbar_t *tb, PhEvent_t *event ){PhRect_t *rect = NULL ; // Координаты курсора мыши.#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z20. Переместить тулбар.", 0 ) ;#endifrect = PhGetRects( event ) ;toolbar_move( tb, rect->ul.x - tb->drag_pos.x, rect->ul.y - tb->drag_pos.y ) ;} ;//======// Выз<strong>в</strong>ать меню тулбара.void z30( toolbar_t *tb ){#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z30. Выз<strong>в</strong>ать меню тулбара.", 0 ) ;#endifApCreateModule( ABM_toolbar_menu, NULL, NULL ) ;} ;//======// Переместить окно тулбара <strong>в</strong>ыше остальных.void z40( toolbar_t *tb ){#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z40. Переместить окно тулбара <strong>в</strong>ыше остальных.", 0 ) ;#endifPtWindowToFront( tb->wgt ) ;} ;С силу того, что построенная на осно<strong>в</strong>е предложенногоподхода программа имеет регулярную структуру, то <strong>в</strong><strong>в</strong>одя<strong>в</strong>ызо<strong>в</strong>ы функций протоколиро<strong>в</strong>ания <strong>в</strong> функции а<strong>в</strong>томато<strong>в</strong>,<strong>в</strong>ходных и <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий имеется <strong>в</strong>оз<strong>можно</strong>стьа<strong>в</strong>томатического получения истории <strong>в</strong>ыполнения программы <strong>в</strong>терминах а<strong>в</strong>томато<strong>в</strong> <strong>в</strong> форме протокола."Полный" протокол с про<strong>в</strong>еркой <strong>в</strong>сех переходо<strong>в</strong> а<strong>в</strong>томата,реализующего алгоритм упра<strong>в</strong>ления тулбаромОбработка события "нажатие пра<strong>в</strong>ой кнопки мыши"16:44:58.543{ A0: <strong>в</strong> состоянии 0 запущен с событием e1016:44:58.543T A0: перешел из состояния 0 <strong>в</strong> состояние 116:44:58.543* z10. Запомнить координаты курсора мыши.16:44:58.543* z40. Переместить окно тулбара <strong>в</strong>ыше остальных.16:44:58.543} A0: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 1Обработка события "отпускание пра<strong>в</strong>ой кнопки мыши" - <strong>в</strong>ызо<strong>в</strong>меню тулбара16:44:59.903{ A0: <strong>в</strong> состоянии 1 запущен с событием e20


6316:44:59.903* z30. Выз<strong>в</strong>ать меню тулбара.16:44:59.903T A0: перешел из состояния 1 <strong>в</strong> состояние 016:44:59.903} A0: за<strong>в</strong>ершил обработку события e20 <strong>в</strong> состоянии 0Обработка события "<strong>в</strong>ыход курсора мыши за границу тулбара"16:44:59.903{ A0: <strong>в</strong> состоянии 0 запущен с событием e4016:44:59.903} A0: за<strong>в</strong>ершил обработку события e40 <strong>в</strong> состоянии 0Обработка события "нажатие пра<strong>в</strong>ой кнопки мыши"16:45:03.963{ A0: <strong>в</strong> состоянии 0 запущен с событием e1016:45:03.963T A0: перешел из состояния 0 <strong>в</strong> состояние 116:45:03.963* z10. Запомнить координаты курсора мыши.16:45:03.963* z40. Переместить окно тулбара <strong>в</strong>ыше остальных.16:45:03.963} A0: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 1Обработка события "<strong>в</strong>ыход курсора мыши за границу тулбара"16:45:05.933{ A0: <strong>в</strong> состоянии 1 запущен с событием e4016:45:05.933T A0: перешел из состояния 1 <strong>в</strong> состояние 016:45:05.933} A0: за<strong>в</strong>ершил обработку события e40 <strong>в</strong> состоянии 0Обработка события "нажатие пра<strong>в</strong>ой кнопки мыши"16:45:10.482{ A0: <strong>в</strong> состоянии 0 запущен с событием e1016:45:10.482T A0: перешел из состояния 0 <strong>в</strong> состояние 116:45:10.482* z10. Запомнить координаты курсора мыши.16:45:10.482* z40. Переместить окно тулбара <strong>в</strong>ыше остальных.16:45:10.482} A0: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 1Обработка событий "перемещение мыши с нажатой кнопкой"16:45:12.812{ A0: <strong>в</strong> состоянии 1 запущен с событием e3016:45:12.812T A0: перешел из состояния 1 <strong>в</strong> состояние 216:45:12.812* z20. Переместить тулбар.16:45:12.812} A0: за<strong>в</strong>ершил обработку события e30 <strong>в</strong> состоянии 216:45:12.852{ A0: <strong>в</strong> состоянии 2 запущен с событием e3016:45:12.852* z20. Переместить тулбар.16:45:12.852} A0: за<strong>в</strong>ершил обработку события e30 <strong>в</strong> состоянии 2Обработка события "отпускание пра<strong>в</strong>ой кнопки мыши"16:45:15.812{ A0: <strong>в</strong> состоянии 2 запущен с событием e2016:45:15.812T A0: перешел из состояния 2 <strong>в</strong> состояние 016:45:15.812} A0: за<strong>в</strong>ершил обработку события e20 <strong>в</strong> состоянии 0Обработка события "<strong>в</strong>ыход курсора мыши за границу тулбара"16:45:16.742{ A0: <strong>в</strong> состоянии 0 запущен с событием e4016:45:16.742} A0: за<strong>в</strong>ершил обработку события e40 <strong>в</strong> состоянии 0Обработка события "нажатие пра<strong>в</strong>ой кнопки мыши"16:45:18.992{ A0: <strong>в</strong> состоянии 0 запущен с событием e1016:45:18.992T A0: перешел из состояния 0 <strong>в</strong> состояние 116:45:18.992* z10. Запомнить координаты курсора мыши.16:45:18.992* z40. Переместить окно тулбара <strong>в</strong>ыше остальных.16:45:18.992} A0: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 1Обработка событий "перемещение мыши с нажатой кнопкой"16:45:20.472{ A0: <strong>в</strong> состоянии 1 запущен с событием e3016:45:20.472T A0: перешел из состояния 1 <strong>в</strong> состояние 216:45:20.472* z20. Переместить тулбар.16:45:20.472} A0: за<strong>в</strong>ершил обработку события e30 <strong>в</strong> состоянии 216:45:21.192{ A0: <strong>в</strong> состоянии 2 запущен с событием e3016:45:21.192* z20. Переместить тулбар.16:45:21.192} A0: за<strong>в</strong>ершил обработку события e30 <strong>в</strong> состоянии 2Обработка события "<strong>в</strong>ыход курсора мыши за границу тулбара" -прекращение перемещения16:45:21.232{ A0: <strong>в</strong> состоянии 2 запущен с событием e4016:45:21.232T A0: перешел из состояния 2 <strong>в</strong> состояние 016:45:21.232} A0: за<strong>в</strong>ершил обработку события e40 <strong>в</strong> состоянии 0


64Из изложенного <strong>в</strong> настоящем разделе следует, чтопредлагаемый подход резко по<strong>в</strong>ышает "понимаемость"разрабаты<strong>в</strong>аемой программы. При его использо<strong>в</strong>ании, <strong>в</strong>отличие от традиционных подходо<strong>в</strong>, "сходятся концы сконцами" — а<strong>в</strong>томаты применяются для спецификации,программиро<strong>в</strong>ания, протоколиро<strong>в</strong>ания и документиро<strong>в</strong>ания.4.2. Подсистема упра<strong>в</strong>ления печатьюРассмотрим применение предлагаемого подхода на болеесложном примере, состоящем <strong>в</strong> разработке подсистемыупра<strong>в</strong>ления печатью.Подсистема функционирует под упра<strong>в</strong>лением ОС QNX<strong>в</strong>ерсии 4.25 и предназначена для реализации различныхрежимо<strong>в</strong> печати истории функциониро<strong>в</strong>ания системы с<strong>в</strong>оз<strong>можно</strong>стью их пред<strong>в</strong>арительного просмотра <strong>в</strong> средеграфической оболочки Photon 1.14.Эта подсистема состоит из д<strong>в</strong>ух частей:− менеджера печати, функционирующего как отдельныйпроцесс (а<strong>в</strong>томат <strong>в</strong>ыполнения печати);− модуля контроля режима печати, <strong>в</strong>недряемого <strong>в</strong>использующее его программное обеспечение <strong>в</strong> <strong>в</strong>идебиблиотеки (а<strong>в</strong>томат контроля режима печати).Модуль контроля режима печати реализует следующиефункции:− печать строк с информацией о происходящих <strong>в</strong> системесобытиях <strong>в</strong> режиме а<strong>в</strong>томатического функциониро<strong>в</strong>аниясистемы;− пред<strong>в</strong>арительный просмотр отдельных фрагменто<strong>в</strong>истории работы системы и их печать по требо<strong>в</strong>аниюоператора;− печать <strong>в</strong>ыбранных фрагменто<strong>в</strong> истории работы системыпо требо<strong>в</strong>анию оператора или при срабаты<strong>в</strong>ании таймера.


65Менеджер печати и модуль контроля режима печати<strong>в</strong>заимодейст<strong>в</strong>уют асинхронно через д<strong>в</strong>а файла, расположенныена RAM-диске (рис. 16).Некоторые функции системоза<strong>в</strong>исимой части модуляконтроля печати также реализо<strong>в</strong>ан с помощью а<strong>в</strong>томата(а<strong>в</strong>томат буферизации пред<strong>в</strong>арительного просмотра).Модуль печатиА<strong>в</strong>томат А0дописать; урезатьдо нуле<strong>в</strong>ой длиныRAMФайл печатифайл пустой?;конец файла?урезать до нуле<strong>в</strong>ойдлиныМенеджер печатиА<strong>в</strong>томат А1Системоза<strong>в</strong>исимаячасть модуляА<strong>в</strong>томат А2создать; удалитьФайлприостано<strong>в</strong>кипечатифайл сущест<strong>в</strong>ует?Системоза<strong>в</strong>исимаячасть менеджераРис. 16. Структурная схема программного обеспеченияподсистемы упра<strong>в</strong>ления печатьюОтметим, что рассмотренный пример я<strong>в</strong>ляется достаточно"простым" <strong>в</strong> рамках предложенной технологии, так как <strong>в</strong> нема<strong>в</strong>томаты не <strong>в</strong>заимодейст<strong>в</strong>уют друг с другом ни по одному изтрех указанных <strong>в</strong>ыше способо<strong>в</strong> (<strong>в</strong>ложенность, <strong>в</strong>ызы<strong>в</strong>аемость,обмен номерами состояний).Рассмотрим более подробно <strong>в</strong>ыделенные а<strong>в</strong>томаты,при<strong>в</strong>едя для каждого из них четыре документа: сло<strong>в</strong>есноеописание; схему с<strong>в</strong>язей; граф переходо<strong>в</strong>; текст функции,реализующей а<strong>в</strong>томат.


4.2.1. А<strong>в</strong>томат контроля режима печати664.2.1.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат контроля режима печати (A0) предназначен дляобеспечения пред<strong>в</strong>арительного просмотра и печати файло<strong>в</strong> <strong>в</strong>различных режимах работы системы.При пере<strong>в</strong>оде системы <strong>в</strong> а<strong>в</strong>томатический режим работы(событие e12) а<strong>в</strong>томат переходит <strong>в</strong> состояние"А<strong>в</strong>томатический". При этом <strong>в</strong> очередь печати доба<strong>в</strong>ляетсязаголо<strong>в</strong>ок таблицы происходящих <strong>в</strong> системе событий.Доба<strong>в</strong>ление <strong>в</strong> очередь строки с информацией о произошедшем<strong>в</strong> системе событии осущест<strong>в</strong>ляется при <strong>в</strong>ызо<strong>в</strong>е интерфейснойфункции print_on_event(), <strong>в</strong> качест<strong>в</strong>е параметра которойпередается указанная строка. Эта функция запускаета<strong>в</strong>томат с событием, означающим необходимость напечататьочередную строку (событие e110). Если размер файла печатине пре<strong>в</strong>ышает заданного (переменная x70), переданнаястрока доба<strong>в</strong>ляется <strong>в</strong> этот файл, я<strong>в</strong>ляющийся очередьюпечати и обрабаты<strong>в</strong>аемый менеджером печати, а функцияprint_on_event() <strong>в</strong>оз<strong>в</strong>ращает 0. В проти<strong>в</strong>ном случае функцияprint_on_event() <strong>в</strong>оз<strong>в</strong>ращает 2.При пере<strong>в</strong>оде системы <strong>в</strong> ручной режим работы (событиеe13), а<strong>в</strong>томат переходит <strong>в</strong> состояние "Ручной общий", <strong>в</strong>котором при нажатии общей кнопки "ПЕЧАТЬ" (событие e30)или срабаты<strong>в</strong>ании таймера печати по <strong>в</strong>ремени (событие e80)фрагменты истории работы системы <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии с текущим<strong>в</strong>ыбором, <strong>в</strong>ыполненным оператором на соот<strong>в</strong>етст<strong>в</strong>ующем<strong>в</strong>идеокадре, доба<strong>в</strong>ляются <strong>в</strong> очередь печати.При нажатии оператором на указанном <strong>в</strong>идеокадре однойиз кнопок, соот<strong>в</strong>етст<strong>в</strong>ующих различным фрагментам, а<strong>в</strong>томат<strong>в</strong>ызы<strong>в</strong>ается с событием e40. При этом <strong>в</strong> качест<strong>в</strong>е параметрафункция а<strong>в</strong>томата получает указатель на структуру данных синформацией о диалоге, <strong>в</strong> котором должен осущест<strong>в</strong>ляться


67пред<strong>в</strong>арительный просмотр <strong>в</strong>ыбранного фрагмента. Послеэтого, при усло<strong>в</strong>ии успешного открытия файла данногофрагмента (переменная x10), а<strong>в</strong>томат переходит <strong>в</strong> состояние"Ручной частный", <strong>в</strong> котором откры<strong>в</strong>ается указанный диалоги инициируется пред<strong>в</strong>арительный просмотр. При нажатииоператором <strong>в</strong> диалоге пред<strong>в</strong>арительного просмотра кнопки"ПЕЧАТЬ" (событие e30), <strong>в</strong>ыбранный фрагмент доба<strong>в</strong>ляется <strong>в</strong>очередь печати.Воз<strong>в</strong>рат из состояния "Ручной частный" <strong>в</strong> состояние"Ручной общий" осущест<strong>в</strong>ляется при закрытии диалогапред<strong>в</strong>арительного просмотра (событие e11).Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 17, 18.4.2.1.2. Схема с<strong>в</strong>язейФайл историиФайл печатиОбработчикисобытийВыбранный для печати по <strong>в</strong>ызо<strong>в</strong>у файл успешно открытРазмер файла печати больше допустимогоВыход из пред<strong>в</strong>арительного просмотра отдельного фрагментаПереход из ручного режима работы <strong>в</strong> а<strong>в</strong>томатическийПереход из а<strong>в</strong>томатического режима работы <strong>в</strong> ручнойНажатие кнопки ПЕЧАТЬЗапуск пред<strong>в</strong>арительного просмотраСрабаты<strong>в</strong>ание таймера печати по <strong>в</strong>ремени T80Поступление сообщения с информацией о событииx10x70e11e12e13e30e40e80e110А0z45Очистить область пред<strong>в</strong>арительного просмотраz800Показать диалог пред<strong>в</strong>арительного просмотраz200Доба<strong>в</strong>ить <strong>в</strong>ыбранный файл <strong>в</strong> очередь печатиz210Доба<strong>в</strong>ить <strong>в</strong>ыбранные фрагменты <strong>в</strong> очередь печатиДоба<strong>в</strong>ить <strong>в</strong> очередь печати строку с информацией о событииz250(а<strong>в</strong>томатическая печать)Доба<strong>в</strong>ить <strong>в</strong> очередь печати заголо<strong>в</strong>ок таблицы событийz260(а<strong>в</strong>томатическая печать)z51z220Урезать файл пред<strong>в</strong>арительного просмотра до нуле<strong>в</strong>ой длиныНачать просмотр <strong>в</strong>ыбранного файлаz500_0Сообщение обработано успешноz500_1Не <strong>в</strong>ключен режим а<strong>в</strong>томатической печатиz500_2Файл печати переполненОкнопрограммыФайл печатиФайлпред<strong>в</strong>арительногопросмотраВоз<strong>в</strong>ращаемоезначениеРис. 17. Схема с<strong>в</strong>язей а<strong>в</strong>томата контроля режима печати A0


684.2.1.3. Граф переходо<strong>в</strong>1. А<strong>в</strong>томатический e130. Ручной общийe40⋅x102. Ручной частныйe80z210z260e110⋅x70z:500_0;250e110⋅x70z500_2e12e30z210e11z: 800; 45; 51; 220e30z200e110z500_1Рис. 18. Граф переходо<strong>в</strong> а<strong>в</strong>томата контроля режимапечати A04.2.1.4. Текст функцииТекст функции, реализующей а<strong>в</strong>томат A0, при<strong>в</strong>еден ниже.Отметим, что <strong>в</strong> состоянии 1 для устранения описанной ранеепроблемы "риска" опрос <strong>в</strong>ходной переменной x70 <strong>в</strong>ыполняетсяоднократно, а ее значение запоминается <strong>в</strong>о <strong>в</strong>спомогательнойпеременной X70.#include #include "photon_stuff.h"#include "log.h"#include "defines.h"static int y0 = 0 ;void A0( int e, preview_dialog_t *d ){int y_old = y0 ;#ifdef A0_BEGIN_LOGGINGlog_begin( "A0", y_old, e ) ;#endifswitch( y0 ){case 0:if( e == 80 ) { z210() ; }elseif( e == 110 ) { z500_1() ; }elseif( e == 12 ) y0 = 1 ;elseif( e == 30 ) { z210() ; }elseif( e == 40 && x10(d)) y0 = 2 ;break ;case 1:{int X70 = x70() ;if( e == 13 ) y0 = 0 ;elseif( e == 110 && X70 ) { z500_2() ; }elseif( e == 110 && !X70 ) { z500_0() ; z250() ; }}break ;


69case 2:{if( e == 80 ) { z210() ; }elseif( e == 110 ) { z500_1() ; }elseif( e == 12 ) y0 = 1 ;elseif( e == 11 ) y0 = 0 ;elseif( e == 30 ) { z200(d) ; }}break ;default:#ifdef A0_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, "ERROR IN A0: unknown state number!", 0 ) ;#endifbreak ;} ;if( y_old == y0 ) goto A0_end ;{#ifdef A0_TRANS_LOGGINGlog_trans( "A0", y_old, y0 ) ;#endif} ;switch( y0 ){case 1:z260() ;break ;case 2:z800(d) ; z45(d) ; z51() ; z220(d) ;break ;} ;A0_end: ;#ifdef A0_END_LOGGINGlog_end( "A0", y0, e ) ;#endif} ;4.2.2. А<strong>в</strong>томат буферизации пред<strong>в</strong>арительного просмотра4.2.2.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат буферизации пред<strong>в</strong>арительного просмотра (A2)предназначен для ускорения графического <strong>в</strong>ы<strong>в</strong>ода при<strong>в</strong>ыполнении пред<strong>в</strong>арительного просмотра фрагменто<strong>в</strong> историиработы системы. А<strong>в</strong>томат <strong>в</strong>ызы<strong>в</strong>ается из функции перерисо<strong>в</strong>киокна пред<strong>в</strong>арительного просмотра.Необходимость <strong>в</strong> разработке нестандартных средст<strong>в</strong>просмотра файла объясняется тем, что <strong>в</strong> используемом дляпред<strong>в</strong>арительного просмотра графическом окне не<strong>в</strong>оз<strong>можно</strong>при помощи функций отображения текста отобразить сим<strong>в</strong>олыпсе<strong>в</strong>дографики, которые могут <strong>в</strong>стречаться <strong>в</strong>


70просматри<strong>в</strong>аемых файлах. Поэтому используемые сим<strong>в</strong>олыпсе<strong>в</strong>дографики отображаются при помощи функций рисо<strong>в</strong>аниялиний.Для ускорения перерисо<strong>в</strong>ки окна пред<strong>в</strong>арительногопросмотра содержимое просматри<strong>в</strong>аемого файла <strong>в</strong>ы<strong>в</strong>одится, по<strong>в</strong>оз<strong>можно</strong>сти, блоками. При этом:− непреры<strong>в</strong>ные последо<strong>в</strong>ательности тексто<strong>в</strong>ых сим<strong>в</strong>оло<strong>в</strong>,не содержащие пробело<strong>в</strong>, <strong>в</strong>ы<strong>в</strong>одятся одним блоком. Корректно<strong>в</strong>ы<strong>в</strong>одить последо<strong>в</strong>ательности тексто<strong>в</strong>ых сим<strong>в</strong>оло<strong>в</strong>,содержащие пробелы, не<strong>в</strong>оз<strong>можно</strong> из-за ошибки <strong>в</strong> функциирисо<strong>в</strong>ания текста, проя<strong>в</strong>ляющейся <strong>в</strong> том, что ширина сим<strong>в</strong>ола"пробел" не со<strong>в</strong>падает с шириной обычного тексто<strong>в</strong>огосим<strong>в</strong>ола;− непреры<strong>в</strong>ные последо<strong>в</strong>ательности пробело<strong>в</strong> не<strong>в</strong>ы<strong>в</strong>одятся;− непреры<strong>в</strong>ные последо<strong>в</strong>ательности псе<strong>в</strong>дографическихсим<strong>в</strong>оло<strong>в</strong> "горизонтальная линия" <strong>в</strong>ы<strong>в</strong>одятся одним <strong>в</strong>ызо<strong>в</strong>омфункции рисо<strong>в</strong>ания линии;− другие сим<strong>в</strong>олы псе<strong>в</strong>дографики <strong>в</strong>ы<strong>в</strong>одятся посим<strong>в</strong>ольно.А<strong>в</strong>томат <strong>в</strong>ыполняет функцию распозна<strong>в</strong>ателя указанныхпоследо<strong>в</strong>ательностей.Состояние "Вы<strong>в</strong>од сим<strong>в</strong>ола" соот<strong>в</strong>етст<strong>в</strong>ует посим<strong>в</strong>ольному<strong>в</strong>ы<strong>в</strong>оду.Состояние "Текст" соот<strong>в</strong>етст<strong>в</strong>ует накоплениюнепреры<strong>в</strong>ной последо<strong>в</strong>ательности тексто<strong>в</strong>ых сим<strong>в</strong>оло<strong>в</strong>.Состояние "Линия" соот<strong>в</strong>етст<strong>в</strong>ует накоплениюнепреры<strong>в</strong>ной последо<strong>в</strong>ательности псе<strong>в</strong>дографических сим<strong>в</strong>оло<strong>в</strong>"горизонтальная линия".Для обработки очередного сим<strong>в</strong>ола а<strong>в</strong>томат <strong>в</strong>ызы<strong>в</strong>ается ссобытием e0, а при за<strong>в</strong>ершении обработки <strong>в</strong>идимой частифайла а<strong>в</strong>томат <strong>в</strong>ызы<strong>в</strong>ается с событием e500, по которомупроисходит <strong>в</strong>ы<strong>в</strong>од накопленного <strong>в</strong> буфере содержимого. Кроме


71номера события а<strong>в</strong>томату также передается кодобрабаты<strong>в</strong>аемого сим<strong>в</strong>ола и номера строки и столбца,соот<strong>в</strong>етст<strong>в</strong>ующие его местоположению.Для ускорения работы некоторые функции <strong>в</strong>ходныхпеременных и <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий реализо<strong>в</strong>аны <strong>в</strong>нутрифункции а<strong>в</strong>томата.Схема с<strong>в</strong>язей и граф перехода а<strong>в</strong>томата при<strong>в</strong>едены нарис. 19, 20.4.2.2.2. Схема с<strong>в</strong>язейОчереднойсим<strong>в</strong>олПсе<strong>в</strong>дографический сим<strong>в</strong>ол '⎯'Любой псе<strong>в</strong>дографический сим<strong>в</strong>олСим<strong>в</strong>ол конца строкиСим<strong>в</strong>ол пробелаx600x601x602x603А2z600z610z620z601_0z601_1Отрисо<strong>в</strong>ать содержимое буфераОтрисо<strong>в</strong>ать псе<strong>в</strong>дографический сим<strong>в</strong>олНарисо<strong>в</strong>ать горизонтальную линиюОчистить буфер, доба<strong>в</strong>ить очередной сим<strong>в</strong>ол на пер<strong>в</strong>уюпозицию и запомнить номер текущего столбцаДоба<strong>в</strong>ить очередной сим<strong>в</strong>ол <strong>в</strong> буферОбластьпред<strong>в</strong>арительногопросмотраБуферОбработчикисобытийОбработать очередной сим<strong>в</strong>олОтобразить содержимое буфераe0e500z621_0z621_1Прис<strong>в</strong>оить значение 1У<strong>в</strong>еличить на 1Значение длиныгоризонтальнойлинииРис. 19. Схема с<strong>в</strong>язей а<strong>в</strong>томата буферизациипред<strong>в</strong>арительного просмотра A24.2.2.3. Граф переходо<strong>в</strong>1: e500 ∨ x602 ∨ x603иначеz610x601z6100. Вы<strong>в</strong>од сим<strong>в</strong>олаx600e500 ∨ x601 ∨ x602 ∨ x603z600e500 ∨ x600z6201. Текст1: x600z6002. Линияz601_0x601z620z621_0иначеz601_1иначеz621_1Рис. 20. Граф переходо<strong>в</strong> а<strong>в</strong>томата буферизациипред<strong>в</strong>арительного просмотра A2


4.2.2.4. Текст функции72#include "photon_stuff.h"#include "log.h"#include "defines.h"void A2( int e, char c, int line_num, int col_num ){static int y2 = 0 ;int y_old = y2 ;static char buf[line_width+10] = "" ;static int buf_len = 0 ;static int line_len = 0 ;static int start_col = 0 ;#ifdef A2_SHOW_SYMBOL{char str[100] = "" ;sprintf( str, "Получен сим<strong>в</strong>ол %d (`%c`)", c, c ) ;log_write( '!', str, 0 ) ;}#endif#ifdef A2_BEGIN_LOGGINGlog_begin( "A2", y_old, e ) ;#endifswitch( y2 ){case 0:if( e == 500 || (c == 0x0A || c == 0x0D) || (c == ' ')) ;elseif( c < 176 || c > 223 ) y2 = 1 ;elseif( c == '-' ) y2 = 2 ;else{ z610( c, line_num, col_num ) ; }break ;case 1:if( c == '-' ){ z600( line_num, col_num, buf, buf_len, start_col ) ; y2 = 2 ; }elseif( e == 500 || (c >= 176 && c 223 ){ z620( line_num, col_num, line_len, start_col ) ; y2 = 1 ; }else{ line_len++ ; }break ;default:#ifdef A2_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, "ERROR IN A2: unknown state number!", 0 ) ;#endifbreak ;} ;if( y_old == y2 ) goto A2_end ;#ifdef A2_TRANS_LOGGINGlog_trans( "A2", y_old, y2 ) ;#endif


73}switch( y2 ){case 0:z610( c, line_num, col_num ) ;break ;case 1:start_col = col_num ;buf[0] = c ; buf_len = 1 ; buf[1] = 0 ;break ;case 2:start_col = col_num ;line_len = 1 ;break ;} ;A2_end: ;#ifdef A2_END_LOGGINGlog_end( "A2", y2, e ) ;#endif4.2.3. А<strong>в</strong>томат <strong>в</strong>ы<strong>в</strong>ода на печать4.2.3.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат <strong>в</strong>ы<strong>в</strong>ода на печать описы<strong>в</strong>ает по<strong>в</strong>едениеменеджера печати, функционирующего как отдельный процесси предназначенного для непосредст<strong>в</strong>енной передачи напринтер распечаты<strong>в</strong>аемых документо<strong>в</strong>.Запуск а<strong>в</strong>томата происходит при срабаты<strong>в</strong>ании таймера(событие e70), период которого задается <strong>в</strong> программе. Этоттаймер запускается <strong>в</strong> режиме генератора синхроимпульсо<strong>в</strong>при инициализации программы.А<strong>в</strong>томат следит за д<strong>в</strong>умя файлами:− файлом, наличие которого я<strong>в</strong>ляется сигналомприостано<strong>в</strong>ки печати (переменная x60);− файлом печати, <strong>в</strong> который доба<strong>в</strong>ляются <strong>в</strong>ыда<strong>в</strong>аемые напечать документы (переменные x10, x50).Так как эти файлы физически находятся <strong>в</strong> операти<strong>в</strong>нойпамяти (на ram-диске), периодическая про<strong>в</strong>ерка ихсостояния не должна заметно <strong>в</strong>лиять на общуюпроиз<strong>в</strong>одительность системы, особенно учиты<strong>в</strong>ая то, чтоменеджер печати запускается с низким приоритетом,зада<strong>в</strong>аемым <strong>в</strong> программе при инициализации.


74При отсутст<strong>в</strong>ии команды на приостано<strong>в</strong>ку печати(отсутст<strong>в</strong>ует файл приостано<strong>в</strong>ки печати) по<strong>в</strong>едение а<strong>в</strong>томатаможет быть описано следующим образом: при доба<strong>в</strong>лениино<strong>в</strong>ого документа <strong>в</strong> файл печати, а<strong>в</strong>томат переходит <strong>в</strong>состояние "Печать", <strong>в</strong> котором при срабаты<strong>в</strong>ании таймера <strong>в</strong>порт принтера отпра<strong>в</strong>ляется очередной фрагментраспечаты<strong>в</strong>аемого документа. Размер этого фрагментазадается <strong>в</strong> программе и <strong>в</strong>ыбирается <strong>в</strong> за<strong>в</strong>исимости отзаданного периода срабаты<strong>в</strong>ания таймера и быстродейст<strong>в</strong>ияпринтера. При достижении конца файла печати а<strong>в</strong>томатпереходит <strong>в</strong> состояние "Принтер с<strong>в</strong>ободен", при этом файлпечати урезается до нуле<strong>в</strong>ой длины. Если <strong>в</strong>о <strong>в</strong>ремя печатифайл печати был урезан до нуле<strong>в</strong>ой длины, это я<strong>в</strong>ляетсякомандой прекращения печати, после чего а<strong>в</strong>томат такжепереходит <strong>в</strong> состояние "Принтер с<strong>в</strong>ободен".Для устранения <strong>в</strong>оз<strong>можно</strong>сти непра<strong>в</strong>ильной работы,с<strong>в</strong>язанной с одно<strong>в</strong>ременной модификацией файла печатименеджером печати и другими процессами, используетсямеханизм блокиро<strong>в</strong>ки файло<strong>в</strong>.Схема с<strong>в</strong>язей и граф перехода а<strong>в</strong>томата при<strong>в</strong>едены нарис. 21, 22.4.2.3.2. Схема с<strong>в</strong>язейФайл печатиФайл приостано<strong>в</strong>кипечатиПорт принтераФайл печати имеет нуле<strong>в</strong>ую длинуКонец файла печатиПриостано<strong>в</strong>ить печатьПорт с<strong>в</strong>ободен (буфер порта не переполнен)x10x50x60x100А1z50z80_0z80_1z60Урезать файл печати до нуле<strong>в</strong>ой длиныЗакрыть файлОткрыть файлНапечатать очередной фрагмент файла печатиФайл печатиПорт принтераОбработчикисобытийСрабаты<strong>в</strong>ание таймера печати Т70e70Рис. 21. Схема с<strong>в</strong>язей а<strong>в</strong>томата <strong>в</strong>ы<strong>в</strong>ода на печать A1


4.2.3.3. Граф переходо<strong>в</strong>750. Принтер с<strong>в</strong>ободенz:80_0; 501: x10x10⋅x60z80_11: x10 ∨ x502. Печать приостано<strong>в</strong>ленаx602: x601. Печатьe70⋅x100z604.2.3.4. Текст функцииРис. 22. Граф переходо<strong>в</strong> а<strong>в</strong>томата<strong>в</strong>ы<strong>в</strong>ода на печать A1#include #include "log.h"#include "defines.h"#include "x.h"#include "z.h"static int y1 = 0 ;void A1( int e ){int y_old = y1 ;#ifdef A1_BEGIN_LOGGINGlog_begin( "A1", y_old, e ) ;#endifswitch( y1 ){case 0:if( !x10() && !x60() ) { z80_1() ; y1 = 1 ; } ;break ;case 1:if( x10() || x50() ) y1 = 0 ;elseif( x60() ) y1 = 2 ;elseif( e == 70 && x100() ) { z60() ; }break ;case 2:if( x10() ) y1 = 0 ;elseif( !x60() ) y1 = 1 ;break ;default:#ifdef A1_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, "ERROR IN A1: unknown state number!", 0 ) ;#endifbreak ;} ;if( y_old == y1 ) goto A1_end ;


76{#ifdef A1_TRANS_LOGGINGlog_trans( "A1", y_old, y1 ) ;#endif} ;switch( y1 ){case 0:z80_0() ; z50() ;break ;} ;A1_end: ;#ifdef A1_END_LOGGINGlog_end( "A1", y1, e ) ;#endif} ;4.2.4. Системоза<strong>в</strong>исимая часть модуля печатиСистемоза<strong>в</strong>исимая часть модуля печати состоит изфайло<strong>в</strong>, содержащих:− реализацию <strong>в</strong>ходных переменных;− реализацию <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия;− обработчики событий нажатия кнопок;− обработчик события закрытия диалогапред<strong>в</strong>арительного просмотра печатаемых фрагменто<strong>в</strong>;− обработчик события срабаты<strong>в</strong>ания таймера;− обработчик события печати строки <strong>в</strong> режимеа<strong>в</strong>томатической печати;− функцию инициализации;− функции манипулиро<strong>в</strong>ания файлами;− функции, реализующие пред<strong>в</strong>арительный просмотр.При<strong>в</strong>едем текст файла, содержащего реализацию <strong>в</strong>ходныхпеременных:#include "photon_stuff.h"#include "defines.h"#include "log.h"#include extern char print_preview_file_name[] ;extern char print_spool_file_name[] ;extern char print_current_dir[] ;extern int print_preview_file_limit ;extern int print_spool_file_limit ;int x10( preview_dialog_t *d ){int result ;


77FILE *print_preview_file = NULL ;if( d->file_name ){print_preview_file = fopen( d->file_name, "r" ) ;result = print_preview_file != NULL ;fclose( print_preview_file ) ;}elseresult = 0 ;#ifdef INPUTS_LOGGINGlog_input( "x10 - <strong>в</strong>ыбранный для печати файл сущест<strong>в</strong>ует", result ) ;#endifreturn result ;} ;int x70(){int result = 1 ;result = print_file_size( print_spool_file_name ) > print_spool_file_limit ;#ifdef INPUTS_LOGGINGlog_input( "x70 - размер файла печати больше допустимого", result ) ;#endifreturn result ;} ;int x600( char c ){int result = 1 ;result = c == '-' ;#ifdef INPUTS_LOGGINGlog_input( "x600 - получен псе<strong>в</strong>дографический сим<strong>в</strong>ол горизонтальной линии", result ) ;#endifreturn result ;} ;int x601( char c ){int result = 1 ;result = c >= 176 && c


78#ifdef INPUTS_LOGGINGlog_input( "x603 - получен сим<strong>в</strong>ол конца пробел", result ) ;#endifreturn result ;} ;Часть текста файла, содержащего реализацию <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ия, при<strong>в</strong>едена ниже:#include "photon_stuff.h"#include "log.h"#include "defines.h"#include "nls_api.h"#include #include #include #include #include extern char print_suspend_semaphor_file_name[] ;extern char print_spool_file_name[] ;extern char print_preview_file_name[] ;extern int print_buffer_size ;extern int print_on_event_result ;extern PhRect_t symbol_size ;extern PhPoint_t symbol_center ;extern preview_dialog_t *active_dialog ;extern preview_dialog_t dialogs[] ;void z45( preview_dialog_t *d ){#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z45. Очистить окно пред<strong>в</strong>арительного просмотра.", 0 ) ;#endifprint_preview_stop_preview( d ) ;} ;void z50(){#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z50. Урезать файл спулинга.", 0 ) ;#endif{int filedes = -1 ;filedes = sopen( print_spool_file_name, O_WRONLY | O_CREAT | O_TRUNC,SH_DENYWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP ) ;if( filedes != -1 )close( filedes ) ;}} ;void z51(){FILE *file ;#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z51. Урезать файл пред<strong>в</strong>арительного просмотра.", 0 ) ;#endiffile = fopen( print_preview_file_name, "w" ) ;if( file )fclose( file ) ;} ;void z55_0(){#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z55_0. Disable suspending.", 0 ) ;#endif


79remove( print_suspend_semaphor_file_name ) ;} ;void z55_1(){struct stat buf ;}} ;#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z55_1. Enable or disable suspending.", 0 ) ;#endifif( stat( print_suspend_semaphor_file_name, &buf ) == 0 ){// Suspend file exists.remove( print_suspend_semaphor_file_name ) ;}else{FILE *file ;file = fopen( print_suspend_semaphor_file_name, "w" ) ;if( file )fclose( file ) ;void z200( preview_dialog_t *d ){#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z200. Доба<strong>в</strong>ить <strong>в</strong>ыбранный файл <strong>в</strong> очередь печати.", 0 ) ;#endifprint_files_protocol_print( d->file_name ) ;} ;void z210(){#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z210. Доба<strong>в</strong>ить <strong>в</strong>ыбранные фрагменты <strong>в</strong> очередь печати.", 0 ) ;#endifprint_files_protocols_print() ;} ;При<strong>в</strong>едем часть текста файла, содержащего обработчикисобытий нажатия кнопок:#include "photon_stuff.h"extern preview_dialog_t dialogs[] ;extern preview_dialog_t *active_dialog ;int print_buttons( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ){if(PtWidgetParent(ABW_prot_anpar)!=NULL){active_dialog = &dialogs[0] ;A0( 40, active_dialog ) ;}elseif(PtWidgetParent(ABW_prot_ost)!=NULL){active_dialog = &dialogs[1] ;A0( 40, active_dialog ) ;}else//...if(PtWidgetParent(ABW_kzip)!=NULL){active_dialog = &dialogs[31];A0( 40, active_dialog ) ;


80}elseif( widget == ABW_print_clear_spool ){z50() ;}elseif( widget == ABW_print_suspend_printing){z55_1() ;}if( widget == ABW_F6){A0( 30, active_dialog ) ;}}return( Pt_CONTINUE );При<strong>в</strong>едем текст обработчика события закрытия диалогапред<strong>в</strong>арительного просмотра печатаемых фрагменто<strong>в</strong>:#include "photon_stuff.h"extern preview_dialog_t *active_dialog ;int preview_close( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ){active_dialog = NULL ;A0( 11, NULL ) ;return( Pt_CONTINUE ) ;} ;При<strong>в</strong>едем текст обработчика события срабаты<strong>в</strong>аниятаймера:#include "photon_stuff.h"int T80( void *data, pid_t pid, void *msg, size_t msg_size ){A0( 80, NULL ) ;return Pt_CONTINUE ;} ;При<strong>в</strong>едем текст обработчика события печати строки <strong>в</strong>режиме а<strong>в</strong>томатической печати:// Воз<strong>в</strong>ращает:// 0 - строка отпра<strong>в</strong>лена на печать;// 1 - не <strong>в</strong>ключен а<strong>в</strong>томатический режим печати;// 2 - файл печати переполнен.//int print_on_event( const char * const str ){print_event_string[0] = 0 ;strncpy( print_event_string, str, line_width ) ;print_event_string[line_width] = 0 ;


81A0(110, NULL ) ;}return print_on_event_result ;При<strong>в</strong>едем текст осно<strong>в</strong>ной функции, реализующейпред<strong>в</strong>арительный просмотр://======// Нарисо<strong>в</strong>ать пред<strong>в</strong>арительный просмотр.//int print_draw_preview( PtWidget_t *widget ){int line_num = 0, file_line_num = 0 ;PtArg_t args[1] ;int *scroll_pos ;if( !print_preview_is_shown) return 0 ;if( widget != active_dialog->preview_wgt ) return 0 ;// Получить положение скролбара.PtSetArg( args, Pt_ARG_SCROLL_POSITION, &scroll_pos, 0 ) ;PtGetResources( active_dialog->scrollbar_wgt, 1, args ) ;PgSetStrokeColor( preview_color ) ;PgSetTextColor( preview_color ) ;PgSetFont( preview_font ) ;//* Отобразить соот<strong>в</strong>етст<strong>в</strong>ующую часть файла пред<strong>в</strong>арительного просмотра.line_num = 0 ;file_line_num = -1 ;while( fgets( str, 999, print_preview_file ) ){int col_num = 0 ;file_line_num++ ;// Вышли за пределы <strong>в</strong>идимой области - закончить чтение файла.if( file_line_num > *scroll_pos + lines_on_screen ) break ;// Еще не дошли до <strong>в</strong>идимой области - продолжать считы<strong>в</strong>ание.if( file_line_num < *scroll_pos ) continue ;str[line_width] = 0 ;while( str[col_num] != 0 ){//print_draw_symbol( str[col_num], line_num, col_num ) ;A2( 0, str[col_num], line_num, col_num ) ;}col_num++ ;A2( 500, 0, line_num, col_num ) ;}line_num++ ;fseek( print_preview_file, 0, SEEK_SET ) ;}return 1 ;4.2.5. Системоза<strong>в</strong>исимая часть менеджера печатиСистемоза<strong>в</strong>исимая часть менеджера печати состоит изфайло<strong>в</strong>, содержащих:


82− реализацию <strong>в</strong>ходных переменных;− реализацию <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий;− функции инициализации программы;− функции протоколиро<strong>в</strong>ания.При<strong>в</strong>едем текст файла, содержащего реализацию <strong>в</strong>ходныхпеременных:#include #include #include #include #include "defines.h"#include "log.h"extern char print_suspend_semaphor_file_name[] ;extern char print_spool_file_name[] ;extern char print_current_dir[] ;extern FILE *print_spool_file ;extern int print_port_desc ;int x10(){int result = 0 ;struct stat buf ;if( stat( print_spool_file_name, &buf ) == 0 )result = buf.st_size == 0 ;#ifdef INPUTS_LOGGINGlog_input( "x10 - файл печати имеет нуле<strong>в</strong>ую длину", result ) ;#endifreturn result ;} ;int x50(){int result = 1 ;if( print_spool_file ){int read_len = 0, read_buf ;long int pos ;pos = ftell( print_spool_file ) ;read_len = fread( &read_buf, 1, 1, print_spool_file ) ;fseek( print_spool_file, pos, SEEK_SET ) ;}result = read_len == 0 ;#ifdef INPUTS_LOGGINGlog_input( "x50 - конец файла спулинга", result ) ;#endifreturn result ;} ;int x60(){int result = 0 ;struct stat buf ;result = stat( print_suspend_semaphor_file_name, &buf ) == 0 ;#ifdef INPUTS_LOGGINGlog_input( "x60 - suspend enabled", result ) ;#endif


83return result ;} ;int x100(){int result = 1 ;result = dev_state( print_port_desc, _DEV_EVENT_OUTPUT, _DEV_EVENT_OUTPUT ) ? 1:0 ;#ifdef INPUTS_LOGGINGlog_input( "x100 - порт принтера с<strong>в</strong>ободен", result ) ;#endifreturn result ;} ;При<strong>в</strong>едем текст файла, содержащего реализацию <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ий:#include #include #include #include #include #include #include #include "log.h"#include "defines.h"#include "nls_api.h"extern char print_spool_file_name[] ;extern FILE *print_spool_file ;extern int print_buffer_size ;extern int print_port_desc ;void z50(){#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z50. Урезать файл спулинга.", 0 ) ;#endif{int filedes = -1 ;filedes = sopen( print_spool_file_name, O_WRONLY | O_CREAT | O_TRUNC,SH_DENYWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP ) ;if( filedes != -1 )close( filedes ) ;}} ;void z60(){#ifdef ACTIONS_LOGGINGlog_write( LOG_ACTION, "z60. Напечатать очередной фрагмент файла спулинга.", 0 ) ;#endifif( print_spool_file ){char buf[1000] = "" ;int read_len = 0 ;long int pos ;pos = ftell( print_spool_file ) ;read_len = fread( buf, 1, print_buffer_size, print_spool_file ) ;fseek( print_spool_file, pos+read_len, SEEK_SET ) ;write( print_port_desc, buf, read_len ) ;flushall() ;} ;} ;


167†K Bgvg gvn`x (Avt) ?ÔBgvg ej‡jb- Ôwd‡i hvIÕ|BmgvBj ej‡jv- ÔAvwg Avcbvi KvQ †_‡K KL‡bvB wew”Qbœ n‡ev bvÕ|Bgvg ej‡jb, ÔGwU †Zvgvi wb‡Ri fv‡jvi Rb¨B, wd‡i hvI|ÕBmgvBj ej‡jv- ÔAvwg Avcbvi KvQ †_‡K †Kvb Ae¯’v‡ZB wew”Qbœn‡ev bvÕ|e„× gvbylwU ZLb gvSLv‡b n¯—‡c Ki‡jv Ges ej‡jv Ô‡Zvgvi wK†Kvb j¾v †bB| †Zvgvi Bgvg †Zvgv‡K `yÕevi Av‡`k w`‡q‡Qb wd‡ihvIqvi Rb¨ GiciI Zzwg Aeva¨ n‡”Qv?ÕBmgvBj _vg‡jv| Bgvg mvg‡b K‡qK K`g GwM‡q †M‡jb GeswcQ‡b wd‡i ej‡jb- ÔhLb Zzwg evM`v‡` †cuŠQ‡e Lwjdv †gvZvwmgwej−vn †Zvgv‡K †Rvic~e©K †W‡K cvVv‡e| hLb †m †Zvgv‡K wKQy w`‡ZPvB‡e Zv cÖZ¨vL¨vb K‡iv| GQvov Avgv‡`i mš—vb ivhxDÏxb‡K e‡jv†Zvgvi c n‡q Avjx Be‡b AvIqvR‡K wjL‡Z| AvwgI Zv‡K BkvivKi‡ev †Zvgv‡K †`qvi Rb¨ hv †Zvgvi B”Qv|ÕGici nhiZ Zvi mv_x‡`imn P‡j †M‡jb Ges BmgvB‡ji`„wó Zv‡`i Dci wbe× _vK‡jv H mgq ch©š— hZY Avi †m Zv‡`i†`L‡Z †c‡jv bv| †m gvwU‡Z wKQy‡Yi Rb¨ e‡m iB‡jv GiciZv‡`i mv‡_ we‡”Q‡`i Kvi‡Y Kuv`‡Z ïi“ Ki‡jv|Gici †m mvgviiv‡Z †M‡jv †hLv‡b †jvKRb Zv‡K wN‡i a‡iwR‡Ám Ki‡jv, ÔAvgiv †Zvgvi g‡a¨ GZ cwieZ©b †`LwQ †<strong>Kb</strong>? KxN‡U‡Q?Õ BmgvBj ej‡jv- Ô†Zvgiv wK Rv‡bv †NvomIqviiv KvivwQ‡jv hviv kni †Q‡o b`xi w`‡K wM‡qwQ‡jv?Õ Zviv ej‡jv- Zvivgh©v`vevb e¨w³ wQ‡jv Ges Mevw`cïi gvwjK| BmgvBj ej‡jv, ZvivwQ‡jv Bgvg I Zvi mv_xiv| whwb i½xb †cvlvK c‡owQ‡jb wZwbwQ‡jb Bgvg Ges wZwbB Zvi cweÎ nv‡Z Avgvi RL‡g nvZeywj‡qwQ‡jb| Zviv ej‡jv- ÔAvgv‡`i‡K †`L‡Z `vI|Õ hLb BmgvBj168†K Bgvg gvn`x (Avt) ?Zv‡`i‡K Zvi Di“ †`Lv‡jv, †mLv‡b GKUv `vM ch©š— wQ‡jv bv|RbMY Zvi Rvgv wQou‡Z jvM‡jv Zvevii“‡Ki Rb¨ Ges c‡i Ab¨ivhv‡Z Zvi Kv‡Q †cuŠQv‡Z bv cv‡i ZvB Zv‡K †UªRvix‡Z wb‡q †M‡jv|Gici Lwjdvi cÖwZwbwa G‡jv Ges Zv‡K NUbv m¤ú‡K© wR‡ÁmKi‡jv | Zvi cvwievwiK cwiwPwZ, Zvi †`‡ki evox, evM`v` †_‡KcÖ_g mßv‡n †m Kx D‡Ï‡k¨ †ei n‡qwQ‡jv †m m¤ú‡K©|ciw`b mKv‡j BmgvBj GK eo fxo Gi gvS w`‡q Zvi†`vqv `i“` co‡Z co‡Z mvgviiv kni Z¨vM Ki‡jv| c‡_ †m GKRvqMvq G‡m †cuŠQv‡jv †hLv‡b A‡bK †jvK Rgv n‡qwQ‡jv Ges ZvivZvi bvg, eskaviv Ges †Kvb RvqMv †_‡K G‡m‡Q Gme wR‡ÁmKi‡jv| hLb Zviv Zv‡K Av‡M D‡j−wLZ wb`k©b †`‡L wPb‡Z cvi‡jvZviv Zvi Rvgv wQuo‡Z ïi“ Ki‡jv Zvevii“K wn‡m‡e †bevi Rb¨|Lwjdvi cÖwZwbwa NUbvwUi wek` weeiY wj‡L evM`v‡` cvwV‡q wQ‡jv|gš¿x ‰mq` ivhx DÏxb‡K †W‡K cvVv‡jv NUbvi mZ¨Zv Rvbvi Rb¨|hLb ivwhDÏxb (†h wQ‡jv BmgvB‡ji mv_x I mg_©Kiv Qvovi Av‡MBmgvB‡ji ‡ghevb) Ges Ab¨iv BmgvBj‡K †`L‡jv Zviv †b‡gG‡jv| hLb BmgvBj Zv‡`i‡K Zvi Di“ †`L‡jv ivwhDÏxb cÖvq GKN›Uvi Rb¨ AÁvb n‡q c‡o iB‡jv| Ávb †divi ci †m BmgvB‡jinvZ a‡i Zv‡K gš¿xi Kv‡Q wb‡q †M‡jv| ivwhDÏxb †Ku‡` ej‡jv- Ô†mAvgvi fvB Ges me gvby‡li gv‡S †m Avgvi me‡P‡q wcÖq|Õgš¿x BmgvB‡ji KvQ †_‡K NUbv m¤ú‡K© Rvb‡Z PvB‡jv Ges†mI Zvi cy‡iv eY©bv w`‡jv| gš¿x †mB Wv³vi‡`i †W‡K cvVv‡jv hvivAv‡M BmgvBj‡K †`‡LwQ‡jv| hLb Zviv G‡jv wR‡Ám Ki‡jv- ÔKLbAvcbviv Zvi RLg †klev‡ii gZ ‡`‡LwQ‡jb? Zviv ej‡jv- Ô`k w`bAv‡MÕ| gš¿x BmgvB‡ji Di“ †`L‡jv Ges hLb Wv³viiv Gi †Kvb


85// Подключится к порту.print_port_desc = open( print_port_name, O_RDWR ) ;if( print_port_desc == -1 ){perror( "Error opening printer port" ) ;exit( -1 ) ;}dev_state( print_port_desc, 0, _DEV_EVENT_OUTPUT ) ;dev_osize( print_port_desc, print_buffer_size ) ;// Запустить таймер печати.{timer_t timer_id = -1 ;struct sigevent t_event ;struct itimerspec t_value ;}proxy_pid = qnx_proxy_attach( 0, 0, 0, -1 ) ;if( proxy_pid == -1 ){log_write( '!', "ERROR IN TIMERS!!!", errno ) ;exit(-1) ;} ;t_event.sigev_signo = -proxy_pid ;timer_id = timer_create( CLOCK_REALTIME, &t_event ) ;if( timer_id == -1 ){log_write( '!', "ERROR IN TIMERS!!!", errno ) ;exit(-1) ;} ;t_value.it_value.tv_sec = T70_interval ;t_value.it_value.tv_nsec = 0 ;t_value.it_interval.tv_sec = T70_interval ;t_value.it_interval.tv_nsec = 0 ;timer_settime( timer_id, 0, &t_value, NULL ) ;// Произ<strong>в</strong>ести инициализацию.z50() ;// Осно<strong>в</strong>ной цикл работы менеджера печати.for(;;){int msg ;client_pid = Receive( 0, &msg, sizeof( msg )) ;Reply( client_pid, NULL, 0 ) ;}}if( client_pid == proxy_pid ){A1( 70 ) ;continue ;}4.2.6. Протоколы функциониро<strong>в</strong>ания модуля печатиВ случае системы, для которой разрабаты<strong>в</strong>ался модульпечати, протоколы я<strong>в</strong>лялись единст<strong>в</strong>енным эффекти<strong>в</strong>нымсредст<strong>в</strong>ом отладки, так как размер исполняемого файласистемы, <strong>в</strong> который <strong>в</strong>недрялся модуль печати, соста<strong>в</strong>лял5,5Мб, а используемый отладчик не мог загружать файлытакого большого объема.


8713:06:59.886* z51. Урезать файл пред<strong>в</strong>арительного просмотра.13:06:59.926* z55_0. Disable suspending.13:07:06.055{ A0: <strong>в</strong> состоянии 0 запущен с событием e1213:07:06.065* z260. Hапечатать заголо<strong>в</strong>ок таблицы событий.13:07:06.125} A0: за<strong>в</strong>ершил обработку события e12 <strong>в</strong> состоянии 113:07:06.125{ A0: <strong>в</strong> состоянии 1 запущен с событием e11013:07:06.145* z500_0. От<strong>в</strong>ет клиенту - сообщение обработано успешно.13:07:06.165* z250. Напечатать строку с информацией о событии.13:07:06.185} A0: за<strong>в</strong>ершил обработку события e110 <strong>в</strong> состоянии 113:07:06.195{ A0: <strong>в</strong> состоянии 1 запущен с событием e11013:07:06.215* z500_0. От<strong>в</strong>ет клиенту - сообщение обработано успешно.13:07:06.235* z250. Напечатать строку с информацией о событии.13:07:06.245} A0: за<strong>в</strong>ершил обработку события e110 <strong>в</strong> состоянии 113:07:08.805{ A0: <strong>в</strong> состоянии 1 запущен с событием e1313:07:08.815} A0: за<strong>в</strong>ершил обработку события e13 <strong>в</strong> состоянии 013:07:18.605{ A0: <strong>в</strong> состоянии 0 запущен с событием e3013:07:18.605* z210. Доба<strong>в</strong>ить <strong>в</strong>ыбранные фрагменты <strong>в</strong> очередь печати.13:07:18.744} A0: за<strong>в</strong>ершил обработку события e30 <strong>в</strong> состоянии 013:07:28.864{ A0: <strong>в</strong> состоянии 0 запущен с событием e4013:07:28.874* z800. Показать окно пред<strong>в</strong>арительного просмотра.13:07:28.894* z45. Очистить окно пред<strong>в</strong>арительного просмотра.13:07:28.904* z51. Урезать файл пред<strong>в</strong>арительного просмотра.13:07:28.924* z220. Начать просмотр <strong>в</strong>ыбранного файла.13:07:28.954} A0: за<strong>в</strong>ершил обработку события e40 <strong>в</strong> состоянии 213:07:38.053{ A0: <strong>в</strong> состоянии 2 запущен с событием e4013:07:38.053} A0: за<strong>в</strong>ершил обработку события e40 <strong>в</strong> состоянии 213:07:38.063{ A0: <strong>в</strong> состоянии 2 запущен с событием e3013:07:38.073* z200. Доба<strong>в</strong>ить <strong>в</strong>ыбранный файл <strong>в</strong> очередь печати.13:07:38.103} A0: за<strong>в</strong>ершил обработку события e30 <strong>в</strong> состоянии 213:07:42.643{ A0: <strong>в</strong> состоянии 2 запущен с событием e1213:07:42.643* z260. Hапечатать заголо<strong>в</strong>ок таблицы событий.13:07:42.693} A0: за<strong>в</strong>ершил обработку события e12 <strong>в</strong> состоянии 113:08:04.601{ A0: <strong>в</strong> состоянии 1 запущен с событием e1313:08:04.601} A0: за<strong>в</strong>ершил обработку события e13 <strong>в</strong> состоянии 013:08:07.561{ A0: <strong>в</strong> состоянии 0 запущен с событием e1113:08:07.571} A0: за<strong>в</strong>ершил обработку события e11 <strong>в</strong> состоянии 013:08:09.771{ A0: <strong>в</strong> состоянии 0 запущен с событием e4013:08:09.771* z800. Показать окно пред<strong>в</strong>арительного просмотра.13:08:09.781* z45. Очистить окно пред<strong>в</strong>арительного просмотра.13:08:09.791* z51. Урезать файл пред<strong>в</strong>арительного просмотра.13:08:09.841* z220. Начать просмотр <strong>в</strong>ыбранного файла.13:08:09.861} A0: за<strong>в</strong>ершил обработку события e40 <strong>в</strong> состоянии 213:08:11.501{ A0: <strong>в</strong> состоянии 2 запущен с событием e1113:08:11.511} A0: за<strong>в</strong>ершил обработку события e11 <strong>в</strong> состоянии 0Протоколы функциониро<strong>в</strong>ания менеджера печати строятсяаналогично и, по этой причине, не при<strong>в</strong>одятся.4.3. Система упра<strong>в</strong>ления судо<strong>в</strong>ым дизель-генераторомРазработанная система предназначена для упра<strong>в</strong>ленияд<strong>в</strong>умя дизель-генераторами, функционирующими по одинако<strong>в</strong>ымалгоритмам. Система упра<strong>в</strong>ления содержит порядка 50дискретных <strong>в</strong>ходо<strong>в</strong>, 50 аналого<strong>в</strong>ых <strong>в</strong>ходо<strong>в</strong>, 50 дискретных<strong>в</strong>ыходо<strong>в</strong>, до 20 одно<strong>в</strong>ременно акти<strong>в</strong>ных <strong>в</strong>ыдержек <strong>в</strong>ремени и 5<strong>в</strong>идеокадро<strong>в</strong>.Программы <strong>в</strong>ыполнены для операционной системы QNX 4.25и графической оболочки Photon 1.14.


88Для отладки разработанной системы был созданпростейший программный имитатор объекта упра<strong>в</strong>ления(дизель-генератора), также спроектиро<strong>в</strong>анный сиспользо<strong>в</strong>анием предлагаемой технологии. Фрагментпрограммной документации этого имитатора при<strong>в</strong>еден <strong>в</strong>следующем разделе.4.3.1. Документиро<strong>в</strong>ание процесса проектиро<strong>в</strong>ания системыупра<strong>в</strong>ленияПри<strong>в</strong>едем перечень сокращений, которые используются <strong>в</strong>дальнейшем:ГО - газоохладитель, газоот<strong>в</strong>од;ГПК - гла<strong>в</strong>ный пуско<strong>в</strong>ой клапан;Д1СЧВ, Д2СЧВ, Д3СЧВ - датчики 1-ой, 2-ой и 3-ей ступенейчастоты <strong>в</strong>ращения;ДВПМ - датчик <strong>в</strong>алопро<strong>в</strong>оротного механизма;ДГ - дизель-генератор;ДПКВ - датчик про<strong>в</strong>орота колен<strong>в</strong>ала;ДППВ - датчик положения предельного <strong>в</strong>ыключателя;ДЧВ - датчик частоты <strong>в</strong>ращения;МВП - механизм <strong>в</strong>алопро<strong>в</strong>оротный;МПН - маслопрокачи<strong>в</strong>ающий насос;ОКС - общекорабельная система;ПРЕД - предельная частота <strong>в</strong>ращения;РЧВ - рабочая частота <strong>в</strong>ращения, регулятор частоты<strong>в</strong>ращения;СУ - система упра<strong>в</strong>ления;ЧВНЗ - частота <strong>в</strong>ращения начала зали<strong>в</strong>ания;ЧВО - частота <strong>в</strong>ращения остано<strong>в</strong>а.В настоящей работе не при<strong>в</strong>едены следующие документы,<strong>в</strong>ключенные <strong>в</strong> программную документацию: структурная схемасистемы упра<strong>в</strong>ления, отражающая ее приборный соста<strong>в</strong>;<strong>в</strong>идеокадры операторского интерфейса системы; перечни


89событий, <strong>в</strong>ходных переменных и <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий;тексты системоза<strong>в</strong>исимой части программы.Взаимодейст<strong>в</strong>ие разработанных а<strong>в</strong>томато<strong>в</strong> отражено насхеме (рис. 23), которая напоминает диаграмму классо<strong>в</strong>,созда<strong>в</strong>аемую при объектно-ориентиро<strong>в</strong>анном проектиро<strong>в</strong>ании.Обработчики событийA01А<strong>в</strong>томат разборафайларекомендацийВызы<strong>в</strong>ает <strong>в</strong> циклеА<strong>в</strong>томат A63расшифро<strong>в</strong>киа<strong>в</strong>арийныхситуацийA20А<strong>в</strong>томат<strong>в</strong>ключенияотключенияСУA60А<strong>в</strong>томатостано<strong>в</strong>кимаслопрокачи<strong>в</strong>ающегонасосаA61А<strong>в</strong>томат <strong>в</strong>ыдачисигнала ПОЛНАЯОСТАНОВКА ДГ <strong>в</strong>генераторный щитA80А<strong>в</strong>томатупра<strong>в</strong>ленияклапаном собратной с<strong>в</strong>язьюA10A5А<strong>в</strong>томатупра<strong>в</strong>лениячастотой<strong>в</strong>ращенияA13А<strong>в</strong>томатупра<strong>в</strong>лениянасосомохлажденияA7А<strong>в</strong>томат а<strong>в</strong>арийнойипредупредительнойсигнализацииA7, A12 A71, A72, A74, A77, A78A80A0, A1, A2, A9, A11, A12,A12_0, A13А<strong>в</strong>томат получаетзначения переменных,кодирующих состоянияэтих а<strong>в</strong>томато<strong>в</strong>А<strong>в</strong>томат передаетзначения переменной,кодирующей егосостояние, <strong>в</strong> эти а<strong>в</strong>томатыA0А<strong>в</strong>томатпереключениярежимо<strong>в</strong> работыСУA1, A2, A3, A4, A7, A8, A9,A10, A11, A12A62A62А<strong>в</strong>томатиндикации ирегистрациипараметро<strong>в</strong> ДГA0A71А<strong>в</strong>томатконтролятемпературымаслаA72А<strong>в</strong>томатконтроляда<strong>в</strong>лениямаслаA73А<strong>в</strong>томатконтроляда<strong>в</strong>ления<strong>в</strong>одыA74А<strong>в</strong>томатконтролятемпературы<strong>в</strong>одыA75А<strong>в</strong>томатконтроляда<strong>в</strong>лениянадду<strong>в</strong>аA76А<strong>в</strong>томатконтролятемпературы<strong>в</strong>ыхлопныхгазо<strong>в</strong>A77А<strong>в</strong>томатконтроляда<strong>в</strong>ления<strong>в</strong> отсекеA78А<strong>в</strong>томатконтроляуро<strong>в</strong>ня <strong>в</strong>оды<strong>в</strong> охладителеA1А<strong>в</strong>томатпредпуско<strong>в</strong>ыхоперацийA2А<strong>в</strong>томатпускаA3А<strong>в</strong>томатостано<strong>в</strong>аA4А<strong>в</strong>томатэкстренногоостано<strong>в</strong>аА<strong>в</strong>томат A8ожиданияразрешения<strong>в</strong>ыполненияпредпуско<strong>в</strong>ыхоперацийA9А<strong>в</strong>томатконтролягото<strong>в</strong>ности кпускуA10А<strong>в</strong>томатоткрытиянаружнойзахлопкиA11А<strong>в</strong>томата<strong>в</strong>арийнойблокиро<strong>в</strong>киA12А<strong>в</strong>томата<strong>в</strong>арийнойзащитыA7 A7 A7 A7 A7A1_0, A3, A4,A3, A4, A7 A4A3, A4, A7 A80A7A0, A1, A2, A0, A1, A2,A0A0A0A0A0A9 A3, A4_0, A9A5, A60, A5, A60,A5, A60, A80 A60, A80A60, A80 A80A61, A80 A61, A80A7A0A7A0, A12_0,A13A5, A60,A61, A80А<strong>в</strong>томат запускает этиа<strong>в</strong>томаты их с<strong>в</strong>оих<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ийA15А<strong>в</strong>томатконтроляпро<strong>в</strong>оротаA4_0А<strong>в</strong>томатконтроляпредельного<strong>в</strong>ыключателяA12_0А<strong>в</strong>томатконтроляпредельного<strong>в</strong>ыключателяA1A4A7, A12Рис. 23. Схема <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>В соот<strong>в</strong>етст<strong>в</strong>ии с этой схемой разработана остальнаяпрограммная документация системы упра<strong>в</strong>ления, <strong>в</strong>ключающаятексты программ системонеза<strong>в</strong>исимой части и протоколыработы системы, под<strong>в</strong>ерждающие пра<strong>в</strong>ильность еефункциониро<strong>в</strong>ания. Однако, <strong>в</strong> силу ее большого объема, онапри<strong>в</strong>одится не полностью. Дальнейшее изложение материалапро<strong>в</strong>едем на фрагменте системы, схема <strong>в</strong>заимодейст<strong>в</strong>ияа<strong>в</strong>томато<strong>в</strong> которого показана на рис. 24. В этой схеме,также, как и <strong>в</strong> предыдущей, а<strong>в</strong>томаты <strong>в</strong>заимодейст<strong>в</strong>уют по<strong>в</strong>ложенности, <strong>в</strong>ызы<strong>в</strong>аемости и обмену номерами состояний.


90Обработчики событийA20А<strong>в</strong>томат<strong>в</strong>ключенияотключенияСУA7А<strong>в</strong>томата<strong>в</strong>арийной и предупредительнойсигнализацииА<strong>в</strong>томат переключениярежимо<strong>в</strong> работы СУA0A71, A72, A74, A77, A78A0, A1, A2, A9, A11, A12, A12_0, A13A1, A2, A3, A4, A7, A8, A9, A10, A11, A12A62А<strong>в</strong>томат A71контролятемпературымаслаA72А<strong>в</strong>томатконтроляда<strong>в</strong>ления маслаA1А<strong>в</strong>томатпредпуско<strong>в</strong>ыхоперацийA3А<strong>в</strong>томат остано<strong>в</strong>аA8А<strong>в</strong>томат ожиданияразрешения <strong>в</strong>ыполненияпредпуско<strong>в</strong>ых операцийA7 A7A15, A3, A4, A7A4A0A0A0, A1, A2, A9A5, A60, A80 A5, A60, A61, A80A15А<strong>в</strong>томатконтроляпро<strong>в</strong>оротаA1Рис. 24. Фрагмент схемы <strong>в</strong>заимодейст<strong>в</strong>ияа<strong>в</strong>томато<strong>в</strong>Для каждого из а<strong>в</strong>томато<strong>в</strong>, при<strong>в</strong>еденных на этой схеме,разработаны четыре документа: сло<strong>в</strong>есное описание; схемас<strong>в</strong>язей; граф переходо<strong>в</strong>; текст функции, реализующейа<strong>в</strong>томат. При этом для а<strong>в</strong>томато<strong>в</strong>, реализующих режимыработы, я<strong>в</strong>но описанные <strong>в</strong> техническом задании, <strong>в</strong> качест<strong>в</strong>есло<strong>в</strong>есного описания при<strong>в</strong>одятся его соот<strong>в</strong>етст<strong>в</strong>ующиефрагменты. Выполнение указанными а<strong>в</strong>томатами, построенными"по моти<strong>в</strong>ам" этих описаний, требо<strong>в</strong>аний техническогозадания подт<strong>в</strong>ерждается протоколами работы системы. Примеродного из таких протоколо<strong>в</strong> при<strong>в</strong>еден <strong>в</strong> конце раздела 1.4.3.2. А<strong>в</strong>томат <strong>в</strong>ключения-отключения системы упра<strong>в</strong>ления4.3.2.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат, реализующий данный алгоритм я<strong>в</strong>ляетсяголо<strong>в</strong>ным <strong>в</strong> схеме <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>. Этот а<strong>в</strong>томатобеспечи<strong>в</strong>ает <strong>в</strong>ыполнение перечисленных ниже дейст<strong>в</strong>ий и<strong>в</strong>ызо<strong>в</strong> <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>.


911. При запуске программы <strong>в</strong>ыполняется инициализация<strong>в</strong>сех органо<strong>в</strong> упра<strong>в</strong>ления.2. При пере<strong>в</strong>оде переключателя "дистанционное/местноеупра<strong>в</strong>ление" <strong>в</strong> положении "местное" а<strong>в</strong>томат <strong>в</strong>ыполняетинициализацию исполнительных механизмо<strong>в</strong> и переходит <strong>в</strong>отключенное состояние.3. При пере<strong>в</strong>оде переключателя "дистанционное/местноеупра<strong>в</strong>ление" <strong>в</strong> положении "дистанционное" а<strong>в</strong>томат запускаетгенератор синхроимпульсо<strong>в</strong> (период 0.5 с) и начинает<strong>в</strong>ыполнение алгоритма упра<strong>в</strong>ления.При этом:− при нажатии кнопки "К<strong>в</strong>итиро<strong>в</strong>ание" <strong>в</strong>се мигающиетабло пере<strong>в</strong>одятся <strong>в</strong> постоянное с<strong>в</strong>ечение и отключаетсяобобщенная з<strong>в</strong>уко<strong>в</strong>ая сигнализация;− при поя<strong>в</strong>лении сигнала "Предельный <strong>в</strong>ыключатель"<strong>в</strong>ключается соото<strong>в</strong>етст<strong>в</strong>ующее табло;− при исчезно<strong>в</strong>ении сигнала "Предельный <strong>в</strong>ыключатель"<strong>в</strong>ыключается соото<strong>в</strong>етст<strong>в</strong>ующее табло.Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 25, 26.


4.3.2.2. Схема с<strong>в</strong>язей92Вложенные а<strong>в</strong>томаты: A0, A5, A7, A13, A62Переключатель"Дистанционное/местное"Положение "ДИСТАНЦИОННОЕ"x10А20z80_0 Отключить табло ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ Мнемосхемаz80_1Включить табло ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬОбработчикисобытийИнициализация при пер<strong>в</strong>ом запуске программыВключение СУ (отключение местного упра<strong>в</strong>ления)Отключение СУ (<strong>в</strong>ключение местного упра<strong>в</strong>ления)Нажатие кнопки КВИТИРОВАНИЕПоя<strong>в</strong>ление сигнала ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬИсчезно<strong>в</strong>ение сигнала ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬe0e1e2e50e120e121z240z600z700_0z870Пере<strong>в</strong>ести <strong>в</strong>сеа<strong>в</strong>арийные табло <strong>в</strong>постоянное с<strong>в</strong>ечениеИнициализацияисполнительныхмеханизмо<strong>в</strong>Отключитьобобщенную з<strong>в</strong>уко<strong>в</strong>уюсигнализациюИнициализация<strong>в</strong>сех а<strong>в</strong>томато<strong>в</strong>z1100_0 Остано<strong>в</strong>ить таймер Таймер опросадатчика да<strong>в</strong>ления <strong>в</strong>z1100_1Запустить таймеротсеке0.5 сРис. 25. Схема с<strong>в</strong>язей а<strong>в</strong>томата <strong>в</strong>ключения-отключениясистемы упра<strong>в</strong>ления4.3.2.3. Граф переходо<strong>в</strong>0. Начальноеe0⋅x10e0 ⋅ x10z: 600; 8701. СУ отключенаz: 600; 870; 1100_0e1e22. СУ <strong>в</strong>ключенаA7; A0; A5; A13; A62z1100_1e50z: 240; 700_0e120z80_1e121z80_0Рис. 26. Граф переходо<strong>в</strong> а<strong>в</strong>томата <strong>в</strong>ключенияотключениясистемы упра<strong>в</strong>ления4.3.2.4. Текст функции, реализующей а<strong>в</strong>томат#include "photon_stuff.h"#include "dg.h"#include "log.h"#include "defines.h"void A20( int e, dg_t *dg ){int y_old = dg->y20 ;#ifdef HEAD_EVENTS_LOGGINGlog_exec( dg, "A20", y_old, e ) ;#endif


93switch( dg->y20 ){case 0:if( e == 0 && !x10(dg) ) dg->y20 = 1 ;elseif( e == 0 && x10(dg) ) { z600(dg) ; z870(dg) ; dg->y20 = 2 ; } ;break ;case 1:if( e == 1 ) dg->y20 = 2 ;break ;case 2:A7( e, dg ) ; A0( e, dg ) ; A5( e, dg ) ; A13( e, dg ) ; A62( e, dg ) ;if( e == 2 ) dg->y20 = 1 ;elseif( e == 50 ) { z240(dg) ; z700_0(dg) ; }elseif( e == 121 ) { z80_0(dg) ; }elseif( e == 120 ) { z80_1(dg) ; } ;break ;default:#ifdef GRAPH_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, dg->number,"ERROR IN A20: unknown state number!", 0 ) ;#endifbreak ;} ;if( y_old == dg->y20 ) goto A20_end ;{#ifdef GRAPH_TRANS_LOGGINGlog_trans( dg, "A20", y_old, dg->y20 ) ;#endif#ifdef DEBUG_FRAMEupdate_debug() ;#endif} ;switch( dg->y20 ){case 1:z600(dg) ; z870(dg) ; z1100_0(dg) ;break ;} ;case 2:A7( 0, dg ) ; A0( 0, dg ) ; A5( 0, dg ) ; A13( 0, dg ) ; A62( 0, dg ) ;z1100_1(dg) ;break ;A20_end:#ifdef HEAD_ENDS_LOGGINGlog_end( dg, "A20", dg->y20, e ) ;#endif;} ;4.3.3. А<strong>в</strong>томат переключения режимо<strong>в</strong> работы системыупра<strong>в</strong>ления4.3.3.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат переключения режимо<strong>в</strong> работы реализуетосно<strong>в</strong>ной алгоритм упра<strong>в</strong>ления. А<strong>в</strong>томаты, <strong>в</strong>ложенные <strong>в</strong> его


94состояния, обеспечи<strong>в</strong>ают детализацию алгоритма работы <strong>в</strong>соот<strong>в</strong>етст<strong>в</strong>ующих режимах. Перечислим эти режимы.1. Дизель остано<strong>в</strong>лен. В рассматри<strong>в</strong>аемом режимеосущест<strong>в</strong>ляется про<strong>в</strong>ерка усло<strong>в</strong>ий начала <strong>в</strong>ыполненияалгоритма предпуско<strong>в</strong>ых операций. Если при нахождениисистемы упра<strong>в</strong>ления <strong>в</strong> этом режиме дизель-генератор былзапущен <strong>в</strong> обход ее, то система отреагирует на этопереходом <strong>в</strong> устано<strong>в</strong>и<strong>в</strong>шийся режим. Срабаты<strong>в</strong>ание одного изалгоритмо<strong>в</strong> а<strong>в</strong>арийной и предупредительной сигнализации <strong>в</strong>этом режиме при<strong>в</strong>одит к переходу системы <strong>в</strong> режим а<strong>в</strong>арийнойблокиро<strong>в</strong>ки.2. Предпуско<strong>в</strong>ые операции. В рассматри<strong>в</strong>аемом режиме<strong>в</strong>ыполняется алгоритм предпуско<strong>в</strong>ых операций.3. К пуску гото<strong>в</strong>. Режим соот<strong>в</strong>етст<strong>в</strong>ует удачномуза<strong>в</strong>ершению <strong>в</strong>ыполнения алгоритма предпуско<strong>в</strong>ых операций. Вэтом режиме система про<strong>в</strong>еряет сохранились ли усло<strong>в</strong>ия,разрешающие пуск. При нажатии оператором кнопки "Пуск"начинается <strong>в</strong>ыполнение алгоритма пуска.4. Выполняется пуск. В рассматри<strong>в</strong>аемом режиме<strong>в</strong>ыполняется алгоритм пуска, при успешном осущест<strong>в</strong>лениикоторого система переходит <strong>в</strong> устано<strong>в</strong>и<strong>в</strong>шийся режим.5. Устано<strong>в</strong>и<strong>в</strong>шийся режим. В этом режиме принеобходимости <strong>в</strong>ыполняется алгоритм открытия наружнойзахлопки, реализуемый а<strong>в</strong>томатом A10. Выход из этогорежима происходит <strong>в</strong> начале <strong>в</strong>ыполнения одного из <strong>в</strong>идо<strong>в</strong>остано<strong>в</strong>а, при срабаты<strong>в</strong>ании алгоритма а<strong>в</strong>арийной защиты илипри остано<strong>в</strong>е дизель-генератора <strong>в</strong> обход системыупра<strong>в</strong>ления.6. Остано<strong>в</strong>. В рассматри<strong>в</strong>аемом режиме <strong>в</strong>ыполненяетсяалгоритм остано<strong>в</strong>а. Указанный алгоритм может быть прер<strong>в</strong>ан<strong>в</strong> случае экстренного остано<strong>в</strong>а.7. Экстренный остано<strong>в</strong>. В рассматри<strong>в</strong>аемом режиме<strong>в</strong>ыполненяется алгоритм экстренного остано<strong>в</strong>а. После


95за<strong>в</strong>ершения этого алгоритма система переходит <strong>в</strong> режима<strong>в</strong>арийной блокиро<strong>в</strong>ки.8. А<strong>в</strong>арийная блокиро<strong>в</strong>ка. В этом режиме система ждетпока оператор подт<strong>в</strong>ердит с<strong>в</strong>ою реакцию на а<strong>в</strong>арию нажатиемкнопки "К<strong>в</strong>итиро<strong>в</strong>ание" и, устрани<strong>в</strong> а<strong>в</strong>арию, нажмет кнопку"Разблокиро<strong>в</strong>ка".9. А<strong>в</strong>арийная защита. Этот режим аналогичен режимуэкстренного остано<strong>в</strong>а.Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 27, 28.4.3.3.2. Схема с<strong>в</strong>язейВложен <strong>в</strong> а<strong>в</strong>томат A20. Вложенные а<strong>в</strong>томаты: A1, A2, A3, A4, A8, A9, A10, A11, A12ДЧВА<strong>в</strong>томатпредпуско<strong>в</strong>ыхоперацийA1РЧВЧастота <strong>в</strong>ращения больше РЧВГото<strong>в</strong>ность к пускуНет про<strong>в</strong>оротаВыполнение предпуско<strong>в</strong>ых операций прекращеноx220y1 = 2y1 = 3y1 = 0А0z290_0z290_1z290_2z290_3Индикация состояния "ДГ остано<strong>в</strong>лен"Индикация состояния "ДГ запущен"Индикация состояния "ДГ запускается"Индикация состояния "ДГ остана<strong>в</strong>ли<strong>в</strong>ается"МнемосхемаА<strong>в</strong>томат пускаA2Успешный пускНет пускаy2 = 3y2 = 4А<strong>в</strong>томат остано<strong>в</strong>аA3Начато <strong>в</strong>ыполнение остано<strong>в</strong>аЗа<strong>в</strong>ершено <strong>в</strong>ыполнение остано<strong>в</strong>аy3 ≠ 0y3 = 0А<strong>в</strong>томат экстренногоостано<strong>в</strong>аA4Начато <strong>в</strong>ыполнение экстренного остано<strong>в</strong>аЗа<strong>в</strong>ершено <strong>в</strong>ыполнение экстренного остано<strong>в</strong>аy4 ≠ 0y4 = 0А<strong>в</strong>томат а<strong>в</strong>арийной и А<strong>в</strong>арийный остано<strong>в</strong>y7 = 2предупредительнойРазноссигнализации A7 y7 = 4А<strong>в</strong>томат определениясигнала начала <strong>в</strong>ыполненияпредпуско<strong>в</strong>ых операцийA8А<strong>в</strong>томат контролягото<strong>в</strong>ности к пускуA9А<strong>в</strong>томат открытиянаружной захлопкиA10А<strong>в</strong>томат а<strong>в</strong>арийнойблокиро<strong>в</strong>киA11А<strong>в</strong>томат а<strong>в</strong>арийнойзащитыA12Запрошено и разрешено <strong>в</strong>ыполнение предпуско<strong>в</strong>ыхоперацийОтмена гото<strong>в</strong>ности к пускуЗахлопка не открыласьРазблокиро<strong>в</strong>каВыполнение алгоритма за<strong>в</strong>ершеноy8 = 2y9 = 0y10 = 5y11 = 2y12 = 0ОбработчикисобытийНажатие кнопки ПУСКe20Рис. 27. Схема с<strong>в</strong>язей а<strong>в</strong>томата переключения режимо<strong>в</strong>работы системы упра<strong>в</strong>ления


4.3.3.3. Граф переходо<strong>в</strong>961 : x2201 : y9 = 0x2200. Дизель остано<strong>в</strong>лен1. Предпуско<strong>в</strong>ые операции2. К пуску гото<strong>в</strong>3. Выполняется пуск4. Устано<strong>в</strong>и<strong>в</strong>шийся режимy8 = 2y1 = 2e20y2 = 3A8A4, A3, A1A4, A3, A9A4, A3, A2A4, A3, A10z290_0y1 = 0 z290_0z290_0z290_2z290_12 : y7 = 2y1 = 3y2 = 42 : (y7 = 2) ∨ (y7 = 4)y10 = 5y11= 27. А<strong>в</strong>арийная блокиро<strong>в</strong>каA11z290_0y12 = 08. А<strong>в</strong>арийная защитаA12z290_3y4 = 06. Экстренный стопA4z290_31 : y4 ≠ 0y3 = 01 : y4 ≠ 05. Остано<strong>в</strong>A4, A3z290_3y3 ≠ 0Рис. 28. Граф переходо<strong>в</strong> а<strong>в</strong>томата переключения режимо<strong>в</strong>работы системы упра<strong>в</strong>ления4.3.3.4. Текст функции, реализующей а<strong>в</strong>томат#include "photon_stuff.h"#include "dg.h"#include "log.h"#include "defines.h"void A0( int e, dg_t *dg ){int y_old = dg->y0 ;#ifdef A0_BEGIN_LOGGINGlog_begin( dg, "A0", y_old, e ) ;#endifswitch( dg->y0 ){case 0:A8( e, dg ) ;if( x220(dg) ) dg->y0 = 4 ;elseif( dg->y7 == 2 ) dg->y0 = 7 ;elseif( dg->y8 == 2 ) dg->y0 = 1 ;break ;case 1:A4( e, dg ) ; A3( e, dg ) ; A1( e, dg ) ;if( dg->y4 != 0 ) dg->y0 = 6 ;elseif( dg->y7 == 2 || dg->y7 == 4 ) dg->y0 = 8 ;else


97if( dg->y3 != 0 ) dg->y0 = 5 ;elseif( dg->y1 == 0 ) dg->y0 = 0 ;elseif( dg->y1 == 3 ) dg->y0 = 7 ;elseif( dg->y1 == 2 ) dg->y0 = 2 ;break ;case 2:A4( e, dg ) ; A3( e, dg ) ; A9( e, dg ) ;if( dg->y4 != 0 ) dg->y0 = 6 ;elseif( dg->y7 == 2 || dg->y7 == 4 ) dg->y0 = 8 ;elseif( dg->y3 != 0 ) dg->y0 = 5 ;elseif( dg->y9 == 0 ) dg->y0 = 0 ;elseif( e == 20 ) dg->y0 = 3 ;break ;case 3:A4( e, dg ) ; A3( e, dg ) ; A2( e, dg ) ;if( dg->y4 != 0 ) dg->y0 = 6 ;elseif( dg->y7 == 2 || dg->y7 == 4 ) dg->y0 = 8 ;elseif( dg->y3 != 0 ) dg->y0 = 5 ;elseif( dg->y2 == 4 ) dg->y0 = 7 ;elseif( dg->y2 == 3 ) dg->y0 = 4 ;break ;case 4:A4( e, dg ) ; A3( e, dg ) ; A10( e, dg ) ;if( dg->y4 != 0 ) dg->y0 = 6 ;elseif( dg->y7 == 2 || dg->y7 == 4 ) dg->y0 = 8 ;elseif( dg->y3 != 0 ) dg->y0 = 5 ;elseif( dg->y10 == 5 ) dg->y0 = 8 ;elseif( !x220(dg) ) dg->y0 = 0 ;break ;case 5:A4( e, dg ) ; A3( e, dg ) ;if( dg->y4 != 0 ) dg->y0 = 6 ;elseif( dg->y3 == 0 ) dg->y0 = 0 ;break ;case 6:A4( e, dg ) ;if( dg->y4 == 0 ) dg->y0 = 7 ;break ;case 7:A11( e, dg ) ;if( dg->y11 == 2 ) dg->y0 = 0 ;break ;case 8:A12( e, dg ) ;if( dg->y12 == 0 ) dg->y0 = 7 ;break ;default:#ifdef A0_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, dg->number,"Ошибка <strong>в</strong> а<strong>в</strong>томате A0: неиз<strong>в</strong>естный номер состояния!", 0 ) ;#endif} ;


98if( y_old == dg->y0 ) goto A0_end ;{#ifdef A0_TRANS_LOGGINGlog_trans( "A0", y_old, dg->y0 ) ;#endif#ifdef DEBUG_FRAMEupdate_debug() ;#endif} ;switch( dg->y0 ){case 0:A8( 0, dg ) ;z290_0(dg) ;break ;case 1:A4( 0, dg ) ; A3( 0, dg ) ; A1( 0, dg ) ;z290_0(dg) ;break ;case 2:A4( 0, dg ) ; A3( 0, dg ) ; A9( 0, dg ) ;z290_0(dg) ;break ;case 3:A4( 0, dg ) ; A3( 0, dg ) ; A2( 0, dg ) ;z290_2(dg) ;break ;case 4:A4( 0, dg ) ; A3( 0, dg ) ; A10( 0, dg ) ;z290_1(dg) ;break ;case 5:A4( 0, dg ) ; A3( 0, dg ) ;z290_3(dg) ;break ;case 6:A4( 0, dg ) ;z290_3(dg) ;break ;case 7:A11( 0, dg ) ;z290_0(dg) ;break ;case 8:A12( 0, dg ) ;z290_3(dg) ;break ;} ;A0_end: ;#ifdef A0_END_LOGGINGlog_end( dg, "A0", dg->y0, e ) ;#endif} ;4.3.4. А<strong>в</strong>томат предпуско<strong>в</strong>ых операций4.3.4.1. Сло<strong>в</strong>есное описание1. Перечислим сигналы, блокирующие про<strong>в</strong>едениепредпуско<strong>в</strong>ых операций.


991.1. Обобщенный сигнал "Блокиро<strong>в</strong>ка пуска" из СУ ОКС.При наличии этого сигнала <strong>в</strong>ыдается сигнал "Подгото<strong>в</strong>капуска" <strong>в</strong> указанную систему.1.2. Сигнал "Механизм <strong>в</strong>алопро<strong>в</strong>оротный не отключен".1.3. Сигнал "Предельный <strong>в</strong>ыключатель".1.4. Дизель не остано<strong>в</strong>лен — частота <strong>в</strong>ращенияпре<strong>в</strong>ышает рабочую частоту.1.5. Команда на <strong>в</strong>ыполнение любого <strong>в</strong>ида остано<strong>в</strong>а.1.6. Наличие сигнала "Вода <strong>в</strong> охладителе" (а<strong>в</strong>арийныйуро<strong>в</strong>ень).2. При наличии хотя бы одного из сигнало<strong>в</strong>, указанных<strong>в</strong> п.п.1.2...1.6, система упра<strong>в</strong>ления не должна приниматьупра<strong>в</strong>ляющую команду подгото<strong>в</strong>ки к пуску.3. При нажатии оператором кнопки "Подгото<strong>в</strong>ка к пуску"<strong>в</strong>ыдается сигнал <strong>в</strong> СУ ОКС. После снятия сигнала"Блокиро<strong>в</strong>ка пуска" из СУ ОКС и при отсутст<strong>в</strong>ии блокирующихсигнало<strong>в</strong> по п.п. 1.2...1.6, система должна <strong>в</strong>ыполнитьперечисленные ниже дейст<strong>в</strong>ия.3.1. Запомнить команду на подгото<strong>в</strong>ку к пуску.3.2. Включить табло "Подгото<strong>в</strong>ка к пуску".3.3. Выдать команду на <strong>в</strong>ключение маслопрокачи<strong>в</strong>ающегонасоса, замкну<strong>в</strong> контакт <strong>в</strong> цепи его магнитного пускателя.3.4. Включить табло "Прокачка маслом" при замыканииконтакта пускателя маслопрокачи<strong>в</strong>ающего насоса.3.5. Подать питание на электромагнит стопа регуляторачастоты <strong>в</strong>ращения.3.6. Подать команду на открытие клапана подачи<strong>в</strong>оздуха к дизель-генератору.3.7. Подать команду на открытие клапана <strong>в</strong>оздуханизкого да<strong>в</strong>ления.3.8. Включить табло "Про<strong>в</strong>орот".3.9. Включить контроль <strong>в</strong>ремени про<strong>в</strong>орота (60 с).


1003.10. Выдать команду <strong>в</strong> регулятор частоты <strong>в</strong>ращения наустано<strong>в</strong>ку пер<strong>в</strong>ой ступени частоты, и через 4 с снять этукоманду.4. После получения 3-х импульсо<strong>в</strong> от датчика про<strong>в</strong>оротаколенчатого <strong>в</strong>ала, до истечения <strong>в</strong>ремени по п. 3.9, системаупра<strong>в</strong>ления должна <strong>в</strong>ыполнить перечисленные ниже дейст<strong>в</strong>ия.4.1. Снять питание с электромагнита клапана <strong>в</strong>оздуханизкого да<strong>в</strong>ления.4.2. Отключить табло "Про<strong>в</strong>орот".4.3. Отключить контроль <strong>в</strong>ремени про<strong>в</strong>орота (60 с).5. При пре<strong>в</strong>ышении да<strong>в</strong>лением масла предпуско<strong>в</strong>огода<strong>в</strong>ления и отработки команды на уменьшение заданнойчастоты <strong>в</strong>ращения до пер<strong>в</strong>ой ступени, система упра<strong>в</strong>лениядолжна <strong>в</strong>ыполнить перечисленные ниже дейст<strong>в</strong>ия.5.1. Снять команду на <strong>в</strong>ключение маслопрокачи<strong>в</strong>ающегонасоса.5.2. Снять команды на подгото<strong>в</strong>ку к пуску,перечисленные <strong>в</strong> п.3.5.3. Отключить табло "Подгото<strong>в</strong>ка к пуску".5.4. Включить табло "Пуск разрешен".5.5. Включить память за<strong>в</strong>ершения предпуско<strong>в</strong>ых операцийи дать разрешение на <strong>в</strong>ыполнение пуска.6. В случае снижения да<strong>в</strong>ления масла нижепредпуско<strong>в</strong>ого да<strong>в</strong>ления или у<strong>в</strong>еличения затяжки пружинырегулятора частоты <strong>в</strong>ращения до третьей позиции илипоя<strong>в</strong>ления блокирующих сигнало<strong>в</strong> по п. 1.1—1.3, 1.5, 1.6система упра<strong>в</strong>ления должна <strong>в</strong>ыполнить перечисленные нижедейст<strong>в</strong>ия.6.1. Отключить память за<strong>в</strong>ершения предпуско<strong>в</strong>ыхопераций.6.2. Отключить табло "Пуск разрешен".6.3. Разомкнуть контакт остано<strong>в</strong>ки маслопрокачи<strong>в</strong>ающегонасоса и через 4 с <strong>в</strong>но<strong>в</strong>ь замкнуть его.


1016.4. Снять питание с электромагнита остано<strong>в</strong>кирегулятора частоты <strong>в</strong>ращения.6.5. Отключить табло "Прокачка маслом" при размыканииконтакта пускателя маслопрокачи<strong>в</strong>ающего насоса.6.6. Снять команду на открытие клапана подачи <strong>в</strong>оздухак дизель-генератору.7. Если по истечении <strong>в</strong>ремени (п. 3.9) от датчикапро<strong>в</strong>орота колен<strong>в</strong>ала не поступило 3-х импульсо<strong>в</strong>, тосистема упра<strong>в</strong>ления должна <strong>в</strong>ыполнить перечисленные нижедейст<strong>в</strong>ия.7.1. Включить а<strong>в</strong>арийное табло "Нет про<strong>в</strong>орота".7.2. Включить обобщенный сигнал з<strong>в</strong>уко<strong>в</strong>ойсигнализации.7.3. Отключить табло "Подгото<strong>в</strong>ка к пуску".7.4. Снять питание с электромагнита клапана пуско<strong>в</strong>ого<strong>в</strong>оздуха низкого да<strong>в</strong>ления.7.5. Отключить контроль <strong>в</strong>ремени про<strong>в</strong>орота (60 cек).7.6. Снять команду на <strong>в</strong>ключение маслопрокачи<strong>в</strong>ающегонасоса.7.7. Разомкнуть контакт остано<strong>в</strong>ки маслопрокачи<strong>в</strong>ающегонасоса и через 4 с <strong>в</strong>но<strong>в</strong>ь замкнуть этот контакт.7.8. Отключить табло "Прокачка маслом" при размыканииконтакта пускателя маслопрокачи<strong>в</strong>ающего насоса.7.9. Отключить память команды на подгото<strong>в</strong>ку к пуску.7.10. Снять команду на открытие клапана подачи<strong>в</strong>оздуха к дизель-генератору.8. Отключение обобщенной з<strong>в</strong>уко<strong>в</strong>ой сигнализации ипере<strong>в</strong>од а<strong>в</strong>арийного табло "Нет про<strong>в</strong>орота" <strong>в</strong> постоянноес<strong>в</strong>ечение произ<strong>в</strong>одится нажатием кнопки "К<strong>в</strong>итиро<strong>в</strong>ание".9. Разблокиро<strong>в</strong>ка системы упра<strong>в</strong>ления и отключениетабло "Нет про<strong>в</strong>орота" произ<strong>в</strong>одится нажатием кнопки"Разблокиро<strong>в</strong>ка".


102Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 29, 30.4.3.4.2. Схема с<strong>в</strong>язейВложен <strong>в</strong> а<strong>в</strong>томат A0. Вложенные а<strong>в</strong>томаты: A15Д1СЧВД2СЧВД3СЧВДатчик да<strong>в</strong>лениямаслаСигнализаторуро<strong>в</strong>ня <strong>в</strong>оды <strong>в</strong> ГОДВПМДППВА<strong>в</strong>томат контроляпро<strong>в</strong>оротаA15А<strong>в</strong>томат остано<strong>в</strong>аA3А<strong>в</strong>томат экстренногоостано<strong>в</strong>аA4Пер<strong>в</strong>ая ступень частоты <strong>в</strong>ращенияВторая ступень частоты <strong>в</strong>ращенияТретья ступень частоты <strong>в</strong>ращенияДа<strong>в</strong>ление масла больше предпуско<strong>в</strong>огоВал ДГ произ<strong>в</strong>ел три оборотаНет про<strong>в</strong>оротаВыполняется а<strong>в</strong>томатизиро<strong>в</strong>анный остано<strong>в</strong>Выполняется экстренный остано<strong>в</strong>x280x290x300x350у15 = 2у15 = 3у3 ≠ 0у4 ≠ 0А<strong>в</strong>томат а<strong>в</strong>арийной и А<strong>в</strong>арийный остано<strong>в</strong>y7 = 2предупредительнойРазноссигнализации A7 y7 = 4ОбработчикисобытийНаличие сигнала ВОДА В ОХЛАДИТЕЛЕ(а<strong>в</strong>арийный уро<strong>в</strong>ень)Наличие сигнала МВП НЕ ОТКЛЮЧЕННаличие сигналаПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬАкти<strong>в</strong>ация <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>Поя<strong>в</strong>ление сигналаБЛОКИРОВКА ПУСКА из СУ ОКСx500x510x520e0e70А1z10_0Отключить табло ПОДГОТОВКА К ПУСКУМнемосхемаz40_2 Включить мигающее табло НЕТ ПРОВОРОТАz10_1Включить табло ПОДГОТОВКА К ПУСКУz20_0Отключить табло ПРОКАЧКА МАСЛОМz20_1Включить табло ПРОКАЧКА МАСЛОМz30_0Отключить табло ПРОВОРОТz30_1Включить табло ПРОВОРОТВыдать команду на отключение МПН (e420)z400_0А<strong>в</strong>томат упра<strong>в</strong>ленияклапаном с обратнойМагнитныйВыдать команду на <strong>в</strong>ключение МПН (e410)z400_1с<strong>в</strong>язью A80 пускатель МПНz810_0 Остано<strong>в</strong>ить таймерz410А<strong>в</strong>томат остано<strong>в</strong>киОстано<strong>в</strong>ить МПН на 4-е секунды (e390)МПНКонтактA60остано<strong>в</strong>ки МПНz420_0Снять питание с электромагнита стопа РЧВЭлектромагнит стопаz420_1Подать питание на электромагнит стопа РЧВРЧВВыдать команду на закрытие клапана подачи <strong>в</strong>оздуха к ДГ (e420)z430_0А<strong>в</strong>томат упра<strong>в</strong>ленияклапаном с обратнойКлапан подачиВыдать команду на открытие клапана подачи <strong>в</strong>оздуха к ДГ (e410)z430_1с<strong>в</strong>язью A80 <strong>в</strong>оздуха к ДГВыдать команду на закрытие клапана подачи <strong>в</strong>оздуха низкого да<strong>в</strong>ления (e420)z440_0А<strong>в</strong>томат упра<strong>в</strong>ления Клапан подачиклапаном с обратной <strong>в</strong>оздуха низкогоВыдать команду на открытие клапана подачи <strong>в</strong>оздуха низкого да<strong>в</strong>ления (e410)z440_1с<strong>в</strong>язью A80да<strong>в</strong>ленияz460А<strong>в</strong>томат упра<strong>в</strong>ленияУстано<strong>в</strong>ить частоту <strong>в</strong>ращения 1-й ступени (e380)частотой <strong>в</strong>ращенияA5z700_1Включить обобщеннуюз<strong>в</strong>уко<strong>в</strong>ую сигнализациюДоба<strong>в</strong>ить сообщение <strong>в</strong>z1300очередь сообщений оба<strong>в</strong>арияхz810_1Запустить таймерТаймер контроля<strong>в</strong>ремени про<strong>в</strong>орота60 сРис. 29. Схема с<strong>в</strong>язей а<strong>в</strong>томата предпуско<strong>в</strong>ых операций4.3.4.3. Граф переходо<strong>в</strong>0. Начальноеe01. Про<strong>в</strong>оротA15z: 10_1;20_1;30_1;400_1;420_1;430_1;440_1;460;810_1e70 ∨ x300 ∨ x350 ∨ x500 ∨ x510 ∨ x520 ∨ (y3 ≠ 0) ∨ (y4 ≠ 0) ∨ (y7 = 2) ∨ (y7 = 4)1 :z:10_0; 30_0; 420_0; 430_0; 440_0; 810_0y15 = 3e0( y15 = 2) ⋅ x280 ⋅ x290 ⋅ x300 ⋅ x350e03. Нет про<strong>в</strong>орота2. Пуск разрешенz: 10_0; 30_0; 40_2; 400_0;410; 430_0; 440_0;700_1; 1300z: 10_0; 30_0; 400_0; 440_0;810_0Рис. 30. Граф переходо<strong>в</strong> а<strong>в</strong>томата предпуско<strong>в</strong>ых операций


4.3.4.4. Текст функции, реализующей а<strong>в</strong>томат103#include "photon_stuff.h"#include "dg.h"#include "log.h"#include "defines.h"void A1( int e, dg_t *dg ){int y_old = dg->y1 ;#ifdef GRAPH_EVENTS_LOGGINGlog_exec( dg, "A1", y_old, e ) ;#endifswitch( dg->y1 ){case 0:if( e == 0 )break ;dg->y1 = 1 ;case 1:A1_0( e, dg ) ;if(e == 70 || x300(dg) || !x350(dg) || x500(dg) || x510(dg) || x520(dg)|| dg->y3 != 0 || dg->y4 != 0 || dg->y7 == 2 || dg->y7 == 4 ){ z10_0(dg) ; z30_0(dg) ; z420_0(dg) ; z430_0(dg) ; z440_0(dg) ; z810_0(dg) ;dg->y1 = 0 ; }elseif( dg->y1_0 == 3 )dg->y1 = 3 ;elseif( dg->y1_0 == 2 && x350(dg) && x280(dg) && !x290(dg) && !x300(dg) )dg->y1 = 2 ;break ;case 2:if( e == 0 )break ;case 3:if( e == 0 )break ;dg->y1 = 1 ;dg->y1 = 1 ;default:#ifdef GRAPH_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, dg->number,"ERROR IN A1: unknown state number!", 0 ) ;#endifbreak ;} ;if( y_old == dg->y1 ) goto A1_end ;{#ifdef GRAPH_TRANS_LOGGINGlog_trans( dg, "A1", y_old, dg->y1 ) ;#endif#ifdef DEBUG_FRAMEupdate_debug() ;#endif} ;switch( dg->y1 ){case 1:A1_0( 0, dg ) ;z10_1(dg) ; z20_1(dg) ; z30_1(dg) ; z400_1(dg) ; z420_1(dg) ;z430_1(dg) ; z440_1(dg) ; z460(dg) ; z810_1(dg) ;break ;


104case 2:z10_0(dg) ; z30_0(dg) ; z400_0(dg) ; z440_0(dg) ; z810_0(dg) ;break ;case 3:z10_0(dg) ; z30_0(dg) ; z40_2(dg) ; z400_0(dg) ; z430_0(dg) ;z440_0(dg) ; z410(dg) ;z700_1(dg) ; z1300(dg, MSG_NO_TURN) ;break ;} ;A1_end:#ifdef GRAPH_ENDS_LOGGINGlog_end( dg, "A1", dg->y1, e ) ;#endif;} ;4.3.5. А<strong>в</strong>томат контроля про<strong>в</strong>орота4.3.5.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат контроля про<strong>в</strong>орота реализует часть алгоритмапредпуско<strong>в</strong>ых операций, который описан <strong>в</strong> предыдущемподразделе (например, <strong>в</strong> п.п. 4, 7).Обратим <strong>в</strong>нимание, что <strong>в</strong> качест<strong>в</strong>е объекта упра<strong>в</strong>ленияэтого а<strong>в</strong>томата <strong>в</strong>ыступает не "физический" объект, а<strong>в</strong>ычислительное устройст<strong>в</strong>о, реализуемое программно.Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 31, 32.4.3.5.2. Схема с<strong>в</strong>язейВложен <strong>в</strong> а<strong>в</strong>томат A1ДПКВОбработчикисобытийСчетчикД<strong>в</strong>а про<strong>в</strong>орота <strong>в</strong>алаИнициализация <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>Импульс от датчика про<strong>в</strong>орота ДПКВИстечение <strong>в</strong>ремени про<strong>в</strong>оротаx800e0e180e220А15z800_0z800_1Сбросить счетчикпро<strong>в</strong>орото<strong>в</strong>У<strong>в</strong>еличитьсчетчикпро<strong>в</strong>орото<strong>в</strong>Рис. 31. Схема с<strong>в</strong>язей а<strong>в</strong>томата контроляпро<strong>в</strong>орота


4.3.5.3. Граф переходо<strong>в</strong>105e180z800_1e0z800_00. Подсчет про<strong>в</strong>орото<strong>в</strong>z800_0e2201 : e180 ⋅ x800e03. Нет про<strong>в</strong>орота2. Есть про<strong>в</strong>оротe0Рис. 32. Граф переходо<strong>в</strong> а<strong>в</strong>томатаконтроля про<strong>в</strong>орота4.3.5.4. Текст функции, реализующей а<strong>в</strong>томат#include "photon_stuff.h"#include "dg.h"#include "log.h"#include "defines.h"void A15( int e, dg_t *dg ){int y_old = dg->y15 ;#ifdef GRAPH_EVENTS_LOGGINGlog_exec( dg, "A15", y_old, e ) ;#endifswitch( dg->y15 ){case 0:if( e == 180 && x800(dg) ) dg->y15 = 2 ;elseif( e == 220 ) dg->y15 = 3 ;elseif( e == 0 ) { z800_0(dg) ; }elseif( e == 180 ) { z800_1(dg) ; } ;break ;case 2:if( e == 0 ) dg->y15 = 0 ;break ;case 3:if( e == 0 ) dg->y15 = 0 ;break ;default:#ifdef GRAPH_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, dg->number,"ERROR IN A15: unknown state number!", 0 ) ;#endifbreak ;} ;if( y_old == dg->y15 ) goto A15_end ;


106{#ifdef GRAPH_TRANS_LOGGINGlog_trans( dg, "A15", y_old, dg->y15 ) ;#endif#ifdef DEBUG_FRAMEupdate_debug() ;#endif} ;switch( dg->y15 ){case 0:z800_0(dg) ;break ;} ;A15_end:#ifdef GRAPH_ENDS_LOGGINGlog_end( dg, "A15", dg->y15, e ) ;#endif;} ;4.3.6. А<strong>в</strong>томат остано<strong>в</strong>а4.3.6.1. Сло<strong>в</strong>есное описание1. При нажатии оператором кнопки "Остано<strong>в</strong>" системаупра<strong>в</strong>ления должна <strong>в</strong>ыполнить перечисленные ниже дейст<strong>в</strong>ия.1.1. Отключить память команды на подгото<strong>в</strong>ку к пуску итабло "Подгото<strong>в</strong>ка к пуску", память гото<strong>в</strong>ности к пуску итабло "Пуск разрешен", память команды пуск и табло"Пуск", если соот<strong>в</strong>етст<strong>в</strong>ующие операции <strong>в</strong> момент подачикоманды <strong>в</strong>ыполнялись.1.2. Включить память команды остано<strong>в</strong>.1.3. Включить табло "Остано<strong>в</strong>".1.4. Подать питание на электромагнит остано<strong>в</strong>кирегулятора частоты <strong>в</strong>ращения.1.5. Выдать команду на уменьшение затяжки пружинырегулятора частоты <strong>в</strong>ращения до <strong>в</strong>еличины соот<strong>в</strong>етст<strong>в</strong>ующейпер<strong>в</strong>ой позиции и через 4 с снять эту команду.2. При уменьшении частоты <strong>в</strong>ращения ниже частоты"начала зали<strong>в</strong>ания" система упра<strong>в</strong>ления должна <strong>в</strong>ыдать <strong>в</strong> СУОКС сигнал "Закрыть наружную захлопку".


1073. При уменьшении частоты <strong>в</strong>ращения ниже рабочейчастоты система упра<strong>в</strong>ления должна <strong>в</strong>ыполнить перечисленныениже дейст<strong>в</strong>ия.3.1. Выдать команду на <strong>в</strong>ключение маслопрокачи<strong>в</strong>ающегонасоса.3.2. Включить отсчет <strong>в</strong>ремени прокачки маслом(60 cек).3.3. Включить табло "Прокачка маслом".4. При уменьшении частоты <strong>в</strong>ращения ниже частоты<strong>в</strong>ращения остано<strong>в</strong>а система упра<strong>в</strong>ления должна <strong>в</strong>ыполнитьперечисленные ниже дейст<strong>в</strong>ия.4.1. Выдать <strong>в</strong> СУ ОКС сигнал "Полная остано<strong>в</strong>ка ДГ".4.2. Выдать <strong>в</strong> генераторный щит сигнал "Полнаяостано<strong>в</strong>ка ДГ" длительностью 3 с.4.3. Выдать команду на закрытие клапана подачи <strong>в</strong>оды <strong>в</strong>газоохладитель и на закрытие клапана сли<strong>в</strong>а <strong>в</strong>оды изсепаратора газоот<strong>в</strong>ода.5. Через устано<strong>в</strong>ленное <strong>в</strong>ремя (п. 3.2) после запускамаслопрокачи<strong>в</strong>ающего насоса система упра<strong>в</strong>ления должна<strong>в</strong>ыполнить перечисленные ниже дейст<strong>в</strong>ия.5.1. Снять команду на <strong>в</strong>ключение маслопрокачи<strong>в</strong>ающегонасоса.5.2. Разомкнуть контакт остано<strong>в</strong>ки маслопрокачи<strong>в</strong>ающегонасоса и через 4 с <strong>в</strong>но<strong>в</strong>ь замкнуть этот контакт.5.3. Отключить табло "Прокачка маслом" при размыканииконтакта пускателя маслопрокачи<strong>в</strong>ающего насоса.5.4. Снять питание с электромагнита остано<strong>в</strong>кирегулятора частоты <strong>в</strong>ращения.5.5. Отключить память команды остано<strong>в</strong>.5.6. Отключить табло "Остано<strong>в</strong>".Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 33, 34.


4.3.6.2. Схема с<strong>в</strong>язей108ДЧВЧВОРЧВЧВНЗЧастота <strong>в</strong>ращения больше уста<strong>в</strong>ки ЧВОЧастота <strong>в</strong>ращения больше уста<strong>в</strong>ки РЧВЧастота <strong>в</strong>ращения меньше уста<strong>в</strong>ки ЧВНЗx210x220x240А3z20_0Отключить табло ПРОКАЧКА МАСЛОМz20_1Включить табло ПРОКАЧКА МАСЛОМz110_0Отключить табло ОСТАНОВz110_1Включить табло ОСТАНОВz271_0Погасить индикатор состояния наружной захлопкиВложен <strong>в</strong> а<strong>в</strong>томат A0МнемосхемаА<strong>в</strong>томат экстренногоостано<strong>в</strong>аA4Начато <strong>в</strong>ыполнение экстренного остано<strong>в</strong>аy4 ≠ 0z400_0z400_1z410Выдать команду на отключение МПН (e420)Выдать команду на <strong>в</strong>ключение МПН (e410)Остано<strong>в</strong>ить МПН на 4-е секунды (e390)А<strong>в</strong>томат упра<strong>в</strong>ленияклапаном с обратнойс<strong>в</strong>язью A80А<strong>в</strong>томат остано<strong>в</strong>киМПНA60Магнитный пускательМПНКонтакт остано<strong>в</strong>киМПНz420_0z420_1Снять питание с электромагнита стопа РЧВПодать питание на электромагнит стопа РЧВЭлектромагнит стопаРЧВz460z480_0z490_0Устано<strong>в</strong>ить частоту <strong>в</strong>ращения 1-й ступени (e380)Закрыть клапан подачи <strong>в</strong>оды <strong>в</strong> газоохладитель (e420)Закрыть клапан сли<strong>в</strong>а <strong>в</strong>оды (e420)А<strong>в</strong>томат упра<strong>в</strong>лениячастотой <strong>в</strong>ращенияA5А<strong>в</strong>томат упра<strong>в</strong>ленияклапаном с обратнойс<strong>в</strong>язью A80А<strong>в</strong>томат упра<strong>в</strong>ленияклапаном с обратнойс<strong>в</strong>язью A80Клапан подачи <strong>в</strong>оды <strong>в</strong>газоохладительКлапан сли<strong>в</strong>а <strong>в</strong>оды изсепаратора газоот<strong>в</strong>одаz730z740Выдать сигнал ЗАКРЫТЬ НАРУЖНУЮ ЗАХЛОПКУВыдать сигнал ПОЛНАЯ ОСТАНОВКА ДГСУ ОКСОбработчикисобытийИнициализация <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>Нажатие кнопки ОСТАНОВИстечение <strong>в</strong>ремени прокачки масломe0e30e260z750z840_0z840_1Выдать сигнал ПОЛНАЯ ОСТАНОВКА ДГ <strong>в</strong> генераторный щит (e400)Остано<strong>в</strong>ить таймерЗапустить таймерА<strong>в</strong>томат <strong>в</strong>ыдачи сигналаПОЛНАЯ ОСТАНОВКА ДГ <strong>в</strong>генраторный щит A61Таймер контроля<strong>в</strong>ремени прокачкимаслом60 сРис. 33. Схема с<strong>в</strong>язей а<strong>в</strong>томата остано<strong>в</strong>а4.3.6.3. Граф переходо<strong>в</strong>(y4 ≠ 0)z840_00. Начальное2. Остано<strong>в</strong>3. Закрыть захлопку4. Включить МПНe30 x240 x220 x2105. Остано<strong>в</strong>ленz: 20_0; 110_0; 400_0z: 110_1; 420_1; 460z: 271_0; 730z: 20_1; 400_1; 840_1z: 740; 480_0; 490_0; 750e260z: 420_0;410Рис. 34. Граф переходо<strong>в</strong> а<strong>в</strong>томата остано<strong>в</strong>а4.3.6.4. Текст функции, реализующей а<strong>в</strong>томат#include "photon_stuff.h"#include "dg.h"#include "log.h"#include "defines.h"void A3( int e, dg_t *dg ){int y_old = dg->y3 ;#ifdef GRAPH_EVENTS_LOGGINGlog_exec( dg, "A3", y_old, e ) ;#endif


109switch( dg->y3 ){case 0:if( e == 30 ) dg->y3 = 2 ;break ;case 2:if( dg->y4 != 0 ) { z840_0(dg) ; dg->y3 = 0 ; }elseif( x240(dg) ) dg->y3 = 3 ;break ;case 3:if( dg->y4 != 0 ) { z840_0(dg) ; dg->y3 = 0 ; }elseif( !x220(dg) ) dg->y3 = 4 ;break ;case 4:if( dg->y4 != 0 ) { z840_0(dg) ; dg->y3 = 0 ; }elseif( !x210(dg) ) dg->y3 = 5 ;break ;case 5:if( dg->y4 != 0 ) { z840_0(dg) ; dg->y3 = 0 ; }elseif( e == 260 ) { z410(dg) ; z420_0(dg) ; dg->y3 = 0 ; }break ;default:#ifdef GRAPH_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, dg->number,"ERROR IN A3: unknown state number!", 0 ) ;#endifbreak ;} ;if( y_old == dg->y3 ) goto A3_end ;{#ifdef GRAPH_TRANS_LOGGINGlog_trans( dg, "A3", y_old, dg->y3 ) ;#endif#ifdef DEBUG_FRAMEupdate_debug() ;#endif} ;switch( dg->y3 ){case 0:z20_0(dg) ; z110_0(dg) ; z400_0(dg) ;break ;case 2:z110_1(dg) ; z420_1(dg) ; z460(dg) ;break ;case 3:z271_0(dg) ; z730(dg) ;break ;case 4:z20_1(dg) ; z400_1(dg) ; z840_1(dg) ;break ;case 5:z480_0(dg) ; z490_0(dg) ; z740(dg) ; z750(dg) ;break ;} ;


110A3_end:#ifdef GRAPH_ENDS_LOGGINGlog_end( dg, "A3", dg->y3, e ) ;#endif;} ;4.3.7. А<strong>в</strong>томат ожидания разрешения <strong>в</strong>ыполненияпредпуско<strong>в</strong>ых операций4.3.7.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат реализует часть алгоритма предпуско<strong>в</strong>ыхопераций, описанного <strong>в</strong> подразделе 4.3.4. При нажатиикнопки "Подгото<strong>в</strong>ка к пуску" а<strong>в</strong>томат про<strong>в</strong>еряет значениясигнало<strong>в</strong>, запрещающих <strong>в</strong>ыполнение алгоритма предпуско<strong>в</strong>ыхопераций и, при необходимости, <strong>в</strong>ыдает <strong>в</strong> СУ ОКС сигнал"Подгото<strong>в</strong>ка к пуску".Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 35, 36.4.3.7.2. Схема с<strong>в</strong>язейВложен <strong>в</strong> а<strong>в</strong>томат A0Наличие сигнала БЛОКИРОВКА ПУСКАx700А8z710Выдать сигнал ПОДГОТОВКА К ПУСКУСУ ОКСРДЧВ ЧВСигнализаторуро<strong>в</strong>ня <strong>в</strong>оды <strong>в</strong> ГОДВПМДППВЧастота <strong>в</strong>ращения больше уста<strong>в</strong>ки РЧВНаличие сигнала ВОДА В ОХЛАДИТЕЛЕ(а<strong>в</strong>арийный уро<strong>в</strong>ень)Наличие сигнала МВП НЕ ОТКЛЮЧЕННаличие сигналаПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬx220x500x510x520ОбработчикисобытийИнициализация <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>Нажатие кнопки ПОДГОТОВКА К ПУСКУСнятие сигнала БЛОКИРОВКА ПУСКАиз СУ ОКСe0e10e80Рис. 35. Схема с<strong>в</strong>язей а<strong>в</strong>томата ожидания разрешения<strong>в</strong>ыполнения предпуско<strong>в</strong>ых операций


4.3.7.3. Граф переходо<strong>в</strong>1110. Начальноеe10⋅(x220 ∨ x500 ∨ x510 ∨ x520)1: e10⋅(x220 ∨ x500 ∨ x510 ∨ x520 ∨ x700)x220 ∨ x500 ∨x510 ∨ x520 ∨e01. Ожидание разрешенияпускаz710e80⋅(x220 ∨ x500 ∨ x510 ∨ x520)e02. Выполнить предпуско<strong>в</strong>ыеоперацииРис. 36. Граф переходо<strong>в</strong> а<strong>в</strong>томата ожиданияразрешения <strong>в</strong>ыполнения предпуско<strong>в</strong>ых операций4.3.7.4. Текст функции, реализующей а<strong>в</strong>томат#include "photon_stuff.h"#include "dg.h"#include "log.h"#include "defines.h"void A8( int e, dg_t *dg ){int y_old = dg->y8 ;#ifdef GRAPH_EVENTS_LOGGINGlog_exec( dg, "A8", y_old, e ) ;#endifswitch( dg->y8 ){case 0:if( e == 10 && !( x220(dg) || x500(dg) || x510(dg) || x520(dg) || x700(dg)))dg->y8 = 2 ;elseif( e == 10 && !( x220(dg) || x500(dg) || x510(dg) || x520(dg) ))dg->y8 = 1 ;break ;case 1:if( x220(dg) || x500(dg) || x510(dg) || x520(dg) || e == 0 )dg->y8 = 0 ;elseif( e == 80 && !( x220(dg) || x500(dg) || x510(dg) || x520(dg)))dg->y8 = 2 ;break ;case 2:if( e == 0 )break ;dg->y8 = 0 ;default:#ifdef GRAPH_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, dg->number,"ERROR IN A8: unknown state number!", 0 ) ;#endifbreak ;} ;


112if( y_old == dg->y8 ) goto A8_end ;{#ifdef GRAPH_TRANS_LOGGINGlog_trans( dg, "A8", y_old, dg->y8 ) ;#endif#ifdef DEBUG_FRAMEupdate_debug() ;#endif} ;switch( dg->y8 ){case 1:z710(dg) ;break ;} ;A8_end:#ifdef GRAPH_ENDS_LOGGINGlog_end( dg, "A8", dg->y8, e ) ;#endif;} ;4.3.8. А<strong>в</strong>томат а<strong>в</strong>арийной и предупредительной сигнализации4.3.8.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат обобщает работу а<strong>в</strong>томато<strong>в</strong> контроля параметро<strong>в</strong>дизель-генратора. Выделены четыре режима работы алгоритмаа<strong>в</strong>арийной и предупредительной сигнализации.1. Рабочий режим. Все параметры <strong>в</strong> допуске.2. А<strong>в</strong>арийный остано<strong>в</strong>. А<strong>в</strong>арийное отклонение какминимум одного из контролируемых параметро<strong>в</strong>.3. А<strong>в</strong>ария без остано<strong>в</strong>а. А<strong>в</strong>арийное отклонениетемпературы масла или температуры <strong>в</strong>оды при отключеннойзащите по этим параметрам.4. Разнос. Частота <strong>в</strong>ращения дизель-генераторапре<strong>в</strong>ысила предельно допустимую.Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 37, 38.


4.3.8.2. Схема с<strong>в</strong>язей113Вложен <strong>в</strong> а<strong>в</strong>томат A20. Вложенные а<strong>в</strong>томаты: A71, A72, A73, A74, A75, A76, A77, A78ДЧВПультПпредЗащита <strong>в</strong>ключенаЧастота <strong>в</strong>ращения больше ПРЕДx20x260А7z280_0z280_1z280_2Отключить табло РАЗНОСВключить постоянное табло РАЗНОСВключить мигающее табло РАЗНОСМнемосхемаА<strong>в</strong>томат контролятемпературы маслаA71А<strong>в</strong>томат контроляда<strong>в</strong>ления маслаA72А<strong>в</strong>томат контролятемпературы <strong>в</strong>одыA74А<strong>в</strong>томат контроляда<strong>в</strong>ления <strong>в</strong> отсекеA77А<strong>в</strong>томат контроляуро<strong>в</strong>ня <strong>в</strong>оды <strong>в</strong>охладителе A78А<strong>в</strong>арийный перегре<strong>в</strong> маслаА<strong>в</strong>арийное снижение да<strong>в</strong>ления маслаА<strong>в</strong>арийный перегре<strong>в</strong> <strong>в</strong>одыА<strong>в</strong>арийное снижение да<strong>в</strong>ления <strong>в</strong> отсекеА<strong>в</strong>арийный уро<strong>в</strong>ень <strong>в</strong>одыy71 = 4y72 = 5y74 = 4y77 = 3y78 = 2z1300Доба<strong>в</strong>ить сообщение <strong>в</strong>очередь сообщений оба<strong>в</strong>арияхОбработчикисобытийНажатие кнопки КВИТИРОВАНИЕe50Рис. 37. Схема с<strong>в</strong>язей а<strong>в</strong>томата а<strong>в</strong>арийной ипредупредительной сигнализации4.3.8.3. Граф переходо<strong>в</strong>((y71= 4) ∨ (y74 = 4) ) ∨ (y72 = 5) ∨ (y77 = 3) ∨ (y78 2)((y71= 4) ∨ (y74 4) )C7_1 = x20 ⋅=C7_2 = x20 ⋅=2 : C7_20. Рабочий режимA71, A72, A73, A74, A75,A76, A77, A78x260x260z280_04. РазносA71, A72, A73, A74, A75,A76, A77, A78z: 280_2; 1300e50z280_11 : C7_1C7_23.А<strong>в</strong>ария без остано<strong>в</strong>аA71, A72, A73, A74, A75,A76, A77, A781 : C7_11 : C7_2C7_12. А<strong>в</strong>арийный остано<strong>в</strong>A71, A72, A73, A74, A75,A76, A77, A782 : x260Рис. 38. Граф переходо<strong>в</strong> а<strong>в</strong>томатаа<strong>в</strong>арийной и предупредительнойсигнализации4.3.8.4. Текст функции, реализующей а<strong>в</strong>томат#include "photon_stuff.h"#include "dg.h"#include "log.h"#include "defines.h"int C7_1( dg_t *dg ){return ( x20(dg) && ( dg->y71 == 4 || dg->y74 == 4 ))|| dg->y72 == 5 || dg->y77 == 3 || dg->y78 == 2 ;} ;


114int C7_2( dg_t *dg ){return !x20(dg) && ( dg->y71 == 4 || dg->y74 == 4 ) ;} ;void A7( int e, dg_t *dg ){int y_old = dg->y7 ;#ifdef GRAPH_EVENTS_LOGGINGlog_exec( dg, "A7", y_old, e ) ;#endifswitch( dg->y7 ){case 0:A71(e,dg) ; A72(e,dg) ; A73(e,dg) ; A74(e,dg) ; A75(e,dg) ;A76(e,dg) ; A77(e,dg) ; A78(e,dg) ;if( C7_1(dg) ) dg->y7 = 2 ;elseif( C7_2(dg) ) dg->y7 = 3 ;elseif( x260(dg) ) dg->y7 = 4 ;break ;case 2:A71(e,dg) ; A72(e,dg) ; A73(e,dg) ; A74(e,dg) ; A75(e,dg) ;A76(e,dg) ; A77(e,dg) ; A78(e,dg) ;if( C7_2(dg) ) dg->y7 = 3 ;elseif( !C7_1(dg) ) dg->y7 = 0 ;break ;case 3:A71(e,dg) ; A72(e,dg) ; A73(e,dg) ; A74(e,dg) ; A75(e,dg) ;A76(e,dg) ; A77(e,dg) ; A78(e,dg) ;if( C7_1(dg) ) dg->y7 = 2 ;elseif( x260(dg) ) dg->y7 = 4 ;elseif( !C7_2(dg) ) dg->y7 = 0 ;break ;case 4:A71(e,dg) ; A72(e,dg) ; A73(e,dg) ; A74(e,dg) ; A75(e,dg) ;A76(e,dg) ; A77(e,dg) ; A78(e,dg) ;if( !x260(dg) ) { z280_0(dg) ; dg->y7 = 0 ; }elseif( e == 50 ) { z280_1(dg) ; }break ;default:#ifdef GRAPH_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, dg->number,"ERROR IN A7: unknown state number!", 0 ) ;#endifbreak ;} ;if( y_old == dg->y7 ) goto A7_end ;{#ifdef GRAPH_TRANS_LOGGINGlog_trans( dg, "A7", y_old, dg->y7 ) ;#endif#ifdef DEBUG_FRAMEupdate_debug() ;#endif} ;switch( dg->y7 ){case 0:A71(0,dg) ; A72(0,dg) ; A73(0,dg) ; A74(0,dg) ; A75(0,dg) ;A76(0,dg) ; A77(0,dg) ; A78(0,dg) ;break ;


115case 2:A71(0,dg) ; A72(0,dg) ; A73(0,dg) ; A74(0,dg) ; A75(0,dg) ;A76(0,dg) ; A77(0,dg) ; A78(0,dg) ;break ;case 3:A71(0,dg) ; A72(0,dg) ; A73(0,dg) ; A74(0,dg) ; A75(0,dg) ;A76(0,dg) ; A77(0,dg) ; A78(0,dg) ;break ;case 4:A71(0,dg) ; A72(0,dg) ; A73(0,dg) ; A74(0,dg) ; A75(0,dg) ;A76(0,dg) ; A77(0,dg) ; A78(0,dg) ;z280_2(dg) ; z1300(dg, MSG_RAZNOS_FAIL) ;break ;} ;A7_end:#ifdef GRAPH_ENDS_LOGGINGlog_end( dg, "A7", dg->y7, e ) ;#endif;} ;4.3.9. А<strong>в</strong>томат контроля температуры масла4.3.9.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат произ<strong>в</strong>одит контроль температуры масла,определяет и <strong>в</strong>ыполняет индикацию следующих ситуаций:− низкая температура. Температура масла ниже уста<strong>в</strong>киТмм;− предупредительный перегре<strong>в</strong>. Температура масла <strong>в</strong>ышеуста<strong>в</strong>ки Тмпр;− а<strong>в</strong>арийный перегре<strong>в</strong>. Температура масла <strong>в</strong>ыше уста<strong>в</strong>киТма.Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 39, 40.


4.3.9.2. Схема с<strong>в</strong>язей116ПультДатчиктемпературымаслаТммТмпрТмаЗащита <strong>в</strong>ключенаТемпература масла ниже ТммТемпература масла <strong>в</strong>ыше ТмпрТемпература масла <strong>в</strong>ыше Тмаx20x320x330x340А71z140_0Отключить табло ХОЛОДНОЕ МАСЛОz140_1Включить зеленое табло ХОЛОДНОЕ МАСЛОz150_0Отключить табло ПЕРЕГРЕВ МАСЛАz150_1Включить желтое табло ПЕРЕГРЕВ МАСЛАz150_2Включить желтое мигающее табло ПЕРЕГРЕВ МАСЛАz150_3Включить красное табло ПЕРЕГРЕВ МАСЛАz150_4Включить красное мигающее табло ПЕРЕГРЕВ МАСЛАВложен <strong>в</strong> а<strong>в</strong>томат A7МнемосхемаОбработчикисобытийНажатие кнопки КВИТИРОВАНИЕНажатие кнопки РАЗБЛОКИРОВКАe50e60z700_1z1300Включить обобщеннуюз<strong>в</strong>уко<strong>в</strong>ую сигнализациюДоба<strong>в</strong>ить сообщение <strong>в</strong>очередь сообщений оба<strong>в</strong>арияхРис. 39. Схема с<strong>в</strong>язей а<strong>в</strong>томата контроля температуры масла4.3.9.3. Граф переходо<strong>в</strong>0. Нормальнаяx320z: 140_0; 150_0x330z:1300; 700_1x320x330 ( e60 ∨ x20) ⋅ x3402. Низкая3. Предупредительныйперегре<strong>в</strong>( e60 ∨ x20) ⋅ x330 x3401 :⋅4. А<strong>в</strong>арийный перегре<strong>в</strong>z: 140_1; 1300z150_21 :x340z1300z: 150_4, 700_1e50z150_1e50z150_3Рис. 40. Граф переходо<strong>в</strong> а<strong>в</strong>томата контроля температурымасла4.3.9.4. Текст функции, реализующей а<strong>в</strong>томат#include "photon_stuff.h"#include "dg.h"#include "log.h"#include "defines.h"void A71( int e, dg_t *dg ){int y_old = dg->y71 ;#ifdef GRAPH_EVENTS_LOGGINGlog_exec( dg, "A71", y_old, e ) ;#endif


117switch( dg->y71 ){case 0:if( x320(dg) ) dg->y71 = 2 ;elseif( x330(dg) ) { z1300(dg, MSG_OIL_TEMP_HIGH_ALARM) ; z700_1(dg) ;dg->y71 = 3 ; }break ;case 2:if( !x320(dg) ) dg->y71 = 0 ;break ;case 3:if( x340(dg) ) { z1300(dg, MSG_OIL_TEMP_HIGH_FAIL) ;dg->y71 = 4 ; }elseif( !x330(dg) ) dg->y71 = 0 ;elseif( e == 50 ) { z150_1(dg) ; }break ;case 4:if( ( e == 60 || !x20(dg) ) && x330(dg) && !x340(dg))dg->y71 = 3 ;elseif( ( e == 60 || !x20(dg) ) && !x340(dg) )dg->y71 = 0 ;elseif( e == 50 ) { z150_3(dg) ; }break ;default:#ifdef GRAPH_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, dg->number,"ERROR IN A71: unknown state number!", 0 ) ;#endifbreak ;} ;if( y_old == dg->y71 ) goto A71_end ;{#ifdef GRAPH_TRANS_LOGGINGlog_trans( dg, "A71", y_old, dg->y71 ) ;#endif#ifdef DEBUG_FRAMEupdate_debug() ;#endif} ;switch( dg->y71 ){case 0:z140_0(dg) ; z150_0(dg) ;break ;case 2:z140_1(dg) ; z1300(dg, MSG_OIL_TEMP_LOW_ALARM) ;break ;case 3:z150_2(dg) ;break ;case 4:z150_4(dg) ; z700_1(dg) ;break ;} ;A71_end:#ifdef GRAPH_ENDS_LOGGINGlog_end( dg, "A71", dg->y71, e ) ;#endif;} ;


4.3.10. А<strong>в</strong>томат контроля да<strong>в</strong>ления масла1184.3.10.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат произ<strong>в</strong>одит контроль да<strong>в</strong>ления масла,определяет и <strong>в</strong>ыполняет индикацию следующих ситуаций:− предупредительное снижение. Да<strong>в</strong>ление масла нижеуста<strong>в</strong>ки Рмпрi, где i - текущая ступень частоты <strong>в</strong>ращения;− а<strong>в</strong>арийное снижение. Да<strong>в</strong>ление масла ниже уста<strong>в</strong>киРмаi.Контроль да<strong>в</strong>ления масла <strong>в</strong>ключается через 10 с послезапуска дизель-генератора.Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 41, 42.4.3.10.2. Схема с<strong>в</strong>язейДЧВД1СЧВД2СЧВРЧВЧастота <strong>в</strong>ращения больше РЧВПер<strong>в</strong>ая ступень частоты <strong>в</strong>ращенияВторая ступень частоты <strong>в</strong>ращенияx220x280x290А72z160_0Отключить табло ДАВЛЕНИЕ МАСЛАz160_1Включить желтое табло ДАВЛЕНИЕ МАСЛАz160_2Включить желтое мигающее табло ДАВЛЕНИЕ МАСЛАz160_3Включить красное табло ДАВЛЕНИЕ МАСЛАz160_4Включить красное мигающее табло ДАВЛЕНИЕ МАСЛАВложен <strong>в</strong> а<strong>в</strong>томат A7МнемосхемаД3СЧВТретья ступень частоты <strong>в</strong>ращенияx300Датчикда<strong>в</strong>лениямаслаРмпр1Рмпр2Рмпр3Рма<strong>в</strong>1Да<strong>в</strong>ление масла ниже уста<strong>в</strong>ки Рмпр1Да<strong>в</strong>ление масла ниже уста<strong>в</strong>ки Рмпр2Да<strong>в</strong>ление масла ниже уста<strong>в</strong>ки Рмпр3Да<strong>в</strong>ление масла ниже уста<strong>в</strong>ки Рма<strong>в</strong>1x360x370x380x390z700_1z1300Включить обобщеннуюз<strong>в</strong>уко<strong>в</strong>ую сигнализациюДоба<strong>в</strong>ить сообщение <strong>в</strong>очередь сообщений оба<strong>в</strong>арияхРма<strong>в</strong>2Да<strong>в</strong>ление масла ниже уста<strong>в</strong>ки Рма<strong>в</strong>2x400Рма<strong>в</strong>3Да<strong>в</strong>ление масла ниже уста<strong>в</strong>ки Рма<strong>в</strong>3x410ОбработчикисобытийНажатие кнопки КВИТИРОВАНИЕНажатие кнопки РАЗБЛОКИРОВКАИстечение <strong>в</strong>ремени задержки контроля параметро<strong>в</strong>e50e60e261z880_1Запустить таймерТаймер задержкиконтроля параметро<strong>в</strong>10 сРис. 41. Схема с<strong>в</strong>язей а<strong>в</strong>томата контроля да<strong>в</strong>ления масла


4.3.10.3. Граф переходо<strong>в</strong>x2200. Ожидание РЧВC721=x220 ⋅C722 = x220 ⋅( x280 ⋅ x360 ∨ x290 ⋅ x370 ∨ x300 ⋅ x380)( x280 ⋅ x390 ∨ x290 ⋅ x400 ∨ x300 ⋅ x410)1193. Задержка контроляe2611 : x2201. НормальноеC721z:1300; 700_1e50z160_14. ПредупредительноеснижениеC7221 :z1300e50z160_35. А<strong>в</strong>арийное снижениеz880_1z160_0C721z160_21 : e60 ⋅ C721z: 160_4; 700_1e60 ⋅ C722Рис. 42. Граф переходо<strong>в</strong> а<strong>в</strong>томата контроля да<strong>в</strong>ления масла4.3.10.4. Текст функции, реализующей а<strong>в</strong>томат#include "photon_stuff.h"#include "dg.h"#include "log.h"#include "defines.h"int C721( dg_t *dg ){return x220(dg) && ( ( x280(dg) && x360(dg) )|| ( x290(dg) && x370(dg) )|| ( x300(dg) && x380(dg) )) ;} ;int C722( dg_t *dg ){return x220(dg) && ( ( x280(dg) && x390(dg) )|| ( x290(dg) && x400(dg) )|| ( x300(dg) && x410(dg) )) ;} ;void A72( int e, dg_t *dg ){int y_old = dg->y72 ;#ifdef GRAPH_EVENTS_LOGGINGlog_exec( dg, "A72", y_old, e ) ;#endifswitch( dg->y72 ){case 0:if( x220(dg) ) dg->y72 = 3 ;break ;case 1:if( !x220(dg) ) dg->y72 = 0 ;elseif( C721(dg) ) { z1300(dg, MSG_OIL_PRESS_ALARM) ; z700_1(dg) ;dg->y72 = 4 ; }break ;


120case 3:if( e == 261 ) dg->y72 = 1 ;break ;case 4:if( C722(dg) ) { z1300(dg, MSG_OIL_PRESS_FAIL) ;dg->y72 = 5 ; }elseif( !C721(dg) ) dg->y72 = 1 ;elseif( e == 50 ) { z160_1(dg) ; }break ;case 5:if( e == 60 && C721(dg) ) dg->y72 = 4 ;elseif( e == 60 && !C722(dg) ) dg->y72 = 1 ;elseif( e == 50 ) { z160_3(dg) ; }break ;default:#ifdef GRAPH_ERRORS_LOGGINGlog_write( LOG_GRAPH_ERROR, dg->number,"ERROR IN A72: unknown state number!", 0 ) ;#endifbreak ;} ;if( y_old == dg->y72 ) goto A72_end ;{#ifdef GRAPH_TRANS_LOGGINGlog_trans( dg, "A72", y_old, dg->y72 ) ;#endif#ifdef DEBUG_FRAMEupdate_debug() ;#endif} ;switch( dg->y72 ){case 1:z160_0(dg) ;break ;case 3:z880_1(dg) ;break ;case 4:z160_2(dg) ;break ;case 5:z160_4(dg) ; z700_1(dg) ;break ;} ;A72_end:#ifdef GRAPH_ENDS_LOGGINGlog_end( dg, "A72", dg->y72, e ) ;#endif;} ;4.3.11. Протоколы функциониро<strong>в</strong>ания системы упра<strong>в</strong>ленияПри<strong>в</strong>едем примеры протоколо<strong>в</strong> работы для системыупра<strong>в</strong>ления <strong>в</strong> целом при обработке нажатия кнопки


121"Подгото<strong>в</strong>ка к пуску" (событие e10), полученныйа<strong>в</strong>томатически с <strong>в</strong>ыделенными <strong>в</strong>ручную этапами.Диагностирующий (полный) протокол имеет следующий<strong>в</strong>ид.Нажатие кнопки "Подгото<strong>в</strong>ка к пуску":11:34:02.507{ DG1: A20: <strong>в</strong> состоянии 2 запущен с событием e1011:34:02.507{ DG1: A7: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.507{ DG1: A71: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.507> DG1: x320 - температура масла меньше Тмм - <strong>в</strong>ернул 011:34:02.507> DG1: x330 - температура масла больше Тмпр - <strong>в</strong>ернул 011:34:02.507} DG1: A71: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 011:34:02.507{ DG1: A72: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.507> DG1: x220 - частота <strong>в</strong>ращения больше РЧВ - <strong>в</strong>ернул 011:34:02.507} DG1: A72: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 011:34:02.507{ DG1: A73: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.507> DG1: x220 - частота <strong>в</strong>ращения больше РЧВ - <strong>в</strong>ернул 011:34:02.507} DG1: A73: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 011:34:02.507{ DG1: A74: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.507> DG1: x430 - температура <strong>в</strong>оды меньше Т<strong>в</strong>м - <strong>в</strong>ернул 011:34:02.507> DG1: x440 - температура <strong>в</strong>оды больше Т<strong>в</strong>пр - <strong>в</strong>ернул 011:34:02.507} DG1: A74: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 011:34:02.507{ DG1: A75: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.507> DG1: x460 - да<strong>в</strong>ление надду<strong>в</strong>а больше Рнпр - <strong>в</strong>ернул 011:34:02.507} DG1: A75: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 011:34:02.507{ DG1: A76: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.507> DG1: x470 - температура газо<strong>в</strong> больше Т<strong>в</strong>г - <strong>в</strong>ернул 011:34:02.507} DG1: A76: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 011:34:02.507{ DG1: A77: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.507> DG1: x480 - да<strong>в</strong>ление <strong>в</strong> отсеке ниже Ротс - <strong>в</strong>ернул 011:34:02.507} DG1: A77: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 011:34:02.507{ DG1: A78: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.507> DG1: x500 - сигнал ВОДА В ОХЛАДИТЕЛЕ - <strong>в</strong>ернул 011:34:02.507} DG1: A78: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 011:34:02.507> DG1: x20 - защита <strong>в</strong>ключена - <strong>в</strong>ернул 111:34:02.507> DG1: x20 - защита <strong>в</strong>ключена - <strong>в</strong>ернул 111:34:02.507> DG1: x260 - частота <strong>в</strong>ращения больше ППРЕД - <strong>в</strong>ернул 011:34:02.507} DG1: A7: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 011:34:02.507{ DG1: A0: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.507{ DG1: A8: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.507> DG1: x220 - частота <strong>в</strong>ращения больше РЧВ - <strong>в</strong>ернул 011:34:02.507> DG1: x500 - сигнал ВОДА В ОХЛАДИТЕЛЕ - <strong>в</strong>ернул 011:34:02.507> DG1: x510 - сигнал МВП НЕ ОТКЛЮЧЕН - <strong>в</strong>ернул 011:34:02.507> DG1: x520 - сигнал ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ - <strong>в</strong>ернул 011:34:02.507> DG1: x700 - сигнал БЛОКИРОВКА ПУСКА из СУ ОКС - <strong>в</strong>ернул 011:34:02.507T DG1: A8: перешел из состояния 0 <strong>в</strong> состояние 211:34:02.507} DG1: A8: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 211:34:02.507T DG1: A0: перешел из состояния 0 <strong>в</strong> состояние 111:34:02.507{ DG1: A4: <strong>в</strong> состоянии 0 запущен с событием e011:34:02.507{ DG1: A4_0: <strong>в</strong> состоянии 0 запущен с событием e011:34:02.507} DG1: A4_0: за<strong>в</strong>ершил обработку события e0 <strong>в</strong> состоянии 011:34:02.507} DG1: A4: за<strong>в</strong>ершил обработку события e0 <strong>в</strong> состоянии 011:34:02.507{ DG1: A3: <strong>в</strong> состоянии 0 запущен с событием e011:34:02.507} DG1: A3: за<strong>в</strong>ершил обработку события e0 <strong>в</strong> состоянии 011:34:02.507{ DG1: A1: <strong>в</strong> состоянии 0 запущен с событием e011:34:02.507T DG1: A1: перешел из состояния 0 <strong>в</strong> состояние 111:34:02.507{ DG1: A1_0: <strong>в</strong> состоянии 0 запущен с событием e011:34:02.507* DG1: z800_0. Сбросить счетчик про<strong>в</strong>орото<strong>в</strong>.11:34:02.507} DG1: A1_0: за<strong>в</strong>ершил обработку события e0 <strong>в</strong> состоянии 011:34:02.507* DG1: z10_1. Включить табло ПОДГОТОВКА К ПУСКУ.11:34:02.507* DG1: z20_1. Включить табло ПРОКАЧКА МАСЛОМ.11:34:02.507* DG1: z30_1. Включить табло ПРОВОРОТ.


Запустить маслопрокачи<strong>в</strong>ающий насос:12211:34:02.507* DG1: z400_1. Включить магнитный пускатель МПН.11:34:02.507{ DG1: A80( z400 ): <strong>в</strong> состоянии 0 запущен с событием e41011:34:02.507> DG1: x900( z400 ) - клапан открыт - <strong>в</strong>ернул 011:34:02.507T DG1: A80( z400 ): перешел из состояния 0 <strong>в</strong> состояние 311:34:02.507* DG1: z270_2( z400 ). Индикация состояния клапана - закры<strong>в</strong>ается/откры<strong>в</strong>ается.11:34:02.507* DG1: z950_1( z400 ). Запустить таймер контроля срабаты<strong>в</strong>ания.11:34:02.507* DG1: z1000_1( z400 ). Открыть/запустить.11:34:02.507} DG1: A80( z400 ): за<strong>в</strong>ершил обработку события e410 <strong>в</strong> состоянии 311:34:02.507* DG1: z420_1. Подать питание на электромагнит стопа РЧВ.Открыть клапан подачи <strong>в</strong>оздуха к дизель-генератору:11:34:02.507* DG1: z430_1. Открыть клапан подачи <strong>в</strong>оздуха к ДГ.11:34:02.507{ DG1: A80( z430 ): <strong>в</strong> состоянии 0 запущен с событием e41011:34:02.507> DG1: x900( z430 ) - клапан открыт - <strong>в</strong>ернул 011:34:02.507T DG1: A80( z430 ): перешел из состояния 0 <strong>в</strong> состояние 311:34:02.507* DG1: z270_2( z430 ). Индикация состояния клапана - закры<strong>в</strong>ается/откры<strong>в</strong>ается.11:34:02.507* DG1: z950_1( z430 ). Запустить таймер контроля срабаты<strong>в</strong>ания.11:34:02.507* DG1: z1000_1( z430 ). Открыть/запустить.11:34:02.507} DG1: A80( z430 ): за<strong>в</strong>ершил обработку события e410 <strong>в</strong> состоянии 3Открыть клапан подачи <strong>в</strong>оздуха низкого да<strong>в</strong>ления:11:34:02.507* DG1: z440_1. Открыть клапан подачи <strong>в</strong>оздуха низкого да<strong>в</strong>ления.11:34:02.507{ DG1: A80( z440 ): <strong>в</strong> состоянии 0 запущен с событием e41011:34:02.507> DG1: x900( z440 ) - клапан открыт - <strong>в</strong>ернул 011:34:02.507T DG1: A80( z440 ): перешел из состояния 0 <strong>в</strong> состояние 311:34:02.507* DG1: z270_2( z440 ). Индикация состояния клапана - закры<strong>в</strong>ается/откры<strong>в</strong>ается.11:34:02.507* DG1: z950_1( z440 ). Запустить таймер контроля срабаты<strong>в</strong>ания.11:34:02.507* DG1: z1000_1( z440 ). Открыть/запустить.11:34:02.507} DG1: A80( z440 ): за<strong>в</strong>ершил обработку события e410 <strong>в</strong> состоянии 3Выдать команду на устано<strong>в</strong>ку частоты <strong>в</strong>ращения пер<strong>в</strong>ойступени:11:34:02.507* DG1: z460. Выдать команду на устано<strong>в</strong>ку частоты <strong>в</strong>ращения пер<strong>в</strong>ой ступени.11:34:02.507{ DG1: A5: <strong>в</strong> состоянии 0 запущен с событием e38011:34:02.507> DG1: x810 - заданная частота <strong>в</strong>ращения <strong>в</strong>ыше устано<strong>в</strong>ленной - <strong>в</strong>ернул 111:34:02.507T DG1: A5: перешел из состояния 0 <strong>в</strong> состояние 211:34:02.507* DG1: z610_1. У<strong>в</strong>еличить устано<strong>в</strong>ленную частоту РЧВ.11:34:02.507} DG1: A5: за<strong>в</strong>ершил обработку события e380 <strong>в</strong> состоянии 211:34:02.507* DG1: z810_1. Запустить таймер контроля про<strong>в</strong>орота.11:34:02.507} DG1: A1: за<strong>в</strong>ершил обработку события e0 <strong>в</strong> состоянии 111:34:02.507* DG1: z290_0. Индикация состояния ДГ - остано<strong>в</strong>лен.11:34:02.507} DG1: A0: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 111:34:02.507{ DG1: A5: <strong>в</strong> состоянии 2 запущен с событием e1011:34:02.507> DG1: x810 - заданная частота <strong>в</strong>ращения <strong>в</strong>ыше устано<strong>в</strong>ленной - <strong>в</strong>ернул 111:34:02.517> DG1: x820 - заданная частота <strong>в</strong>ращения ниже устано<strong>в</strong>ленной - <strong>в</strong>ернул 011:34:02.517} DG1: A5: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 211:34:02.517{ DG1: A13: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.517} DG1: A13: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 011:34:02.517{ DG1: A62: <strong>в</strong> состоянии 0 запущен с событием e1011:34:02.517T DG1: A62: перешел из состояния 0 <strong>в</strong> состояние 111:34:02.517* DG1: z1110_1. Запустить таймер регистрации параметро<strong>в</strong>.11:34:02.517* DG1: z1120_1. Запустить таймер индикации параметро<strong>в</strong>.11:34:02.517} DG1: A62: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 111:34:02.517} DG1: A20: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 2


123Ниже при<strong>в</strong>одится про<strong>в</strong>еряющий (короткий) протоколобработки нажатия кнопки "Подгото<strong>в</strong>ка к пуску" (событиеe10).11:41:06.188{ DG1: A20: <strong>в</strong> состоянии 2 запущен с событием e1011:41:06.188* DG1: z800_0. Сбросить счетчик про<strong>в</strong>орото<strong>в</strong>.11:41:06.188* DG1: z10_1. Включить табло ПОДГОТОВКА К ПУСКУ.11:41:06.188* DG1: z20_1. Включить табло ПРОКАЧКА МАСЛОМ.11:41:06.188* DG1: z30_1. Включить табло ПРОВОРОТ.11:41:06.188* DG1: z400_1. Включить магнитный пускатель МПН.11:41:06.188* DG1: z270_2( z400 ). Индикация состояния клапана - закры<strong>в</strong>ается/откры<strong>в</strong>ается.11:41:06.188* DG1: z950_1( z400 ). Запустить таймер контроля срабаты<strong>в</strong>ания.11:41:06.188* DG1: z1000_1( z400 ). Открыть/запустить.11:41:06.188* DG1: z420_1. Подать питание на электромагнит стопа РЧВ.11:41:06.188* DG1: z430_1. Открыть клапан подачи <strong>в</strong>оздуха к ДГ.11:41:06.188* DG1: z270_2( z430 ). Индикация состояния клапана - закры<strong>в</strong>ается/откры<strong>в</strong>ается.11:41:06.188* DG1: z950_1( z430 ). Запустить таймер контроля срабаты<strong>в</strong>ания.11:41:06.188* DG1: z1000_1( z430 ). Открыть/запустить.11:41:06.188* DG1: z440_1. Открыть клапан подачи <strong>в</strong>оздуха низкого да<strong>в</strong>ления.11:41:06.188* DG1: z270_2( z440 ). Индикация состояния клапана - закры<strong>в</strong>ается/откры<strong>в</strong>ается.11:41:06.188* DG1: z950_1( z440 ). Запустить таймер контроля срабаты<strong>в</strong>ания.11:41:06.188* DG1: z1000_1( z440 ). Открыть/запустить.11:41:06.188* DG1: z460. Выдать команду на устано<strong>в</strong>ку частоты <strong>в</strong>ращения пер<strong>в</strong>ой ступени.11:41:06.188* DG1: z610_1. У<strong>в</strong>еличить устано<strong>в</strong>ленную частоту РЧВ.11:41:06.188* DG1: z810_1. Запустить таймер контроля про<strong>в</strong>орота.11:41:06.188* DG1: z290_0. Индикация состояния ДГ - остано<strong>в</strong>лен.11:41:06.188* DG1: z1110_1. Запустить таймер регистрации параметро<strong>в</strong>.11:41:06.188* DG1: z1120_1. Запустить таймер индикации параметро<strong>в</strong>.11:41:06.188} DG1: A20: за<strong>в</strong>ершил обработку события e10 <strong>в</strong> состоянии 2Для иллюстрации работы <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong> при<strong>в</strong>едемструктуру рассмотренного полного протокола.1. A20 e10 <strong>в</strong> 2 В состояние 2 а<strong>в</strong>томата А20 <strong>в</strong>ложеныА7,А0,А5,А13,А622. A7 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 2 а<strong>в</strong>томата A203. A71 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 0 а<strong>в</strong>томата A7x320==0, x330==0A71 За<strong>в</strong>ершил обработку e10 <strong>в</strong> состоянии 04. A72 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 0 а<strong>в</strong>томата A7x220==0A72 За<strong>в</strong>ершил обработку e10 <strong>в</strong> состоянии 05. A73 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 0 а<strong>в</strong>томата A7x220==0A73 За<strong>в</strong>ершил обработку e10 <strong>в</strong> состоянии 06. A74 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 0 а<strong>в</strong>томата A7x430==0, x440==0A74 За<strong>в</strong>ершил обработку e10 <strong>в</strong> состоянии 07. A75 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 0 а<strong>в</strong>томата A7x460==0A75 За<strong>в</strong>ершил обработку e10 <strong>в</strong> состоянии 08. A76 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 0 а<strong>в</strong>томата A7x470==0A76 За<strong>в</strong>ершил обработку e10 <strong>в</strong> состоянии 09. A77 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 0 а<strong>в</strong>томата A7x480==0A77 За<strong>в</strong>ершил обработку e10 <strong>в</strong> состоянии 010. A78 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 0 а<strong>в</strong>томата A7x500==0A78 За<strong>в</strong>ершил обработку e10 <strong>в</strong> состоянии 0x20==1, x260==0A7 За<strong>в</strong>ершил обработку e10 <strong>в</strong> состоянии 0


12411. A0 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 2 а<strong>в</strong>томата А2012. A8 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 0 а<strong>в</strong>томата А0x220==0, x500==0, x510==0, x520==0, x700==0A8 0 → 2A8 За<strong>в</strong>ершил обработку e10 <strong>в</strong> состоянии 2A0 0 → 2 В состояние 2 а<strong>в</strong>томата А0 <strong>в</strong>ложеныА4, A3, A113. A4 e0 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 2 а<strong>в</strong>томата А014. A4_0 e0 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 0 а<strong>в</strong>томата А4A4_0 За<strong>в</strong>ершил обработку e0 <strong>в</strong> состоянии 0A4 За<strong>в</strong>ершил обработку e0 <strong>в</strong> состоянии 015. A3 e0 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 2 а<strong>в</strong>томата А0A3 За<strong>в</strong>ершил обработку e0 <strong>в</strong> состоянии 016. A1 e0 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 2 а<strong>в</strong>томата А0A1 0 → 1 В состояние 1 а<strong>в</strong>томата А1 <strong>в</strong>ложен A1_017. A1_0 e0 <strong>в</strong> 0z800_0 На петле <strong>в</strong> состоянии 0A1_0 За<strong>в</strong>ершил обработку e0 <strong>в</strong> состоянии 0z10_1, z20_1, z30_3В состояние 1 а<strong>в</strong>томата А1z400_1В состояние 1 а<strong>в</strong>томата А118. A80(z400) e410 <strong>в</strong> 0x900(z400)==0А80(z400) 0 → 3z270_2(z400), z950_1(z400), z1000_1(z400)А80(z400) За<strong>в</strong>ершил обработку е410 <strong>в</strong> состоянии 3z420_1В состояние 1 а<strong>в</strong>томата A1z430_1В состояние 1 а<strong>в</strong>томата A119. А80(z430) е410 <strong>в</strong> 0x900(z430)==0А80(z430) 0 → 3z270_2(z430), z950_1(z430), z1000_1(z430)А80(z430) За<strong>в</strong>ершил обработку е410 <strong>в</strong> состоянии 3z440_1В состояние 1 а<strong>в</strong>томата A120. A80(z440) е410 <strong>в</strong> 0x900(z440)==0A80(z440) 0 → 3z270_2(z440), z950_1(z440), z1000_1(z440)A80(z440) За<strong>в</strong>ершил обработку е410 <strong>в</strong> состоянии 3z460В состояние 1 а<strong>в</strong>томата A121. A5 e380 <strong>в</strong> 0 Выз<strong>в</strong>ан из z460x810==1A5 0 → 2z610_1A5 За<strong>в</strong>ершил обработку е380 <strong>в</strong> состоянии 2z810_1В состояние 1 а<strong>в</strong>томата A1A1 За<strong>в</strong>ершил обработку е0 <strong>в</strong> состоянии 1z290_0В состояние 2 а<strong>в</strong>томата A0A0 За<strong>в</strong>ершил обработку е0 <strong>в</strong> состоянии 222. A5 e10 <strong>в</strong> 2 Вложен <strong>в</strong> состояние 2 а<strong>в</strong>томата A20x810==1, x820==0A5 За<strong>в</strong>ершил обработку е10 <strong>в</strong> состоянии 223. A13 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 2 а<strong>в</strong>томата A20A13 За<strong>в</strong>ершил обработку е10 <strong>в</strong> состоянии 024. A62 e10 <strong>в</strong> 0 Вложен <strong>в</strong> состояние 2 а<strong>в</strong>томата A20A62 0 → 1z1110_1, z1120_1, z1140A62 За<strong>в</strong>ершил обработку е10 <strong>в</strong> состоянии 1A20 За<strong>в</strong>ершил обработку е10 <strong>в</strong> состоянии 2


4.4. Программный имитатор дизель-генератора125Покажем, что предлагаемый подход применим не толькодля разработки программного обеспечения системупра<strong>в</strong>ления, но и для создания имитатора объектаупра<strong>в</strong>ления, необходимого для а<strong>в</strong>тономной отладки системыупра<strong>в</strong>ления.Так как среди четырех разработанных а<strong>в</strong>томато<strong>в</strong> междусобой <strong>в</strong>заимодейст<strong>в</strong>уют только а<strong>в</strong>томаты A30 и A31 (по<strong>в</strong>ложенности), то схема <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong> непри<strong>в</strong>одится.Обратим <strong>в</strong>нимание, что некоторые из реализующихимитатор а<strong>в</strong>томато<strong>в</strong> осущест<strong>в</strong>ляют упра<strong>в</strong>ление аналого<strong>в</strong>ымипараметрами. Среди а<strong>в</strong>томато<strong>в</strong>, рассмотренных ниже, а<strong>в</strong>томатA20 <strong>в</strong>ыполняет имитацию изменения затяжки пружинырегулятора частоты <strong>в</strong>ращения, а а<strong>в</strong>томат A31 имитируетизменение частоты <strong>в</strong>ращения дизель-генератора. Это<strong>в</strong>оз<strong>можно</strong> благодаря тому, что <strong>в</strong>ходные переменные и<strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong> реализуются функциями,которые могут <strong>в</strong>ыполнять произ<strong>в</strong>ольные дейст<strong>в</strong>ия.Также отметим, что <strong>в</strong> отличие от из<strong>в</strong>естных подходо<strong>в</strong>,ориентиро<strong>в</strong>анных на моделиро<strong>в</strong>ание динамических систем сиспользо<strong>в</strong>анием гибридных а<strong>в</strong>томато<strong>в</strong> (например, реализующихкусочно-непреры<strong>в</strong>ные функции) [4], <strong>в</strong> рамках предлагаемойпарадигмы при программиро<strong>в</strong>ании применяются конечныеа<strong>в</strong>томаты с "расширенными" <strong>в</strong>ходами и <strong>в</strong>ыходами. При этомдля описания по<strong>в</strong>едения а<strong>в</strong>томато<strong>в</strong> используется нотация,<strong>в</strong>есьма близкая к классической, и применяются такиеклассические термины как, например, а<strong>в</strong>томаты Мура и Мили.


4.4.1. А<strong>в</strong>томат имитации исполнительного устройст<strong>в</strong>а1264.4.1.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат предназначен для имитации клапана (или любогоаналогичного по логике работы исполнительного устройст<strong>в</strong>а,например, электрод<strong>в</strong>игателя, используемого <strong>в</strong>рассматри<strong>в</strong>аемой системе), снабженного сигнализаторамиоткрытого и закрытого положения.При построении а<strong>в</strong>томата учиты<strong>в</strong>аются следующиеособенности моделируемого устройст<strong>в</strong>а.1. При поступлении команды открытия или закрытияклапана <strong>в</strong>ключается задержка <strong>в</strong>ремени исполнения команды,по истечении которой имитируется срабаты<strong>в</strong>аниесигнализатора соот<strong>в</strong>етст<strong>в</strong>ующего положения.2. Если до истечения <strong>в</strong>ремени задержки исполнениякоманды поступает команда пере<strong>в</strong>ода клапана <strong>в</strong> исходноеположение, задержка <strong>в</strong>ключается зано<strong>в</strong>о и <strong>в</strong>ыполняетсяотработка но<strong>в</strong>ой команды.Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 43, 44.4.4.1.2. Схема с<strong>в</strong>язейОбработчикисобытийОткрыть клапанЗакрыть клапанИстечение <strong>в</strong>ремени исполнения командыe10e20e30А10z10_0z10_1Сбросить таймерЗапустить таймерТаймер задержки<strong>в</strong>ыполнения командыисполнительнымустройст<strong>в</strong>омРис. 43. Схема с<strong>в</strong>язей а<strong>в</strong>томата имитации исполнительногоустройст<strong>в</strong>а


4.4.1.3. Граф переходо<strong>в</strong>1270. Закрыт (остано<strong>в</strong>лен)e102. Откры<strong>в</strong>ается (запускается)e20z10_0e303. Закры<strong>в</strong>ается(остана<strong>в</strong>ли<strong>в</strong>ается)z10_1e10z10_0z10_1e301. Открыт (запущен)e20Рис. 44. Граф переходо<strong>в</strong> а<strong>в</strong>томата имитацииисполнительного устройст<strong>в</strong>а4.4.1.4. Текст функции, реализующей а<strong>в</strong>томат#include "photon_stuff.h"#include "dg.h"void A10( int e, dg_t *dg, valve_t *v ){int y_old = v->y ;switch( v->y ){case 0:if( e == 10 ) v->y = 2 ;break ;case 1:if( e == 20 ) v->y = 3 ;break ;case 2:if( e == 30 ) v->y = 1 ;elseif( e == 20 ) { z10_0(dg,v) ; v->y = 3 ; } ;break ;case 3:if( e == 30 ) v->y = 0 ;elseif( e == 10 ) { z10_0(dg,v) ; v->y = 2 ; } ;break ;} ;if( y_old == v->y ) return ;switch( v->y ){case 2:z10_1(dg,v) ;break ;case 3:z10_1(dg,v) ;break ;} ;} ;


1284.4.2. А<strong>в</strong>томат имитации регулятора частоты <strong>в</strong>ращения4.4.2.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат предназначен для имитации регулятора частоты<strong>в</strong>ращения. А<strong>в</strong>томат обрабаты<strong>в</strong>ает команды на уменьшение илиу<strong>в</strong>еличение затяжки пружины регулятора, имитируя при этомсрабаты<strong>в</strong>ание сигнализаторо<strong>в</strong> крайних положений регулятора.Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 45, 46.4.4.2.2. Схема с<strong>в</strong>язейОбработчикисобытийОстано<strong>в</strong>ить регулятор частоты <strong>в</strong>ращенияУ<strong>в</strong>еличить затяжку пружиныУменьшить затяжку пружиныДостигнуто минимальное значение затяжкиДостигнуто максимальное значение затяжкиСигнал от таймера синхроимпульсо<strong>в</strong>e11e21e31e41e51e61А20z20_0z20_1z30_0z30_1Сбросить таймерЗапустить таймерСбросить таймерЗапустить таймерТаймерсинхроимпульсо<strong>в</strong>модели регуляторачастоты <strong>в</strong>ращенияУменьшитьзатяжку пружинырегулятораУ<strong>в</strong>еличитьзатяжку пружинырегулятораРис. 45. Схема с<strong>в</strong>язей а<strong>в</strong>томата имитации регуляторачастоты <strong>в</strong>ращения4.4.2.3. Граф переходо<strong>в</strong>e21z20_10. Остано<strong>в</strong>ленe31z20_1z20_0e11∨ e51e11∨ e411. У<strong>в</strong>еличи<strong>в</strong>ать e21 2. Уменьшатьe31e61z30_1e61z30_0Рис. 46. Граф переходо<strong>в</strong> а<strong>в</strong>томата имитациирегулятора частоты <strong>в</strong>ращения


4.4.2.4. Текст функции, реализующей а<strong>в</strong>томат129#include "photon_stuff.h"#include "dg.h"void A20( int e, dg_t *dg ){int y_old = dg->y20 ;switch( dg->y20 ){case 0:if( e == 21 ) { z20_1(dg) ; dg->y20 = 1 ; }elseif( e == 31 ) { z20_1(dg) ; dg->y20 = 2 ; }break ;case 1:if( e == 11 || e == 51 ) dg->y20 = 0 ;elseif( e == 31 ) dg->y20 = 2 ;elseif( e == 61 ) { z30_1(dg) ; } ;break ;case 2:if( e == 11 || e == 41 ) dg->y20 = 0 ;elseif( e == 21 ) dg->y20 = 1 ;elseif( e == 61 ) { z30_0(dg) ; } ;break ;} ;if( y_old == dg->y20 ) return ;switch( dg->y20 ){case 0:z20_0(dg) ;break ;} ;} ;4.4.3. А<strong>в</strong>томат имитации дизель-генератора4.4.3.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат предназначен для имитации осно<strong>в</strong>ных состоянийдизель-генератора. В нем <strong>в</strong>ыделены состояния,перечисленные ниже.1. Остано<strong>в</strong>лен.2. Про<strong>в</strong>орот. Имитатор дизель-генератора переходит <strong>в</strong>это состояние при срабаты<strong>в</strong>ании имитаторо<strong>в</strong> сигнализаторо<strong>в</strong>открытых положений клапано<strong>в</strong> подачи <strong>в</strong>оздуха и подачи<strong>в</strong>оздуха низкого да<strong>в</strong>ления. В этом состоянии с заданной


130частотой имитируется <strong>в</strong>ыдача сигнало<strong>в</strong> от датчика про<strong>в</strong>оротаколен<strong>в</strong>ала.3. Запуск. Имитатор дизель-генератора переходит <strong>в</strong> этосостояние при срабаты<strong>в</strong>ании имитаторо<strong>в</strong> сигнализаторо<strong>в</strong>открытого положения клапана подачи <strong>в</strong>оздуха и гла<strong>в</strong>ногопуско<strong>в</strong>ого клапана. При этом запускается задержка <strong>в</strong>ременипуска, по истечении которой имитируется запуск дизельгенератора.4. Работа. В этом состоянии <strong>в</strong>ыполняется алгоритмимитации изменения частоты <strong>в</strong>ращения, описанный <strong>в</strong>следующем подразделе.Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 47, 48.4.4.3.2. Схема с<strong>в</strong>язейПараметрымоделиОткрыт клапан подачи <strong>в</strong>оздухаОткрыт клапан подачи <strong>в</strong>оздуха низкогода<strong>в</strong>ления к ДГОткрыт гла<strong>в</strong>ный пуско<strong>в</strong>ой клапанx10x20x30А30z50_0z50_1z60Сбросить таймерЗапустить таймерВыдать сигнал от ДПКВВложенные а<strong>в</strong>томаты: A31Таймерсинхроимпульсо<strong>в</strong>модели про<strong>в</strong>оротаСУ ДГАлгоритм имитацииизменения частоты<strong>в</strong>ращения A31Дизель остано<strong>в</strong>илсяy31 = 4z70_0z70_1Сбросить таймерЗапустить таймерТаймер имитациизадержки пускаz80Устано<strong>в</strong>итьчастоту <strong>в</strong>ращенияЧВО + 10ОбработчикисобытийСигнал от таймера про<strong>в</strong>оротаСигнал от таймера задержки пускаОбобщенная команда остано<strong>в</strong>а дизеляe90e100e200z90_0z90_1Сбросить таймерЗапустить таймерТаймерсинхроимпульсо<strong>в</strong>модели дизеляРис. 47. Схема с<strong>в</strong>язей а<strong>в</strong>томата имитации дизель-генератора


4.4.3.3. Граф переходо<strong>в</strong>131y31= 4e90z60z50_11. Про<strong>в</strong>оротx10 ⋅ x20x10 ∨ x20 ∨ e2000. Остано<strong>в</strong>ленz: 50_0; 90_0x10 ∨ x30 ∨ e200x10 ⋅ x30z70_12. Запускe100z80A31z90_13. РаботаРис. 48. Граф переходо<strong>в</strong> а<strong>в</strong>томата имитации дизельгенератора4.4.3.4. Текст функции, реализующей а<strong>в</strong>томат#include "photon_stuff.h"#include "dg.h"void A30( int e, dg_t *dg ){int y_old = dg->y30 ;switch( dg->y30 ){case 0:if( x10(dg) && x20(dg) ) dg->y30 = 1 ;elseif( x10(dg) && x30(dg) ) dg->y30 = 2 ;break ;case 1:if( !x10(dg) || !x20(dg) || e == 200 ) dg->y30 = 0 ;elseif( e == 90 ) { z60(dg) ; } ;break ;case 2:if( !x10(dg) || !x30(dg) || e == 200 ) dg->y30 = 0 ;elseif( e == 100 ) { z80(dg) ; dg->y30 = 3 ; } ;break ;case 3:A31( e, dg ) ;if( dg->y31 == 4 ) dg->y30 = 0 ;break ;} ;if( y_old == dg->y30 ) return ;switch( dg->y30 ){case 0:z50_0(dg) ; z90_0(dg) ;break ;case 1:z50_1(dg) ;break ;case 2:z70_1(dg) ;break ;case 3:A31(0,dg) ;z90_1(dg) ;break ;} ;} ;


4.4.4. А<strong>в</strong>томат имитации изменения частоты <strong>в</strong>ращения1324.4.4.1. Сло<strong>в</strong>есное описаниеА<strong>в</strong>томат предназначен для имитации изменения частоты<strong>в</strong>ращения дизель-генератора.Если текущая частота <strong>в</strong>ращения дизель-генератораотличается от устано<strong>в</strong>ленной на регуляторе, то имитируетсяпла<strong>в</strong>ное изменение частоты <strong>в</strong>ращения.При поступлении от системы упра<strong>в</strong>ления команды наостано<strong>в</strong> дизель-генератора (этой командой считаетсякоманда на закрытие наружной захлопки газоот<strong>в</strong>ода),<strong>в</strong>ыполняется быстрое уменьшение его частоты <strong>в</strong>ращения донуля.Схема с<strong>в</strong>язей а<strong>в</strong>томата и граф переходо<strong>в</strong> при<strong>в</strong>едены нарис. 49, 50.4.4.4.2. Схема с<strong>в</strong>язейПараметрымоделиЧастота <strong>в</strong>ращения больше заданнойЧастота <strong>в</strong>ращения меньше заданнойx40x50А31z100_0z100_1Уменьшитьчастоту <strong>в</strong>ращенияУ<strong>в</strong>еличитьчастоту <strong>в</strong>ращенияОбработчикисобытийИнициализация <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>Срабаты<strong>в</strong>ание уста<strong>в</strong>ки частоты <strong>в</strong>ращения остано<strong>в</strong>аСигнал от таймера модели дизеляОбобщенная команда остано<strong>в</strong>а дизеляe0e81e110e200z100_2Резко уменьшитьчастоту <strong>в</strong>ращенияРис. 49. Схема с<strong>в</strong>язей а<strong>в</strong>томата имитации изменения частоты<strong>в</strong>ращения


4.4.4.3. Граф переходо<strong>в</strong>1330. Устано<strong>в</strong>и<strong>в</strong>шийся режимx40x50e2002. Тормозится x40x50 1. Разгоняетсяe0e110z100_0e200e200e110z100_14. Остано<strong>в</strong>ленe813. Остана<strong>в</strong>ли<strong>в</strong>аетсяe110z100_2Рис. 50. Граф переходо<strong>в</strong> а<strong>в</strong>томата имитации изменениячастоты <strong>в</strong>ращения4.4.4.4. Текст функции, реализующей а<strong>в</strong>томат#include "photon_stuff.h"#include "dg.h"void A31( int e, dg_t *dg ){int y_old = dg->y31 ;switch( dg->y31 ){case 0:if( x40(dg) ) dg->y31 = 2 ;elseif( x50(dg) ) dg->y31 = 1 ;elseif( e == 200 ) dg->y31 = 3 ;break ;case 1:if( !x50(dg) ) dg->y31 = 0 ;elseif( e == 110 ) { z100_1(dg) ; }elseif( e == 200 ) dg->y31 = 3 ;break ;case 2:if( !x40(dg) ) dg->y31 = 0 ;elseif( e == 110 ) { z100_0(dg) ; }elseif( e == 200 ) dg->y31 = 3 ;break ;case 3:if( e == 81 ) dg->y31 = 4 ;elseif( e == 110 ) { z100_2(dg) ; } ;break ;case 4:if( e == 0 ) dg->y31 = 0 ;break ;} ;} ;


1345. ЗаключениеВ результате исследо<strong>в</strong>аний по теме "Разработкаосно<strong>в</strong>ных положений технологии создания программногообеспечения "реакти<strong>в</strong>ных" систем", <strong>в</strong>ыполненных по <strong>в</strong>торомуэтапу темы "Разработка технологии создания программногообеспечения систем упра<strong>в</strong>ления на осно<strong>в</strong>е а<strong>в</strong>томатногоподхода", сформулиро<strong>в</strong>аны осно<strong>в</strong>ные положения технологии,поддержи<strong>в</strong>ающей для рассматри<strong>в</strong>аемого класса систем <strong>в</strong>сеэтапы создания программного обеспечения, к которымотносятся: изучение предметной области, анализ,проектиро<strong>в</strong>ание, реализация, отладка, сертификация идокументиро<strong>в</strong>ание.К таким положениям могут быть отнесены следующие:− четко <strong>в</strong>ыделен этап проектиро<strong>в</strong>ания, предшест<strong>в</strong>ующийэтапу реализации. При этом строятся схемы и диаграммы,которые <strong>в</strong> дальнейшем формально и изоморфно преобразуются<strong>в</strong> текст программы. Такая организация процесса разработкианалогична принятой при создании аппаратуры, изгото<strong>в</strong>лениекоторой <strong>в</strong>ыполняется только по проектной документации;− опыт использо<strong>в</strong>ания предлагаемой технологиипоказы<strong>в</strong>ает, что при тщательном проектиро<strong>в</strong>ании построеннаяна этапе реализации программа либо сразу работаетпра<strong>в</strong>ильно, либо требует сущест<strong>в</strong>енно меньшего <strong>в</strong>ремени наотладку, чем при традиционном подходе;− расширено по отношению к системам логическогоупра<strong>в</strong>ления понятие "<strong>в</strong>ходное <strong>в</strong>оздейст<strong>в</strong>ие" за счетиспользо<strong>в</strong>ания "событий", которые <strong>в</strong> отличие от "<strong>в</strong>ходныхпеременных", не опраши<strong>в</strong>аются программой, а <strong>в</strong>ызы<strong>в</strong>аютсоот<strong>в</strong>етст<strong>в</strong>ующие им обработчики;


135− расширены понятия "<strong>в</strong>ходная переменная" и "<strong>в</strong>ыходное<strong>в</strong>оздейст<strong>в</strong>ие" за счет перехода от д<strong>в</strong>оичных переменных кпроиз<strong>в</strong>ольным подпрограммам (функциям);− разработана но<strong>в</strong>ая структурная схема событийныхсистем, <strong>в</strong> которой по<strong>в</strong>ышен уро<strong>в</strong>ень централизацииупра<strong>в</strong>ления за счет <strong>в</strong>ыноса логики из обработчико<strong>в</strong> событийс целью формиро<strong>в</strong>ания системы <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong>,которые при необходимости <strong>в</strong>ызы<strong>в</strong>аются из обработчико<strong>в</strong>событий с передачей а<strong>в</strong>томатам соот<strong>в</strong>етст<strong>в</strong>ующих событий;− дополнена нотация, применяемая при построенииграфо<strong>в</strong> переходо<strong>в</strong>, например, за счет перечисления<strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>;− <strong>в</strong> отличие от объектно-ориентиро<strong>в</strong>анногопроектиро<strong>в</strong>ания построение <strong>в</strong>сех осно<strong>в</strong>ных моделей осно<strong>в</strong>анона применении только а<strong>в</strong>томатной терминологии, а дляописания динамики используется модель только одного типа— система <strong>в</strong>заимос<strong>в</strong>язанных графо<strong>в</strong> переходо<strong>в</strong>. При этома<strong>в</strong>томаты <strong>в</strong> я<strong>в</strong>ном <strong>в</strong>иде используются на разных этапахсоздания программного обеспечения: проектиро<strong>в</strong>ании,программиро<strong>в</strong>ании, отладки и документиро<strong>в</strong>ании;− применение а<strong>в</strong>томато<strong>в</strong> <strong>в</strong> предлагаемой нотации <strong>в</strong>качест<strong>в</strong>е динамической модели поз<strong>в</strong>оляет эффекти<strong>в</strong>ноописы<strong>в</strong>ать и реализо<strong>в</strong>ы<strong>в</strong>ать задачи рассматри<strong>в</strong>аемого классадаже при большой их размерности. Использо<strong>в</strong>ание графо<strong>в</strong>переходо<strong>в</strong> <strong>в</strong> качест<strong>в</strong>е языка спецификации делает обозримымдаже <strong>в</strong>есьма сложное по<strong>в</strong>едение программы и поз<strong>в</strong>оляет легко<strong>в</strong>носить изменения как <strong>в</strong> спецификацию, так и <strong>в</strong> еереализацию;− со<strong>в</strong>местное рассмотрение схемы с<strong>в</strong>язей а<strong>в</strong>томата и егографа переходо<strong>в</strong> поз<strong>в</strong>оляет понимать этот граф, асо<strong>в</strong>местное рассмотрение графа переходо<strong>в</strong> и изоморфной емуподпрограммы обеспечи<strong>в</strong>ает понимание последней;


136− разработан уни<strong>в</strong>ерсальный алгоритм программнойреализации иерархии графо<strong>в</strong> переходо<strong>в</strong> для произ<strong>в</strong>ольного ихколичест<strong>в</strong>а и произ<strong>в</strong>ольного уро<strong>в</strong>ня <strong>в</strong>ложенности;− каждый граф переходо<strong>в</strong> формально и изоморфнореализуется по шаблону <strong>в</strong> <strong>в</strong>иде подпрограммы на <strong>в</strong>ыбранномязыке программиро<strong>в</strong>ания. Указанный изоморфизм поз<strong>в</strong>оляетрешить обратную задачу — однозначно <strong>в</strong>осстано<strong>в</strong>ить графпереходо<strong>в</strong> по этой подпрограмме;− а<strong>в</strong>томатическое <strong>в</strong>едение протокола <strong>в</strong> терминахспецификации (а<strong>в</strong>томато<strong>в</strong>) обеспечи<strong>в</strong>ает <strong>в</strong>оз<strong>можно</strong>стьсертификации программы. При этом для рассматри<strong>в</strong>аемыхсобытий при <strong>в</strong>ыбранных значениях <strong>в</strong>ходных переменныхдемонстрируется соот<strong>в</strong>етст<strong>в</strong>ие функциониро<strong>в</strong>ания программы"по<strong>в</strong>едению", определяемому <strong>в</strong>ыходными <strong>в</strong>оздейст<strong>в</strong>иями исостояниями а<strong>в</strong>томато<strong>в</strong>, которые отражаются <strong>в</strong> "полном"протоколе. Со<strong>в</strong>окупность "полных" протоколо<strong>в</strong> обеспечи<strong>в</strong>ает<strong>в</strong>оз<strong>можно</strong>сть сертификации программы <strong>в</strong> целом. Длясертификации <strong>в</strong> терминах, понятных Заказчику, могутприменяться "короткие" протоколы, <strong>в</strong> которых указы<strong>в</strong>аются,например, только формируемые <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия;− <strong>в</strong>оз<strong>можно</strong>сть а<strong>в</strong>томатического получения "полных"протоколо<strong>в</strong> <strong>в</strong> терминах а<strong>в</strong>томато<strong>в</strong> показы<strong>в</strong>ает, что система<strong>в</strong>заимос<strong>в</strong>язанных графо<strong>в</strong> переходо<strong>в</strong>, используемая дляспецификации алгоритмо<strong>в</strong>, я<strong>в</strong>ляется не "картинкой", аматематической моделью;− порождаемый некоторыми событиями протокол или егочасть я<strong>в</strong>ляется соот<strong>в</strong>етст<strong>в</strong>ующим сценарием. Таким образом,<strong>в</strong> рамках разработанной технологии сценарий строитсяа<strong>в</strong>томатически по построенной программе, а не <strong>в</strong>ручную приее синтезе, как это предлагается делать, например, прииспользо<strong>в</strong>ании языка UML. Это объясняется тем, что ручноепостроение <strong>в</strong>сей со<strong>в</strong>окупности сценарие<strong>в</strong> и формальный


137синтез системонеза<strong>в</strong>исимой части программы по ним длязадач со сложным по<strong>в</strong>едением практически не<strong>в</strong>оз<strong>можно</strong>;− кроме отладки и сертификации программы сиспользо<strong>в</strong>анием протоколо<strong>в</strong>, <strong>в</strong>озможен также традиционныйинтеракти<strong>в</strong>ный подход и отладка на осно<strong>в</strong>е <strong>в</strong><strong>в</strong>еденного <strong>в</strong> [1]с<strong>в</strong>ойст<strong>в</strong>а наблюдаемости программ (по номерам состоянийа<strong>в</strong>томато<strong>в</strong>);− без использо<strong>в</strong>ания объектного подхода программачетко разделяется на д<strong>в</strong>е части — системонеза<strong>в</strong>исимую исистемоза<strong>в</strong>исимую;− этапы проектиро<strong>в</strong>ания и реализациисистемонеза<strong>в</strong>исимой части программы полностью разделены;− системонеза<strong>в</strong>исимая часть программы имеет регулярнуюструктуру и, следо<strong>в</strong>ательно, легко читается икорректируется;− реализация <strong>в</strong>ходных переменных и <strong>в</strong>ыходных<strong>в</strong>оздейст<strong>в</strong>ий <strong>в</strong> <strong>в</strong>иде функций обеспечи<strong>в</strong>ает: абстрагиро<strong>в</strong>ание,декомпозицию, протоколиро<strong>в</strong>ание, упрощение <strong>в</strong>несенияизменений, простоту перехода от одних типо<strong>в</strong> источнико<strong>в</strong> иприемнико<strong>в</strong> информации к другим, а также наличиедейст<strong>в</strong>ующего макета программы <strong>в</strong> любой момент <strong>в</strong>ременипосле начала реализации системоза<strong>в</strong>исимой части;− подробное документиро<strong>в</strong>ание проекта созданияпрограммного обеспечения упрощает <strong>в</strong>несение изменений <strong>в</strong>него даже через длительный срок после <strong>в</strong>ыпуска, <strong>в</strong> томчисле и специалистами, не участ<strong>в</strong>о<strong>в</strong>а<strong>в</strong>шими <strong>в</strong>проектиро<strong>в</strong>ании. При этом изменения должны <strong>в</strong>носиться <strong>в</strong><strong>в</strong>есь комплект документации, а не только <strong>в</strong> его программнуючасть. Внесение изменений <strong>в</strong> системонеза<strong>в</strong>исимую частьдолжно начинаться с корректиро<strong>в</strong>ки графо<strong>в</strong> переходо<strong>в</strong>,структура которых <strong>в</strong>есьма удобна для <strong>в</strong>несения изменений.Внесенные <strong>в</strong> графы переходо<strong>в</strong> изменения должны быть


138формально и изоморфно отражены <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ующихпрограммных модулях.В заключение отметим, что <strong>в</strong> предыдущие десятилетиябольшинст<strong>в</strong>о программисто<strong>в</strong> имели либо инженерное, либоматематическое образо<strong>в</strong>ание с соот<strong>в</strong>етст<strong>в</strong>ующей, устоя<strong>в</strong>шейся<strong>в</strong>еками, культурой. Со<strong>в</strong>ременные программисты <strong>в</strong>оспиты<strong>в</strong>аютсяиначе [12], а дисциплине программиро<strong>в</strong>ания должного<strong>в</strong>нимания не уделяется.Предлагаемая технология я<strong>в</strong>ляется но<strong>в</strong>ой попыткой<strong>в</strong><strong>в</strong>едения такой дисциплины и осно<strong>в</strong>ана на априорном заданиитребуемых состояний и их <strong>в</strong>изуализации.Опыт применения предлагаемой технологии подт<strong>в</strong>ердилследующее <strong>в</strong>ысказы<strong>в</strong>ание: "то, что не специфициро<strong>в</strong>аноформально, не может быть про<strong>в</strong>ерено, а то, что не можетбыть про<strong>в</strong>ерено, не может быть безошибочным" [13]. Поэтомуа<strong>в</strong>торы надеются (особенно учиты<strong>в</strong>ая мнение о работе [1],<strong>в</strong>ысказанное <strong>в</strong> [14]), что предложенный подход по крайнеймере для систем логического упра<strong>в</strong>ления и "реакти<strong>в</strong>ных"систем я<strong>в</strong>ляется приближением к "серебряной пуле" [8] <strong>в</strong>части создания качест<strong>в</strong>енных программ, тем более, чтоФ. Брукс отоз<strong>в</strong>ался благосклонно только о подходеД. Харела [5], также осно<strong>в</strong>анном на применении а<strong>в</strong>томато<strong>в</strong>,преимущест<strong>в</strong>о по сра<strong>в</strong>нению с которым показано <strong>в</strong> [11].Целесообразность использо<strong>в</strong>ания а<strong>в</strong>томатного подходаподт<strong>в</strong>ерждается и тем, что создатель операционной системыUNIX К. Томпсон на <strong>в</strong>опрос о текущей работе от<strong>в</strong>етил: "Мысоздали язык генерации машин с конечным числом состояний,так как реальный селекторный телефонный разго<strong>в</strong>ор — этогруппа <strong>в</strong>заимодейст<strong>в</strong>ующих машин с конечным числомсостояний. Этот язык применяется <strong>в</strong> "Bell Labs" по прямомуназначению — для создания указанных машин, а <strong>в</strong>доба<strong>в</strong>ок сего помощью стали разрабаты<strong>в</strong>ать драй<strong>в</strong>еры" [15].


139Применение <strong>в</strong> предлагаемой парадигме понятия "а<strong>в</strong>томат"<strong>в</strong> качест<strong>в</strong>е центрального, соот<strong>в</strong>етст<strong>в</strong>ует его месту <strong>в</strong> теорииупра<strong>в</strong>ления, что принципиально отличает данный подход отдругих парадигм программиро<strong>в</strong>ания.А<strong>в</strong>торы считают, что предложенный подход длярассматри<strong>в</strong>аемых классо<strong>в</strong> систем, <strong>в</strong>есьма распространенныхна практике, <strong>в</strong> соот<strong>в</strong>етст<strong>в</strong>ии с принципом Оккама "неразмножает сущности без необходимости" (как, например,UML) и обладает "минимализмом" [16], достаточным дляобеспечения понимаемости программ специалистами, нея<strong>в</strong>ляющимися их разработчиками.Отметим также, что предложенная <strong>в</strong> настоящей работепарадигма сущест<strong>в</strong>енно отличается от изложенной <strong>в</strong> [4].Осно<strong>в</strong>ное отличие заключается <strong>в</strong> том, что нами предлагаетсятехнология, не за<strong>в</strong>исящая от сред разработки и реализации,а <strong>в</strong> [4] рассмотрены программные продукты длямоделиро<strong>в</strong>ания.Рассматри<strong>в</strong>аемая <strong>в</strong> настоящей работе парадигмаа<strong>в</strong>томатного программиро<strong>в</strong>ания, которая может быть наз<strong>в</strong>анатакже "программиро<strong>в</strong>ание с я<strong>в</strong>ным <strong>в</strong>ыделением состояний",начинает <strong>в</strong>се шире использо<strong>в</strong>аться [17—19]. Для большей еепопуляризации на сайте [20] создан раздел "А<strong>в</strong>томаты".6. Публикации по результатам этапаПо результатам <strong>в</strong>ыполненных <strong>в</strong> ходе этапа работопублико<strong>в</strong>аны следующие статьи:1. Шалыто А.А., Туккель Н.И. SWITCH-технология -а<strong>в</strong>томатный подход к созданию программного обеспечения"реакти<strong>в</strong>ных" систем //Промышленные АСУ и контроллеры.2000. №10. C. 44-48.


1402. Шалыто А.А., Туккель Н.И. А<strong>в</strong>томатный подход к созданиюпрограммного обеспечения для систем логическогоупра<strong>в</strong>ления и "реакти<strong>в</strong>ных" систем //Системы упра<strong>в</strong>ления иобработки. ФГУП "НПО "А<strong>в</strong>рора"". 2000. Вып. 2. С. 165-173.3. Шалыто А.А. Алгоритмизация и программиро<strong>в</strong>ание длясистем логического упра<strong>в</strong>ления и "реакти<strong>в</strong>ных" систем(обзор) //А<strong>в</strong>томатика и телемеханика. 2001. №1. C. 3-39.4. Шалыто А.А., Туккель Н.И. Программиро<strong>в</strong>ание с я<strong>в</strong>ным<strong>в</strong>ыделением состояний //Мир ПК. 2001. №8. C. 116-121,№9. C. 132-138.5. Шалыто А.А., Туккель Н.И. SWITCH-технология -а<strong>в</strong>томатный подход к созданию программного обеспечения"реакти<strong>в</strong>ных" систем //Из<strong>в</strong>естия ВУЗо<strong>в</strong>. Приборостроение.2001. №9. С. 28-35.6. Шалыто А.А., Туккель Н.И. SWITCH-технология -а<strong>в</strong>томатный подход к созданию программного обеспечения"реакти<strong>в</strong>ных" систем //Программиро<strong>в</strong>ание. 2001. №5.С. 45-62.По результатам <strong>в</strong>ыполненных <strong>в</strong> ходе этапа работ <strong>в</strong>материалах конференций опублико<strong>в</strong>аны:1. Шалыто А.А., Туккель Н.И. SWITCH-технология -а<strong>в</strong>томатный подход к созданию программного обеспечения"реакти<strong>в</strong>ных" систем /Тезисы докладо<strong>в</strong> Международнойнаучно-методической конференции "Телематика-2000".СПб.: СПбГИТМО (ТУ), 2000. С. 88-91.2. Шалыто А.А., Туккель Н.И. SWITCH-технология -а<strong>в</strong>томатный подход к созданию программного обеспечения"реакти<strong>в</strong>ных" систем /Материалы международной научнотехническойконференции "Кибернетика и технологии XXI<strong>в</strong>ека". Воронеж: ВГТУ, 2000. С. 308-316.


1413. Шалыто А.А., Туккель Н.И., Вагано<strong>в</strong> С.А. По<strong>в</strong>ышениецентрализации упра<strong>в</strong>ления при программиро<strong>в</strong>ании"реакти<strong>в</strong>ных" систем /Труды международной научнометодическойконференции "Телематика-2001". СПб.:СПбГИТО (ТУ), 2001. С. 174-176.4. Туккель Н.И., Шалыто А.А. Применение а<strong>в</strong>томатногопрограммиро<strong>в</strong>ания для создания "реакти<strong>в</strong>ных" системупра<strong>в</strong>ления /Материалы международной научно-практическойконференции "Математическое моделиро<strong>в</strong>ание <strong>в</strong>образо<strong>в</strong>ании, науке и произ<strong>в</strong>одст<strong>в</strong>е". Тирасполь:Приднепро<strong>в</strong>ский гос. уни<strong>в</strong>ерситет им. Т.Г.Ше<strong>в</strong>ченко, 2001.С. 469-471.Кроме того, по результатам <strong>в</strong>ыполненных <strong>в</strong> ходе этапаработ были сделаны доклады на конференциях, материалыкоторых <strong>в</strong> настоящее <strong>в</strong>ремя не опублико<strong>в</strong>аны:1. Шалыто А.А., Туккель Н.И. Применение а<strong>в</strong>томатногопроектиро<strong>в</strong>ания программ <strong>в</strong> событийных системах /4-ямеждународная конференция по морским интеллектуальнымтехнологиям "Моринтех-2001". СПб.: НИЦ "МорскиеИнтеллектуальные Технологии", 2001.2. Туккель Н.И., Шалыто А.А. Применение а<strong>в</strong>томатногопроектиро<strong>в</strong>ания программ <strong>в</strong> "реакти<strong>в</strong>ных" системах /Третьямеждународная конференция по проблеме "Логиколинг<strong>в</strong>истическогоупра<strong>в</strong>ления динамическими объектами.СПб.: Институт проблем машино<strong>в</strong>едения РАН, 2001.


142Список литературы1. Шалыто А.А. SWITCH-технология. Алгоритмизация и программиро<strong>в</strong>аниезадач логического упра<strong>в</strong>ления. СПб.: Наука, 1998. 628 с.2. Шалыто А.А. Логическое упра<strong>в</strong>ление. Методы аппаратной и программнойреализации алгоритмо<strong>в</strong>. СПб.:Наука, 2000. 773 с.3. Шалыто А.А., Туккель Н.И. SWITCH-технология — а<strong>в</strong>томатный подход ксозданию программного обеспечения "реакти<strong>в</strong>ных" систем//Программиро<strong>в</strong>ание. 2001. № 5. С. 29-35.4. Бенько<strong>в</strong>ич Е.С., Колесо<strong>в</strong> Ю.Б., Сениченко<strong>в</strong> Ю.Б. Практическоемоделиро<strong>в</strong>ание динамических систем. СПб.: БХВ-Петербург, 2002. 464 с.5. Буч Г., Рамбо Д., Джекобсон А. Язык UML. Руко<strong>в</strong>одст<strong>в</strong>о пользо<strong>в</strong>ателя.М.: ДМК, 2000. 432 с.6. Гудман С., Хидетниеми С. В<strong>в</strong>едение <strong>в</strong> разработку и анализ алгоритмо<strong>в</strong>.М.: Мир, 1981. 366 с.7. Затули<strong>в</strong>етер Ю.С. Халатян Т.Г. Синтез общих алгоритмо<strong>в</strong> подемонстрациям частных примеро<strong>в</strong> (а<strong>в</strong>томатная модель обобщения попримерам). М.: Ин-т проблем упра<strong>в</strong>ления, 1997. 72 с.8. Брукс Ф. Мифический чело<strong>в</strong>еко-месяц или как создаются программныесистемы. СПб.: Сим<strong>в</strong>ол, 2000. 304 с.9. Ершо<strong>в</strong> А.П. Смешанные <strong>в</strong>ычисления //В мире науки. 1984. ¹ 6.10. Ла<strong>в</strong>ро<strong>в</strong> С.С. Программиро<strong>в</strong>ание. Математические осно<strong>в</strong>ы, средст<strong>в</strong>а,теория. СПб.: БХВ-Петербург, 2001. 320 с.11. Шалыто А.А. Алгоритмизация и программиро<strong>в</strong>ание для систем логическогоупра<strong>в</strong>ления и "реакти<strong>в</strong>ных" систем // А<strong>в</strong>томатика и телемеханика. 2001.№1. C.3-35.12. Черняк Л. Создание программ как инженерная дисциплина//COMPUTERWORLD РОССИЯ. 2000. №37. С.18-20.13. Зайце<strong>в</strong> С.С. Описание и реализация протоколо<strong>в</strong> сетей ЭВМ. М.: Наука,1989. 112 с.14. Герр Р. Но<strong>в</strong>ый по<strong>в</strong>орот // PC Magazine / Russian Edition. 1998. №10.С.88-90.15. Кук Д., Урбан Д., Хамилтон С. Unix и не только. Интер<strong>в</strong>ью с КеномТомпсоном //Открытые системы. 1999. №4. С.35-47.16. Герр Р. Отладка чело<strong>в</strong>ечест<strong>в</strong>а // PC Magazine / Russian Edition. 2000.№5. С.90-91.17. Богатыре<strong>в</strong> Р. Об асинхронном и а<strong>в</strong>томатном программиро<strong>в</strong>ании //Открытыесистемы. 2001. N3. С.68-69.18. Любченко В.С. Мы <strong>в</strong>ыбираем, нас <strong>в</strong>ыбирают... (к проблеме <strong>в</strong>ыбораалгоритмической модели) //Мир ПК. 1999. N3. С.38-40.19. Кузнецо<strong>в</strong> Б.П. Психология а<strong>в</strong>томатного программиро<strong>в</strong>ания //BYTE/Россия.2000. N11. С.22-29.20. http://www.softcraft.ru


143ГлоссарийА<strong>в</strong>томатА<strong>в</strong>томат МилиА<strong>в</strong>томат МураАкти<strong>в</strong>ация<strong>в</strong>ложенного а<strong>в</strong>томатаБеспо<strong>в</strong>торностьопроса <strong>в</strong>ходныхпеременныхВершина графапереходо<strong>в</strong>Вложенный а<strong>в</strong>томатВнутреннее событиеВходная переменнаяСо<strong>в</strong>окупность множест<strong>в</strong>а состояний и множест<strong>в</strong>а переходо<strong>в</strong>между состояниями. Усло<strong>в</strong>ия переходо<strong>в</strong> формируются измножест<strong>в</strong>а <strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ий. В состояниях, на переходах ипетлях могут формиро<strong>в</strong>аться <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ияА<strong>в</strong>томат, формирующий <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия на переходахА<strong>в</strong>томат, формирующий <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия <strong>в</strong> состоянияхВ общем случае <strong>в</strong>ыполняется при переходе голо<strong>в</strong>ного а<strong>в</strong>томата<strong>в</strong> состояние, <strong>в</strong> которое <strong>в</strong>ложен рассматри<strong>в</strong>аемый а<strong>в</strong>томат.Акти<strong>в</strong>ация заключается <strong>в</strong> запуске <strong>в</strong>ложенного а<strong>в</strong>томата соспециальным <strong>в</strong>нутренним событием e0. В осно<strong>в</strong>ном используетсядля пере<strong>в</strong>ода а<strong>в</strong>томата <strong>в</strong> начальное состояниеТребо<strong>в</strong>ание, заключающееся <strong>в</strong> том, что при про<strong>в</strong>ерке усло<strong>в</strong>ийперехода из состояния а<strong>в</strong>томата, каждая <strong>в</strong>ходная переменнаядолжна опраши<strong>в</strong>аться не более одного раза (проблема"риска").Прямоугольник с закругленными углами (или окружность),обозначающий состояние а<strong>в</strong>томата. Вершина может помечатьсяномером состояния и его наз<strong>в</strong>анием, перечнем формируемых<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий и перечнем <strong>в</strong>ложенных а<strong>в</strong>томато<strong>в</strong>А<strong>в</strong>томат, запускаемый из одного или нескольких состоянийголо<strong>в</strong>ного а<strong>в</strong>томата при запуске последнего. Вложенныйа<strong>в</strong>томат запускается с тем же событием, что и голо<strong>в</strong>нойСобытие, порождаемое <strong>в</strong>нутри системы <strong>в</strong>заимос<strong>в</strong>язанныха<strong>в</strong>томато<strong>в</strong>Входное <strong>в</strong>оздейст<strong>в</strong>ие, опраши<strong>в</strong>аемое а<strong>в</strong>томатомВходное <strong>в</strong>оздейст<strong>в</strong>ие Воздейст<strong>в</strong>ие, при поя<strong>в</strong>лении которого а<strong>в</strong>томат может изменитьсостояние. Входные <strong>в</strong>оздейст<strong>в</strong>ия делятся на события и <strong>в</strong>ходныепеременные. Некоторые <strong>в</strong>ходные <strong>в</strong>оздейст<strong>в</strong>ия могут бытьодно<strong>в</strong>ременно и событием и <strong>в</strong>ходной переменной.Разно<strong>в</strong>идностью <strong>в</strong>ходных переменных я<strong>в</strong>ляются предикаты,про<strong>в</strong>еряющие номера состояний других а<strong>в</strong>томато<strong>в</strong>Входящая дугаВызы<strong>в</strong>аемый а<strong>в</strong>томатВыходное<strong>в</strong>оздейст<strong>в</strong>иеДуга, <strong>в</strong>ходящая <strong>в</strong> рассматри<strong>в</strong>аемую <strong>в</strong>ершинуА<strong>в</strong>томат, запускаемый из <strong>в</strong>ыходного <strong>в</strong>оздейст<strong>в</strong>ия другогоа<strong>в</strong>томата <strong>в</strong> общем случае с передачей <strong>в</strong>нутреннего событияВоздейст<strong>в</strong>ие, пода<strong>в</strong>аемое а<strong>в</strong>томатом на объекты упра<strong>в</strong>ленияГенерирующий контур Контур <strong>в</strong> графе переходо<strong>в</strong>, усло<strong>в</strong>ия на дугах которого могутбыть одно<strong>в</strong>ременно истинныГоло<strong>в</strong>ной а<strong>в</strong>томатГраф переходо<strong>в</strong>Группо<strong>в</strong>ая дугаА<strong>в</strong>томат я<strong>в</strong>ляется голо<strong>в</strong>ным для а<strong>в</strong>томата, который <strong>в</strong> него<strong>в</strong>ложенДиаграмма, задающая по<strong>в</strong>едение а<strong>в</strong>томата <strong>в</strong> терминах <strong>в</strong>ходных<strong>в</strong>оздейст<strong>в</strong>ий, состояний, переходо<strong>в</strong> и <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ийДуга, заменяющая для группы <strong>в</strong>ершин дуги с одинако<strong>в</strong>ымиусло<strong>в</strong>иями переходо<strong>в</strong>, <strong>в</strong>ыходными <strong>в</strong>оздейст<strong>в</strong>иями и конечными<strong>в</strong>ершинами


144Группо<strong>в</strong>ая петляДиагностирующий(полный) протоколДостижимостьДуга графапереходо<strong>в</strong>За<strong>в</strong>ершение работыа<strong>в</strong>томатаЗапуск а<strong>в</strong>томатаИсходящая дугаКодиро<strong>в</strong>аниесостоянийМногозначноекодиро<strong>в</strong>аниесостоянийНаблюдаемостьпрограммыНепроти<strong>в</strong>оречи<strong>в</strong>остьОбмен номерамисостоянийОбработчик событияОператор switchОпрос <strong>в</strong>ходныхпеременныхПеременнаясостояния а<strong>в</strong>томатаПереход <strong>в</strong> а<strong>в</strong>томатеПетля графапереходо<strong>в</strong>Петля, заменяющая для группы <strong>в</strong>ершин петли с одинако<strong>в</strong>ымиусло<strong>в</strong>иями переходо<strong>в</strong> и <strong>в</strong>ыходными <strong>в</strong>оздейст<strong>в</strong>иямиПротокол, содержащий записи о запуске а<strong>в</strong>томато<strong>в</strong>, за<strong>в</strong>ершенииих работы, опросе <strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ий, формиро<strong>в</strong>ании<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий, изменении состояний а<strong>в</strong>томато<strong>в</strong>. Этотпротокол может быть использо<strong>в</strong>ан для локализации ошибокС<strong>в</strong>ойст<strong>в</strong>о графа переходо<strong>в</strong>, заключающееся <strong>в</strong> сущест<strong>в</strong>о<strong>в</strong>аниихотя бы одного пути из каждой <strong>в</strong>ершины <strong>в</strong> любую другуюЛиния, заканчи<strong>в</strong>ающаяся стрелкой, которая с<strong>в</strong>язы<strong>в</strong>ает д<strong>в</strong>е<strong>в</strong>ершины <strong>в</strong> графе переходо<strong>в</strong>. Дуга может помечатьсяприоритетом, усло<strong>в</strong>ием перехода и перечнем формируемых<strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ийЗа<strong>в</strong>ершение работы подпрограммы, реализующей а<strong>в</strong>томатВызо<strong>в</strong> подпрограммы, реализующей а<strong>в</strong>томат, с передачей <strong>в</strong>качест<strong>в</strong>е параметра номера произошедшего события и, еслинеобходимо, информации о немДуга, исходящая из рассматри<strong>в</strong>аемой <strong>в</strong>ершиныПрис<strong>в</strong>оение состояниям уникальных (численных)идентификаторо<strong>в</strong>, поз<strong>в</strong>оляющих различать эти состояния. Этаппредлагаемой технологииРазно<strong>в</strong>идность кодиро<strong>в</strong>ания состояний, при использо<strong>в</strong>аниикоторого переменной состояния а<strong>в</strong>томата прис<strong>в</strong>аи<strong>в</strong>аетсядесятичное значениеВоз<strong>можно</strong>сть однозначно определить состояние программы <strong>в</strong>любой момент <strong>в</strong>ремени путем слежения за номерами состоянийсистемы <strong>в</strong>заимодейст<strong>в</strong>ующих а<strong>в</strong>томато<strong>в</strong>С<strong>в</strong>ойст<strong>в</strong>о графа переходо<strong>в</strong>, заключающееся <strong>в</strong> том, что усло<strong>в</strong>ияпереходо<strong>в</strong> на исходящих из <strong>в</strong>ершины дугах и петлях не могутбыть истинными одно<strong>в</strong>ременно. Это может быть обеспеченорасстано<strong>в</strong>кой приоритето<strong>в</strong> или ортогонализацией, котораяможет быть физической или математическойСпособ <strong>в</strong>заимодейст<strong>в</strong>ия а<strong>в</strong>томато<strong>в</strong>, при котором один а<strong>в</strong>томатопраши<strong>в</strong>ает значение переменной состояния другого а<strong>в</strong>томатаПодпрограмма, <strong>в</strong>ызы<strong>в</strong>аемая при <strong>в</strong>озникно<strong>в</strong>ении определенногособытия. Обработчики событий запускают голо<strong>в</strong>ной а<strong>в</strong>томатсистемы <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong>Конструкция языка Си (или аналогичная конструкция другогоязыка), используемая для изоморфной реализации а<strong>в</strong>томата,определи<strong>в</strong>шая наз<strong>в</strong>ание технологии. В операторе switchиспользуется переменная состояния, а каждая метка caseсоот<strong>в</strong>етст<strong>в</strong>ует номеру состояния а<strong>в</strong>томатаОбращение из программы к источникам информации,рассматри<strong>в</strong>аемым как <strong>в</strong>ходные переменные, с целью определенияих текущего значенияПеременная, поз<strong>в</strong>оляющая различать состояния а<strong>в</strong>томата.Данная переменная используется <strong>в</strong> операторе switchИзменение состояния а<strong>в</strong>томатаЧастный случай дуги графа переходо<strong>в</strong> с одной и той женачальной и конечной <strong>в</strong>ершиной


145ПолнотаПриоритет переходаПроблема "риска"Про<strong>в</strong>еряющий(короткий) протоколПротоколС<strong>в</strong>ойст<strong>в</strong>о графа переходо<strong>в</strong>, заключающееся <strong>в</strong> том, чтоконъюнкция усло<strong>в</strong>ий переходо<strong>в</strong> на исходящих из <strong>в</strong>ершины дугахи петлях ра<strong>в</strong>на единицеЧисло<strong>в</strong>ое обозначение на графе, определяющее порядокпро<strong>в</strong>ерки усло<strong>в</strong>ий переходо<strong>в</strong> на дугах, исходящих израссматри<strong>в</strong>аемой <strong>в</strong>ершиныЕсли при про<strong>в</strong>ерке усло<strong>в</strong>ий на исходящих из <strong>в</strong>ершины дугаходна и та же <strong>в</strong>ходная переменная опраши<strong>в</strong>ается более одногораза, то сущест<strong>в</strong>ует <strong>в</strong>оз<strong>можно</strong>сть, что переменная изменитс<strong>в</strong>ое значение между этими опросами. Такая ситуации наз<strong>в</strong>анапроблемой "риска" (беспо<strong>в</strong>торность опроса <strong>в</strong>ходныхпеременных).Протокол, содержащий записи о запуске голо<strong>в</strong>ного а<strong>в</strong>томата,за<strong>в</strong>ершении его работы и перечисление <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий,формируемых системой <strong>в</strong>заимос<strong>в</strong>язанных а<strong>в</strong>томато<strong>в</strong> приобработке событийИстория реакции системы <strong>в</strong>заимодейст<strong>в</strong>ующих а<strong>в</strong>томато<strong>в</strong> насобытия с указанием <strong>в</strong>ремени занесения каждой записи.Протокол <strong>в</strong>едется <strong>в</strong> терминах а<strong>в</strong>томато<strong>в</strong> и может содержатьзаписи о запуске а<strong>в</strong>томато<strong>в</strong>, за<strong>в</strong>ершении их работы, опросе<strong>в</strong>ходных <strong>в</strong>оздейст<strong>в</strong>ий, формиро<strong>в</strong>ании <strong>в</strong>ыходных <strong>в</strong>оздейст<strong>в</strong>ий,изменении состояний а<strong>в</strong>томато<strong>в</strong>Реализация а<strong>в</strong>томата Созда<strong>в</strong>аемая по шаблону подпрограмма, реализующая а<strong>в</strong>томатСистемоза<strong>в</strong>исимаячасть программыСистемонеза<strong>в</strong>исимаячасть программыСло<strong>в</strong>есное описаниеа<strong>в</strong>томатаСмешанный а<strong>в</strong>томатСобытиеСобытийная("реакти<strong>в</strong>ная")системаСостояниеЧасть программы, написанная на уро<strong>в</strong>не <strong>в</strong>заимодейст<strong>в</strong>ия соперационной системой, инструментальной средой, аппаратуройи т.д.Часть программы, не за<strong>в</strong>исящая от операционной системы,инструментальной среды, аппаратуры и т.д.Тексто<strong>в</strong>ый документ, содержащий не формализо<strong>в</strong>анное описаниеа<strong>в</strong>томата. Служит для получения общих с<strong>в</strong>едений орассматри<strong>в</strong>аемом а<strong>в</strong>томатеА<strong>в</strong>томат, формирующий <strong>в</strong>ыходные <strong>в</strong>оздейст<strong>в</strong>ия на переходах и <strong>в</strong>состоянияхКратко<strong>в</strong>ременное <strong>в</strong>ходное <strong>в</strong>оздейст<strong>в</strong>ие, запускающее а<strong>в</strong>томатСистема, реагирующая на событияАбстракция, соот<strong>в</strong>етс<strong>в</strong>ующая стадии <strong>в</strong>ыполнения алгоритмаСостояние программы Со<strong>в</strong>окупность значений <strong>в</strong>сех переменных, присутст<strong>в</strong>ующих <strong>в</strong>программе. Для программы, разработанной с использо<strong>в</strong>аниемпредлагаемой технологии — со<strong>в</strong>окупность значений переменныхсостояния <strong>в</strong>сех а<strong>в</strong>томато<strong>в</strong>, которое, <strong>в</strong> с<strong>в</strong>ою очередь, можетбыть предста<strong>в</strong>лено одним десятичным число<strong>в</strong>Схема<strong>в</strong>заимодейст<strong>в</strong>ияа<strong>в</strong>томато<strong>в</strong>Схема с<strong>в</strong>язейа<strong>в</strong>томатаДиаграмма, формально описы<strong>в</strong>ающая <strong>в</strong>заимодейст<strong>в</strong>ие а<strong>в</strong>томато<strong>в</strong>по <strong>в</strong>ложенности, <strong>в</strong>ызы<strong>в</strong>аемости и обмену номерами состоянийДиаграмма, формально описы<strong>в</strong>ающая <strong>в</strong>ходные и <strong>в</strong>ыходные<strong>в</strong>оздейст<strong>в</strong>ия а<strong>в</strong>томата, содержащая также указание <strong>в</strong> какойа<strong>в</strong>томат <strong>в</strong>ложен рассматри<strong>в</strong>аемый и какие а<strong>в</strong>томаты <strong>в</strong>ложены <strong>в</strong>него

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!