С авторами можно связаться по адресу: mail@avrorasystems.com, "для Шалыто".ТУККЕЛЬ Н.И.,...С авторами можно связаться по адресу: mail@avrorasystems.com, "для Шалыто". ТУККЕЛЬ Н.И., ШАЛЫТО А.А. СИСТЕМА УПРАВЛЕНИЯ ДИЗЕЛЬ-ГЕНЕРАТОРОМ (ФРАГМЕНТ) ПРОГРАММИРОВАНИЕ С ЯВНЫМ ВЫДЕЛЕНИЕМ СОСТОЯНИЙ ПРОГРАММНАЯ ДОКУМЕНТАЦИЯ Санкт-Петербург 2002


2СодержаниеВведение ............................................... 3 1. Система управления...2 Содержание Введение ............................................... 3 1. Система управления дизель-генератором ............... 4 1.1. Структурная схема программного обеспечения ..... 4 1.2. Перечень событий ............................... 5 1.3. Перечень входных переменных .................... 7 1.4. Перечень выходных воздействий .................. 7 1.5. Схема взаимодействия автоматов ................. 9 1.6. Автомат включения-отключения системы управления10 1.7. Автомат переключения режимов работы системы управления .................................... 12 1.8. Автомат предпусковых операций ................. 17 1.9. Автомат контроля проворота .................... 21 1.10. Автомат останова ............................. 23 1.11. Автомат ожидания разрешения выполнения предпусковых операций ......................... 26 1.12. Автомат аварийной и предупредительной сигнализации .................................. 28 1.13. Автомат контроля температуры масла ........... 31 1.14. Автомат контроля давления масла .............. 33 1.15. Обработчики событий .......................... 36 1.16. Входные переменные ........................... 36 1.17. Выходные воздействия ......................... 37 1.18. Вспомогательные модули ....................... 38 1.19. Протоколы функционирования системы управления 38 2. Программный имитатор дизель-генератора ............. 42 2.1. Перечень событий .............................. 42 2.2. Перечень входных переменных ................... 43 2.3. Перечень выходных воздействий ................. 43 2.4. Автомат имитации исполнительного устройства ... 43 2.5. Автомат имитации регулятора частоты вращения .. 45 2.6. Автомат имитации дизель-генератора ............ 46 2.7. Автомат имитации изменения частоты вращения ... 48 2.8. Обработчики событий ........................... 50 2.9. Входные переменные ............................ 50 2.10. Выходные воздействия ......................... 50 2.11. Вспомогательные модули ....................... 50 Заключение ............................................ 51


3ВведениеПрограммное обеспечение системы управления дизель-генератором создано...3 Введение Программное обеспечение системы управления дизель-генератором создано на основе подхода, изложенного в статье Шалыто А.А., Туккель Н.И. "SWITCH-технология — автоматный подход к созданию программного обеспечения событийных систем" (www.softcraft.ru). Разработанная система предназначена для управления двумя дизель-генераторами, функционирующими по одинаковым алгоритмам. Система управления содержит около 50 дискретных входов, 50 аналоговых входов, 50 дискретных выходов, до 20 одновременно активных выдержек времени и 5 видеокадров. Для отладки разработанной системы был создан простейший программный имитатор объекта управления, также спроектированный с использованием предлагаемой технологии. Система управления и имитатор являются отдельными программами и функционируют как параллельные процессы. В них могут быть использованы повторяющиеся обозначения, например при нумерации событий или автоматов. Программы предназначены для функционирования под управлением операционной системы QNX 4.25 и графической оболочки Photon 1.14. Программное обеспечение системы управления и имитатора построено в соответствии с предложенной авторами структурой событийных программ (рис. 1). Как следует из этой структуры, программы, разрабатываемые по предлагаемой технологии, состоят из системонезависимой и системозависимой частей. Системонезависимую часть образует система взаимосвязанных автоматов. Системозависимая часть состоит из модулей, реализующих обработчики событий, входные переменные, выходные воздействия и вспомогательные функции, в том числе функцию протоколирования. Приведем перечень сокращений, которые используются в дальнейшем: ГО - газоохладитель, газоотвод; ГПК - главный пусковой клапан; Д1СЧВ, Д2СЧВ, Д3СЧВ - датчики 1-ой, 2-ой и 3-ей ступеней частоты вращения; ДВПМ - датчик валопроворотного механизма; ДГ - дизель-генератор; ДПКВ - датчик проворота коленвала; ДППВ - датчик положения предельного выключателя; ДЧВ - датчик частоты вращения; МВП - механизм валопроворотный; МПН - маслопрокачивающий насос; ОКС - общекорабельная система; ПРЕД - предельная частота вращения; РЧВ - рабочая частота вращения, регулятор частоты вращения; СУ - система управления; ЧВГЗ - частота вращения открытия наружной захлопки газоотвода; ЧВНЗ - частота вращения начала заливания; ЧВО - частота вращения останова. В настоящей работе не приведены следующие документы, содержащиеся в полной версии программной документации: структурная схема системы управления, отражающая ее приборный состав, и видеокадры операторского интерфейса системы.


4События (например, от пользовательского интерфейса, операционной...4 События (например, от пользовательского интерфейса, операционной системы, аппаратуры и т.п.) Обработчики событий вызываются, например, средствами операционной системы Функции обработчиков событий (например, обработчик события «срабатывание таймера») Обработчики событий вызывают автоматы, передавая им номера произошедших событий Система взаимосвязанных автоматов - системонезависимая часть программы (взаимодействие автоматов по вложенности и обмену номерами состояний (y)) Вызов функций входных переменных Функции входных переменных (x), осуществляющие опрос источников информации Вызов вспомогательных функций Вызов функций, реализующих выходные воздействия Взаимодействие по вызываемости с передачей внутренних событий Функции протоколи- рования Функции выходных воздействий (z) Вызов вспомогательных функций Порождение некоторых событий, например, запуск таймеров Вспомогательные модули и библиотеки (например, модуль управления таймерами) Рис. 1. Предлагаемая структура событийных программ 1. Система управления дизель-генератором 1.1. Структурная схема программного обеспечения Разработанное программное обеспечение состоит из двух частей: системы управления и имитатора объекта управления (рис. 2).


5СУ ДГОбработчики событийОбработчики событий от кнопок на...5 СУ ДГ Обработчики событий Обработчики событий от кнопок на мнемосхеме Обработчики событий нажатия основных управляющих кнопок Обработчики событий нажатия кнопок управления частотой вращения Обработчики события нажатия кнопок включения/отключения защиты Обработчики событий нажатия кнопок переключения видеокадров Обработчики событий срабатывания таймеров Обработчики событий, связанных с индикацией параметров ДГ Обработчики событий, связанных с регистрацией параметров ДГ Автоматы А0 ... А80 Ведение протокола работы Индикация состояний автоматов на отладочном видеокадре Функции, реализующие выходные воздействия Функции, реализующие входные переменные Расшифровка аварий и выдача рекомендаций оператору Видеокадры и мигающие табло Работа с таймерами Взаимодействие с датчиками и исполнительными механизмами Работа с файлами Работа с виджетами Базовая часть интерфейса с графической оболочкой Photon (генерируется автоматически) Инициализация программы и обработчик сообщений "Reply": Информация от датчиков "Reply": События "Send": Опрос очереди "Send": Опрос датчиков и выдача управляющих воздействий Работа с виджетами Имитатор ДГ Базовая часть интерфейса с графической оболочкой Photon (генерируется автоматически) Инициализация программы и обработчик сообщений Функции, реализующие очередь событий для СУ ДГ Видеокадры модели Видеокадр задания аналоговых сигналов ДГ Видеокадр задания задержек исполнения управляющих воздействий Видеокадр задания дискретных параметров ДГ Видеокадр задания сигналов от ОКС Обработчики событий Обработчики событий срабатывания таймеров Обработчики событий нажатия кнопок выбора ДГ Обработчики событий нажатия кнопок переключения видеокадров Функции, реализующие выходные воздействия Работа с таймерами Автоматы Функции, реализующие входные переменные А10 ... А31 Рис. 2. Структурная схема программного обеспечения 1.2. Перечень событий Перечислим названия событий (е), на которые реагирует система управления, и их номера.


6Внешние от объекта управления1Включение СУ (отключение ручного...6 Внешние от объекта управления 1 Включение СУ (отключение ручного управление) 2 Отключение СУ (включение ручного управления) 10 Нажатие кнопки ПОДГОТОВКА К ПУСКУ 20 Нажатие кнопки ПУСК 30 Нажатие кнопки ОСТАНОВ 40 Нажатие кнопки ЭКСТРЕННЫЙ СТОП 50 Нажатие кнопки КВИТИРОВАНИЕ 60 Нажатие кнопки РАЗБЛОКИРОВКА 110 Появление сигнала МВП НЕ ОТКЛЮЧЕН 120 Появление сигнала ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ 121 Исчезновение сигнала ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ 130 Появление сигнала ВОДА В ОХЛАДИТЕЛЕ 140 Срабатывание уставки ЧВО (ЧВ < ЧВО) 150 Срабатывание уставки РЧВ (ЧВ > РЧВ) 151 Срабатывание уставки РЧВ (ЧВ < РЧВ) 160 Срабатывание уставки ЧВНЗ (ЧВ < ЧВHЗ) 170 Срабатывание уставки ЧВГЗ 171 Срабатывание уставки ПРЕД 180 Импульс от датчика проворота ДПКВ 190 Срабатывание датчика первой ступени частоты вращения Д1СЧВ 200 Срабатывание датчика второй ступени частоты вращения Д2СЧВ 210 Срабатывание датчика третьей ступени частоты вращения Д3СЧВ 270 Срабатывание уставки Рго 280 Срабатывание уставки Рмп (Рм > Рмп) 290 Снижение давления масла ниже уставки Рмп 600 Нажатие кнопки РАСШИФРОВКА 610 Нажатие кнопки выбора ДГ 620 Нажатие кнопки ПРЕДЫДУЩАЯ АВАРИЯ 630 Нажатие кнопки СЛЕДУЮЩАЯ АВАРИЯ 640 Нажатие кнопки ПОСЛЕДНЯЯ АВАРИЯ 700 Закрытие диалога расшифровки аварий Внешние от смежных систем 70 Появление сигнала БЛОКИРОВКА ПУСКА из СУ ОКС 80 Снятие сигнала БЛОКИРОВКА ПУСКА из СУ ОКС 90 Появление сигнала ВНЕШНИЙ СТОП из СУ ОКС 100 Появление сигнала НАРУЖНАЯ ЗАХЛОПКА ГО ОТКРЫТА из СУ ОКС Таймеры 220 Истечение времени проворота 230 Истечение времени пуска 240 Истечение времени на открытие наружной захлопки 250 Истечение времени подачи воды в сепаратор газоотвода 260 Истечение времени прокачки маслом 261 Истечение времени задержки контроля параметров 262 Истечение времени работы насоса охлаждения 263 Истечение времени остановки МПН 264 Истечение времени выдачи сигнала ПОЛНАЯ ОСТАНОВКА ДГ в генераторный щит 265 Истечение времени открытия/закрытия клапана 266 Истечение времени выдачи команды на запуск насоса охлаждения 360 Синхроимпульс для проверки условий переходов 520 Срабатывание таймера регистрации параметров ДГ 530 Срабатывание таймера индикации параметров ДГ Внутренние 0 Инициализация вложенных автоматов 380 Команда на изменение частоты вращения 390 Команда на останов МПН 400 Команда на выдачу сигнала ПОЛНАЯ ОСТАНОВКА ДГ в генераторный щит 410 Открыть клапан (внутреннее для алгоритма управления клапанами) 420 Закрыть клапан (внутреннее для алгоритма управления клапанами) 500 Изменение периода регистрации параметров ДГ 510 Изменение периода индикации параметров ДГ


1.3. Перечень входных переменныхПеречислим названия входных переменных...1.3. Перечень входных переменных Перечислим названия входных переменных опрашиваются системой управления, и их номера. (x), 7 которые Внешние от органов управления 10 Переключатель ДИСТАНЦИОННОЕ-МЕСТНОЕ в положении «Дистанционное» 20 Переключатель ЗАЩИТА ОТКЛЮЧЕНА выключен (защита включена) Внешние от объекта управления 210 Частота вращения больше уставки ЧВО 220 Частота вращения больше уставки РЧВ 240 Частота вращения меньше уставки ЧВНЗ 250 Частота вращения больше уставки ЧВГЗ 260 Частота вращения больше уставки ПРЕД 280 Первая ступень частоты вращения 290 Вторая ступень частоты вращения 300 Третья ступень частоты вращения 310 Давление газов в газоотводе больше уставки Рго 320 Температура масла меньше Тмм 330 Температура масла больше Тмпр 340 Температура масла больше Тма 350 Давление масла больше уставки Рмп 360 Давление масла меньше уставки Рмпр1 370 Давление масла меньше уставки Рмпр2 380 Давление масла меньше уставки Рмпр3 390 Давление масла меньше уставки Рма1 400 Давление масла меньше уставки Рма2 410 Давление масла меньше уставки Рма3 420 Давление воды меньше уставки Рвпр 430 Температура воды меньше уставки Твм 440 Температура воды больше уставки Твпр 450 Температура воды больше уставки Тва 460 Давление наддува больше уставки Рнпр 470 Температура выхлопных газов выше уставки Твг 480 Давление в отсеке ниже уставки Ротс 490 Давление в отсеке ниже уставки Ротс.а 500 Наличие сигнала ВОДА В ОХЛАДИТЕЛЕ 510 Наличие сигнала МВП НЕ ОТКЛЮЧЕН 520 Наличие сигнала ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ 900 Клапан открыт 910 Клапан закрыт Внешние от смежных систем 700 Наличие сигнала БЛОКИРОВКА ПУСКА из СУ ОКС Внутренние 800 Два проворота вала 810 Заданная частота вращения выше текущей 820 Заданная частота вращения ниже текущей 901 Открыт клапан подачи воды в газоохладитель 1.4. Перечень выходных воздействий Перечислим названия выходных воздействий (z), формируемых системой управления, и их номера. Внешние — индикация 10 Табло ПОДГОТОВКА К ПУСКУ (0 - отключить, 1 - включить). Си-функции, реализующие это выходное воздействие называются z10_0() и z10_1() соответственно. 20 Табло ПРОКАЧКА МАСЛОМ (0 - отключить, 1 - включить) 30 Табло ПРОВОРОТ (0 - отключить, 1 - включить) 40 Табло НЕТ ПРОВОРОТА (0 - отключить, 1 - постоянное, 2 - мигающее) 50 Табло ВНЕШНИЙ СТОП (0 - отключить, 1 - постоянное, 2 - мигающее) 60 Табло ЭКСТРЕННЫЙ СТОП (0 - отключить, 1 - постоянное, 2 - мигающее) 70 Табло АВАРИЯ (0 - отключить, 1 - постоянное, 2 - мигающее) 80 Табло ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ (0 - отключить, 1 - включить) 90 Табло НАСОС ОХЛАЖДЕНИЯ (0 - отключить, 1 - включить)


100 110 120 130 140 150 160 170 180 190 200 210 220 230280 240 250 260 270 271 290 700 1140 1141 1200 1210 1220 1230 1240 13008Табло ПУСК (0...100 110 120 130 140 150 160 170 180 190 200 210 220 230 280 240 250 260 270 271 290 700 1140 1141 1200 1210 1220 1230 1240 1300 8 Табло ПУСК (0 - отключить, 1 - включить) Табло ОСТАНОВКА (0 - отключить, 1 - включить) Табло ПУСК РАЗРЕШЕН (0 - отключить, 1 - включить) Табло НЕТ ПУСКА (0 - отключить, 1 - постоянное, 2 - мигающее) Табло ХОЛОДНОЕ МАСЛО (0 - отключить, 1 - включить) Табло ПЕРЕГРЕВ МАСЛА (0 - отключить, 1 - желтое постоянное, 2 - желтое мигающее, 3 - красное постоянное, 4 - красное мигающее) Табло ДАВЛЕНИЕ МАСЛА (0 - отключить, 1 - желтое постоянное, 2 - желтое мигающее, 3 - красное постоянное, 4 - красное мигающее) Табло ДАВЛЕНИЕ ВОДЫ (0 - отключить, 1 - желтое постоянное, 2 - желтое мигающее) Табло ХОЛОДНАЯ ВОДА (0 - отключить, 1 - включить) Табло ПЕРЕГРЕВ ВОДЫ (0 - отключить, 1 - желтое постоянное, 2 - желтое мигающее, 3 - красное постоянное, 4 - красное мигающее) Табло НАДДУВ ВЫШЕ НОРМЫ (0 - отключить, 1 - желтое постоянное, 2 - желтое мигающее) Табло ТЕМПЕРАТУРА ГАЗОВ ВЫШЕ НОРМЫ (0 - отключить, 1 - желтое постоянное, 2 - желтое мигающее) Табло ДАВЛЕНИЕ В ОТСЕКЕ НИЖЕ НОРМЫ (0 - отключить, 1 - желтое постоянное, 2 - желтое мигающее, 3 - красное постоянное, 4 - красное мигающее) Табло ВОДА В ОХЛАДИТЕЛЕ (0 - отключить, 1 - красное постоянное, 2 красное мигающее) Табло РАЗНОС (0 - отключить, 1 - красное постоянное, 2 - красное мигающее) Перевести все аварийные табло в постоянное свечение Погасить все аварийные табло Обновить индикацию частоты вращения Индикатор состояния клапана (0 - закрыт, 1 - открыт, 2 закрывается/открывается, 3 - неисправен) Индикатор состояния наружной захлопки (0 - закрыт, 1 - открыт, 2 закрывается/открывается, 3 - неисправен) Индикатор состояния ДГ (0 - остановлен, 1 - запущен, 2 - запускается, 3 останавливается) Обобщенная звуковая сигнализация (0 - отключить, 1 - включить) Индикация параметров ДГ Регистрация параметров ДГ Показать окно расшифровки аварий, установив выбранный ДГ и очистив информационные поля Показать информацию о последней аварии Показать информацию о предыдущей аварии Показать информацию о следующей аварии Изменить состояние кнопки РАСШИФРОВКА (0 - отключить, 1 - включить) Добавить сообщение в очередь сообщений об авариях Внешние — объект управления 400 Магнитный пускатель МПН (0 - отключить, 1 - включить) 411 Команда остановки МПН (0 - снять, 1 - выдать) 420 Электромагнит стопа РЧВ (0 - снять питание, 1 - подать питание) 430 Клапан подачи воздуха к ДГ (0 - закрыть, 1 - открыть) 440 Клапан подачи воздуха низкого давления (0 - закрыть, 1 - открыть) 450 Главный пусковой клапан (0 - закрыть, 1 - открыть) 480 Клапан подачи воды в газоохладитель (0 - закрыть, 1 - открыть) 490 Клапан слива воды из сепаратора газоотвода (0 - закрыть, 1 - открыть) 500 Клапан вентиляции сепаратора топлива (0 - закрыть, 1 - открыть) 510 Клапан подачи топлива от сепаратора топлива (0 - закрыть, 1 - открыть) 570 Электромагнит предельного выключателя (0 - снять питание, 1 - подать питание) 590 Насос охлаждения (0 - остановить, 1 - выдать команду запуск, 2 - снять команду запуска) 610 Двигатель регулятора частоты вращения (0 - остановить, 1 - увеличивать частоту, 2 - уменьшать частоту) Внешние — смежные системы 710 Выдать сигнал ПОДГОТОВКА К ПУСКУ в СУ ОКС 720 Выдать сигнал ОТКРЫТЬ НАРУЖНУЮ ЗАХЛОПКУ в СУ ОКС 730 Выдать сигнал ЗАКРЫТЬ НАРУЖНУЮ ЗАХЛОПКУ в СУ ОКС 740 Выдать сигнал ПОЛНАЯ ОСТАНОВКА ДГ в СУ ОКС 751 Сигнал ПОЛНАЯ ОСТАНОВКА ДГ в генераторный щит (0 - снять, 1 - выдать) Таймеры 810 Таймер контроля времени проворота 60 с (0 - сбросить, 1 - запустить)


820 830 840 850 860 880 890 900 950 1100 1110 1120 1130 9 Таймер контроля времени открытия наружной захлопки 5 с (0 - сбросить, 1 запустить) Таймер контроля времени подачи воды 5 с (0 - сбросить, 1 - запустить) Таймер контроля времени прокачки маслом 60 с (0 - сбросить, 1 - запустить) Таймер контроля времени охлаждения 180 с (0 - сбросить, 1 - запустить) Таймер контроля времени пуска 15 с (0 - сбросить, 1 - запустить) Таймер задержки контроля параметров 10 с (0 - сбросить, 1 - запустить) Таймер контроля времени остановки МПН 4 с (0 - сбросить, 1 - запустить) Таймер контроля времени выдачи сигнала ПОЛНАЯ ОСТАНОВКА ДГ 3 с (0 сбросить, 1 - запустить) Таймер контроля времени открытия/закрытия клапана (0 - сбросить, 1 запустить) Таймер опроса датчика давления в отсеке 0.5 с (0 - сбросить, 1 запустить) Таймер периода регистрации параметров ДГ (0 - сбросить, 1 - запустить) Таймер периода индикации параметров ДГ (0 - сбросить, 1 - запустить) Таймер контроля времени выдачи команды запуска насоса охлаждения (0 сбросить, 1 - запустить) 750 410 460 800 1000 Внутренние Выдача сигнала ПОЛНАЯ ОСТАНОВКА ДГ в генераторный щит Остановка МПН на 4 с Выдать команду на установку частоты вращения 1-ой ступени Счетчик проворотов (0 - сбросить, 1 - увеличить) Команда на клапан (0 - закрыть, 1 - открыть) Инициализация 600 Инициализация всех исполнительных механизмов 870 Инициализация всех управляющих автоматов 1.5. Схема взаимодействия автоматов Как отмечалось выше, системонезависимая часть состоит из системы взаимосвязанных автоматов, взаимодействие которых отражено на схеме (рис. 3), которая напоминает диаграмму классов, создаваемую при объектно-ориентированном проектировании. Отметим, что число автоматов в этой схеме — 31. Обработчики событий Автомат разбоAра01 файла рекомендаций Вызывает в цикле Автомат A63 расшифровки аварийных ситуаций A20 Автомат включенияотключения СУ A60 Автомат остановки маслопрокачивающего насоса A61 Автомат выдачи сигнала ПОЛНАЯ ОСТАНОВКА ДГ в генераторный щит Автомат A5 управления частотой вращения Автомат A13 управления насосом охлаждения A7, A12 A80 A7 Автомат аварийной и предупредительной сигнализации A71, A72, A74, A77, A78 A0, A1, A2, A9, A11, A12, A12_0, A13 Автомат получает значения переменных, кодирующих состояния этих автоматов Автомат передает значения переменной, кодирующей его состояние, в эти автоматы Автомат A0 переключения режимов работы СУ A1, A2, A3, A4, A7, A8, A9, A10, A11, A12 A62 Автомат A80 управления клапаном с обратной связью A10 Автомат A62 индикации и регистрации параметров ДГ A0 A71 Автомат контроля температуры масла A72 Автомат контроля давления масла A73 Автомат контроля давления воды A74 Автомат контроля температуры воды A75 Автомат контроля давления наддува АвтомаAт 76 контроля температуры выхлопных газов A77 Автомат контроля давления в отсеке A78 Автомат контроля уровня воды в охладителе A7 A7 A7 A7 A7 Автомат запускает эти автоматы их своих выходных воздействий A1 Автомат предпусковых операций A2 Автомат пуска A3 Автомат останова A4 Автомат экстренного останова A1_0, A3, A4, A7 A0 A5, A60, A80 A3, A4, A7 A0 A60, A80 A4 A0, A1, A2, A9 A5, A60, A61, A80 A0, A1, A2, A3, A4_0, A9 A5, A60, A61, A80 Автомат A8 ожидания разрешения выполнения предпусковых операций A9 Автомат контроля готовности к пуску A3, A4, A7 A0 A0 A60, A80 A10 Автомат открытия наружной захлопки A11 Автомат аварийной блокировки A80 A7 A0 A0 A80 A12 Автомат аварийной защиты A7 A0, A12_0, A13 A5, A60, A61, A80 A15 Автомат контроля проворота A1 A4_0 Автомат контроля предельного выключателя A4 A12_0 Автомат контроля предельного выключателя A7, A12 Рис. 3. Схема взаимодействия автоматов


10 В силу большого количества автоматов в этой схеме, дальнейшее изложение проведем на ее фрагменте, показанном на рис. 4. В этой схеме, также, как и в предыдущей, автоматы взаимодействуют по вложенности, вызываемости и обмену номерами состояний. Обработчики событий A20 Автомат включенияотключения СУ A7 Автомат аварийной и предупредительной сигнализации A71, A72, A74, A77, A78 A0, A1, A2, A9, A11, A12, A12_0, A13 A0 Автомат переключения режимов работы СУ A1, A2, A3, A4, A7, A8, A9, A10, A11, A12 A62 Автомат A71 контроля температуры масла A7 Автомат A72 контроля давления масла A7 Автомат A1 предпусковых операций A15, A3, A4, A7 A0 A5, A60, A80 A3 Автомат останова A4 A0, A1, A2, A9 A5, A60, A61, A80 Автомат ожиданияA8 разрешения выполнения предпусковых операций A0 Автомат A15 контроля проворота A1 Рис. 4. Фрагмент схемы взаимодействия автоматов Для каждого из автоматов, приведенных на этой схеме, разработаны четыре документа: словесное описание; схема связей; граф переходов; текст функции, реализующей автомат. При этом для автоматов, реализующих режимы работы, явно описанные в техническом задании, в качестве словесного описания приводятся его соответствующие фрагменты. Выполнение указанными автоматами, построенными "по мотивам" этих описаний, требований технического задания подтверждается протоколами работы системы. Пример одного из таких протоколов приведен в конце раздела 1. 1.6. Автомат включения-отключения системы управления 1.6.1. Словесное описание Автомат, реализующий данный алгоритм является головным в схеме взаимодействия автоматов. Этот автомат обеспечивает выполнение перечисленных ниже действий и вызов вложенных автоматов. 1. При запуске программы выполняется инициализация всех органов управления. 2. При переводе переключателя "дистанционное/местное" в положении "местное" автомат выполняет инициализацию исполнительных механизмов и переходит в отключенное состояние. 3. При переводе переключателя "дистанционное/местное" в положении "дистанционное" автомат запускает генератор синхроимпульсов (период 0.5 с) и начинает выполнение алгоритма управления.


11 При этом: − при нажатии кнопки "Квитирование" все мигающие табло переводятся в постоянное свечение и отключается обобщенная звуковая сигнализация; − при появлении сигнала "Предельный выключатель" включается соответствующее табло; − при исчезновении сигнала "Предельный выключается соответствующее табло. Схема связей автомата и граф переходов рис. 5, 6. выключатель" приведены на 1.6.2. Схема связей Вложенные автоматы: A0, A5, A7, A13, A62 Переключатель "Дистанционное/ Положение "ДИСТАНЦИОННОЕ" местное" Обработчики событий Инициализация при первом запуске программы Включение СУ (отключение местного управления) Отключение СУ (включение местного управления) Нажатие кнопки КВИТИРОВАНИЕ Появление сигнала ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ Исчезновение сигнала ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ А20 x10 z80_0 Отключить табло ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ z80_1 Включить табло ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ z240 z600 e0 e1 e2 e50 e120 e121 z700_0 z870 z1100_0 Остановить таймер z1100_1 Запустить таймер Мнемосхема Перевести все аварийные табло в постоянное свечение Инициализация исполнительных механизмов Отключить обобщенную звуковую сигнализацию Инициализация всех автоматов Таймер опроса датчика давления в отсеке 0.5 с Рис. 5. Схема связей автомата включения-отключения системы управления 1.6.3. Граф переходов e0 ⋅ x10 0. Начальное e0⋅x10 z: 600;870 1. СУ отключена e1 z: 600; 870; 1100_0 2. СУ включена A7; A0; A5; A13; A62 e2 z1100_1 e50 z: 240; 700_0 e120 z80_1 e121 z80_0 Рис. 6. Граф переходов автомата включения-отключения системы управления 1.6.4. Текст функции, реализующей автомат #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 ;


12 #ifdef HEAD_EVENTS_LOGGING log_exec( dg, "A20", y_old, e ) ; #endif switch( dg->y20 ) { case 0: if( e == 0 && !x10(dg) ) else if( e == 0 && x10(dg) ) { z600(dg) ; z870(dg) ; break ; dg->y20 = 1 ; dg->y20 = 2 ; } ; case 1: if( e == 1 ) break ; dg->y20 = 2 ; case 2: A7( e, dg ) ; A0( e, dg ) ; A5( e, dg ) ; A13( e, dg ) ; A62( e, dg ) ; if( e == 2 ) dg->y20 = 1 ; else if( e == 50 ) { z240(dg) ; z700_0(dg) ; } else if( e == 121 ) { z80_0(dg) ; } else if( e == 120 ) { z80_1(dg) ; } ; break ; default: #ifdef GRAPH_ERRORS_LOGGING log_write( LOG_GRAPH_ERROR, dg->number, "ERROR IN A20: unknown state number!", 0 ) ; #endif break ; }; if( y_old == dg->y20 ) goto A20_end ; { #ifdef GRAPH_TRANS_LOGGING log_trans( dg, "A20", y_old, dg->y20 ) ; #endif #ifdef DEBUG_FRAME update_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_LOGGING log_end( dg, "A20", dg->y20, e ) ; #endif ; }; 1.7. Автомат переключения режимов работы системы управления 1.7.1. Словесное описание Автомат переключения режимов работы алгоритм управления. Автоматы, вложенные реализует основной в его состояния,


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


1.7.2. Схема связей 14 Вложен в автомат A20. Вложенные автоматы: A1, A2, A3, A4, A8, A9, A10, A11, A12 Р ДЧВ Ч В Автомат предпусковых операций A1 Автомат пуска A2 Автомат останова A3 Автомат экстренного останова A4 Автомат аварийной и предупредительной сигнализации A7 Автомат определения сигнала начала выполнения предпусковых операций A8 Автомат контроля готовности к пуску A9 Автомат открытия наружной захлопки A10 Автомат аварийной блокировки A11 Автомат аварийной защиты A12 Частота вращения больше РЧВ Готовность к пуску Нет проворота Выполнение предпусковых операций прекращено x220 y1 = 2 y1 = 3 y1 = 0 А0 z290_0 z290_1 z290_2 z290_3 Индикация состояния "ДГ остановлен" Индикация состояния "ДГ запущен" Индикация состояния "ДГ запускается" Индикация состояния "ДГ останавливается" Успешный пуск Нет пуска y2 = 3 y2 = 4 Начато выполнение останова Завершено выполнение останова y3 ≠ 0 y3 = 0 Начато выполнение экстренного останова Завершено выполнение экстренного останова y4 ≠ 0 y4 = 0 Аварийный останов Разнос Запрошено и разрешено выполнение предпусковых операций y7 = 2 y7 = 4 y8 = 2 Отмена готовности к пуску y9 = 0 Захлопка не открылась y10 = 5 Разблокировка y11 = 2 Выполнение алгоритма завершено y12 = 0 Мнемосхема Обработчики событий Нажатие кнопки ПУСК e20 Рис. 7. Схема связей автомата переключения режимов работы системы управления


15 1.7.3. Граф переходов 1 : x220 0. Дизель остановлен A8 z290_0 y8 = 2 y1 = 0 2 : y7 = 2 1. Предпусковые операции A4, A3, A1 y1 = 2 z290_0 y1 = 3 1 : y9 = 0 2. К пуску готов e20 A4, A3, A9 z290_0 x220 3. Выполняется пуск 4. Установившийся режим y2 = 3 A4, A3, A2 A4, A3, A10 z290_2 z290_1 y2 = 4 y10 = 5 2 : (y7 = 2) ∨ (y7 = 4) 7. Аварийная блокировка A11 y11 = 2 z290_0 8. Аварийная защита y12 = 0 A12 z290_3 y4 = 0 6. Экстренный стоп A4 z290_3 1 : y4 ≠ 0 5. Останов y3 = 0 A4, A3 z290_3 1 : y4 ≠ 0 y3 ≠ 0 Рис. 8. Граф переходов автомата переключения режимов работы системы управления 1.7.4. Текст функции, реализующей автомат #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_LOGGING log_begin( dg, "A0", y_old, e ) ; #endif switch( dg->y0 ) { case 0: A8( e, dg ) ; if( x220(dg) ) else if( dg->y7 == 2 ) else if( dg->y8 == 2 ) break ; dg->y0 = 4 ; dg->y0 = 7 ; dg->y0 = 1 ; case 1: A4( e, dg ) ; A3( e, dg ) ; A1( e, dg ) ; if( dg->y4 != 0 ) dg->y0 = 6 ; else if( dg->y7 == 2 || dg->y7 == 4 ) dg->y0 = 8 ; else if( dg->y3 != 0 ) dg->y0 = 5 ; else if( dg->y1 == 0 ) dg->y0 = 0 ;


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


17 if( y_old == dg->y0 ) goto A0_end ; { #ifdef A0_TRANS_LOGGING log_trans( "A0", y_old, dg->y0 ) ; #endif #ifdef DEBUG_FRAME update_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_LOGGING log_end( dg, "A0", dg->y0, e ) ; #endif }; 1.8. Автомат предпусковых операций 1.8.1. Словесное описание 1. Перечислим сигналы, блокирующие проведение предпусковых операций. 1.1. Обобщенный сигнал "Блокировка пуска" из СУ ОКС. При наличии этого сигнала выдается сигнал "Подготовка пуска" в указанную систему.


18 1.2. Сигнал "Механизм валопроворотный не отключен". 1.3. Сигнал "Предельный выключатель". 1.4. Дизель не остановлен — частота вращения превышает рабочую частоту. 1.5. Команда на выполнение любого вида останова. 1.6. Наличие сигнала "Вода в охладителе" (аварийный уровень). 2. При наличии хотя бы одного из сигналов, указанных в п.п.1.2...1.6, система управления не должна принимать управляющую команду подготовки к пуску. 3. При нажатии оператором кнопки "Подготовка к пуску" выдается сигнал в СУ ОКС. После снятия сигнала "Блокировка пуска" из СУ ОКС и при отсутствии блокирующих сигналов по п.п. 1.2...1.6, система должна выполнить перечисленные ниже действия. 3.1. Запомнить команду на подготовку к пуску. 3.2. Включить табло "Подготовка к пуску". 3.3. Выдать команду на включение маслопрокачивающего насоса, замкнув контакт в цепи его магнитного пускателя. 3.4. Включить табло "Прокачка маслом" при замыкании контакта пускателя маслопрокачивающего насоса. 3.5. Подать питание на электромагнит стопа регулятора частоты вращения. 3.6. Подать команду на открытие клапана подачи воздуха к дизель-генератору. 3.7. Подать команду на открытие клапана воздуха низкого давления. 3.8. Включить табло "Проворот". 3.9. Включить контроль времени проворота (60 с). 3.10. Выдать команду в регулятор частоты вращения на установку первой ступени частоты, и через 4 с снять эту команду. 4. После получения 3-х импульсов от датчика проворота коленчатого вала, до истечения времени по п. 3.9, система управления должна выполнить перечисленные ниже действия. 4.1. Снять питание с электромагнита клапана воздуха низкого давления. 4.2. Отключить табло "Проворот". 4.3. Отключить контроль времени проворота (60 с). 5. При превышении давлением масла предпускового давления и отработки команды на уменьшение заданной частоты вращения до первой ступени, система управления должна выполнить перечисленные ниже действия. 5.1. Снять команду на включение маслопрокачивающего насоса. 5.2. Снять команды на подготовку к пуску, перечисленные в п.3. 5.3. Отключить табло "Подготовка к пуску". 5.4. Включить табло "Пуск разрешен". 5.5. Включить память завершения предпусковых операций и дать разрешение на выполнение пуска. 6. В случае снижения давления масла ниже предпускового давления или увеличения затяжки пружины регулятора частоты вращения до третьей позиции или появления блокирующих сигналов по п. 1.1—1.3, 1.5, 1.6 система управления должна выполнить перечисленные ниже действия. 6.1. Отключить память завершения предпусковых операций. 6.2. Отключить табло "Пуск разрешен". 6.3. Разомкнуть контакт остановки маслопрокачивающего насоса и через 4 с вновь замкнуть его. 6.4. Снять питание с электромагнита остановки регулятора частоты вращения.


19 6.5. Отключить табло "Прокачка маслом" при размыкании контакта пускателя маслопрокачивающего насоса. 6.6. Снять команду на открытие клапана подачи воздуха к дизель-генератору. 7. Если по истечении времени (п. 3.9) от датчика проворота коленвала не поступило 3-х импульсов, то система управления должна выполнить перечисленные ниже действия. 7.1. Включить аварийное табло "Нет проворота". 7.2. Включить обобщенный сигнал звуковой сигнализации. 7.3. Отключить табло "Подготовка к пуску". 7.4. Снять питание с электромагнита клапана пускового воздуха низкого давления. 7.5. Отключить контроль времени проворота (60 c). 7.6. Снять команду на включение маслопрокачивающего насоса. 7.7. Разомкнуть контакт остановки маслопрокачивающего насоса и через 4 с вновь замкнуть этот контакт. 7.8. Отключить табло "Прокачка маслом" при размыкании контакта пускателя маслопрокачивающего насоса. 7.9. Отключить память команды на подготовку к пуску. 7.10. Снять команду на открытие клапана подачи воздуха к дизель-генератору. 8. Отключение обобщенной звуковой сигнализации и перевод аварийного табло "Нет проворота" в постоянное свечение производится нажатием кнопки "Квитирование". 9. Разблокировка системы управления и отключение табло "Нет проворота" производится нажатием кнопки "Разблокировка". Схема связей автомата и граф переходов приведены на рис. 9, 10. 1.8.2. Схема связей Вложен в автомат A0. Вложенные автоматы: A15 Д1СЧВ Первая ступень частоты вращения Д2СЧВ Вторая ступень частоты вращения Д3СЧВ Датчик давления масла Сигнализатор уровня воды в ГО ДВПМ ДППВ Третья ступень частоты вращения Давление масла больше предпускового Наличие сигнала ВОДА В ОХЛАДИТЕЛЕ (аварийный уровень) Наличие сигнала МВП НЕ ОТКЛЮЧЕН Наличие сигнала ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ Автомат контроля проворота A15 Автомат останова A3 Автомат экстренного останова A4 Автомат аварийной и предупредительной сигнализации A7 Вал ДГ произвел три оборота Нет проворота Выполняется автоматизированный останов Выполняется экстренный останов Аварийный останов Разнос x280 x290 x300 x350 А1 z10_0 Отключить табло ПОДГОТОВКА К ПУСКУ z10_1 Включить табло ПОДГОТОВКА К ПУСКУ z20_0 Отключить табло ПРОКАЧКА МАСЛОМ z20_1 Включить табло ПРОКАЧКА МАСЛОМ z30_0 Отключить табло ПРОВОРОТ z30_1 Включить табло ПРОВОРОТ z40_2 Включить мигающее табло НЕТ ПРОВОРОТА x500 x510 z400_0 Выдать команду на отключение МПН (e420) z400_1 Выдать команду на включение МПН (e410) z410 Остановить МПН на 4-е секунды (e390) x520 у15 = 2 у15 = 3 у3 ≠ 0 у4 ≠ 0 z420_0 Снять питание с электромагнита стопа РЧВ z420_1 Подать питание на электромагнит стопа РЧВ z430_0 Выдать команду на закрытие клапана подачи воздуха к ДГ (e420) z430_1 Выдать команду на открытие клапана подачи воздуха к ДГ (e410) z440_0 Выдать команду на закрытие клапана подачи воздуха низкого давления (e420) z440_1 Выдать команду на открытие клапана подачи воздуха низкого давления (e410) z460 Установить частоту вращения 1-й ступени (e380) Мнемосхема Автомат управления клапаном с обратной связью A80 Автомат остановки МПН A60 Электромагнит стопа РЧВ Автомат управления клапаном с обратной связью A80 Автомат управления клапаном с обратной связью A80 Автомат управления частотой вращения A5 Магнитный пускатель МПН Контакт остановки МПН Клапан подачи воздуха к ДГ Клапан подачи воздуха низкого давления y7 = 2 y7 = 4 z700_1 z1300 Включить обобщенную звуковую сигнализацию Добавить сообщение в очередь сообщений об авариях Обработчики событий Активация вложенных автоматов Появление сигнала БЛОКИРОВКА ПУСКА из СУ ОКС e0 z810_0 Остановить таймер e70 z810_1 Запустить таймер Таймер контроля времени проворота 60 с Рис. 9. Схема связей автомата предпусковых операций


20 1.8.3. Граф переходов 0. Начальное y15 = 3 e0 1 : e70 ∨ x300 ∨ x350 ∨ x500 ∨ x510 ∨ x520 ∨ (y3 ≠ 0) ∨ (y4 ≠ 0) ∨ (y7 = 2) ∨ (y7 = 4) z:10_0; 30_0; 420_0; 430_0; 440_0; 810_0 1. Проворот A15 z: 10_1;20_1;30_1;400_1; 420_1;430_1;440_1;460;810_1 e0 3. Нет проворота ( ) y15 = 2 ⋅ x280 ⋅ x290 ⋅ x300 ⋅ x350 e0 2. Пуск разрешен z: 10_0; 30_0; 40_2; 400_0; 410; 430_0; 440_0;700_1; 1300 z: 10_0; 30_0; 400_0; 440_0; 810_0 Рис. 10. Граф переходов автомата предпусковых операций 1.8.4. Текст функции, реализующей автомат #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_LOGGING log_exec( dg, "A1", y_old, e ) ; #endif switch( 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 ; } else if( dg->y1_0 == 3 ) dg->y1 = 3 ; else if( dg->y1_0 == 2 && x350(dg) && x280(dg) && !x290(dg) && !x300(dg) ) dg->y1 = 2 ; break ; case 2: if( e == 0 ) break ; dg->y1 = 1 ; case 3: if( e == 0 ) break ; dg->y1 = 1 ;


21 default: #ifdef GRAPH_ERRORS_LOGGING log_write( LOG_GRAPH_ERROR, dg->number, "ERROR IN A1: unknown state number!", 0 ) ; #endif break ; }; if( y_old == dg->y1 ) goto A1_end ; { #ifdef GRAPH_TRANS_LOGGING log_trans( dg, "A1", y_old, dg->y1 ) ; #endif #ifdef DEBUG_FRAME update_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 ; case 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_LOGGING log_end( dg, "A1", dg->y1, e ) ; #endif ; }; 1.9. Автомат контроля проворота 1.9.1. Словесное описание Автомат контроля проворота реализует часть алгоритма предпусковых операций, который описан в предыдущем подразделе (например, в п.п. 4, 7). Обратим внимание, что в качестве объекта управления этого автомата выступает не "физический" объект, а вычислительное устройство, реализуемое программно. Схема связей автомата и граф переходов приведены на рис. 11, 12.


1.9.2. Схема связей 22 Вложен в автомат A1 ДПКВ Счетчик Два проворота вала Обработчики событий Инициализация вложенных автоматов Импульс от датчика проворота ДПКВ Истечение времени проворота А15 x800 z800_0 z800_1 e0 e180 e220 Сбросить счетчик проворотов Увеличить счетчик проворотов Рис. 11. Схема связей автомата контроля проворота 1.9.3. Граф переходов e180 z800_1 e0 z800_0 0. Подсчет проворотов z800_0 e220 1 : e180 ⋅ x800 e0 3. Нет проворота 2. Есть проворот e0 Рис. 12. Граф переходов автомата контроля проворота 1.9.4. Текст функции, реализующей автомат #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_LOGGING log_exec( dg, "A15", y_old, e ) ; #endif switch( dg->y15 ) { case 0: if( e == 180 && x800(dg) ) else if( e == 220 ) else if( e == 0 ) { z800_0(dg) ; } else if( e == 180 ) { z800_1(dg) ; } ; break ; dg->y15 = 2 ; dg->y15 = 3 ; case 2: if( e == 0 ) break ; dg->y15 = 0 ;


23 case 3: if( e == 0 ) break ; dg->y15 = 0 ; default: #ifdef GRAPH_ERRORS_LOGGING log_write( LOG_GRAPH_ERROR, dg->number, "ERROR IN A15: unknown state number!", 0 ) ; #endif break ; }; if( y_old == dg->y15 ) goto A15_end ; { #ifdef GRAPH_TRANS_LOGGING log_trans( dg, "A15", y_old, dg->y15 ) ; #endif #ifdef DEBUG_FRAME update_debug() ; #endif }; switch( dg->y15 ) { case 0: z800_0(dg) ; break ; }; A15_end: #ifdef GRAPH_ENDS_LOGGING log_end( dg, "A15", dg->y15, e ) ; #endif ; }; 1.10. Автомат останова 1.10.1. Словесное описание 1. При нажатии оператором кнопки "Останов" система управления должна выполнить перечисленные ниже действия. 1.1. Отключить память команды на подготовку к пуску и табло "Подготовка к пуску", память готовности к пуску и табло "Пуск разрешен", память команды пуск и табло "Пуск", если соответствующие операции в момент подачи команды выполнялись. 1.2. Включить память команды останов. 1.3. Включить табло "Останов". 1.4. Подать питание на электромагнит остановки регулятора частоты вращения. 1.5. Выдать команду на уменьшение затяжки пружины регулятора частоты вращения до величины соответствующей первой позиции и через 4 с снять эту команду. 2. При уменьшении частоты вращения ниже частоты "начала заливания" система управления должна выдать в СУ ОКС сигнал "Закрыть наружную захлопку". 3. При уменьшении частоты вращения ниже рабочей частоты система управления должна выполнить перечисленные ниже действия. 3.1. Выдать команду на включение маслопрокачивающего насоса. 3.2. Включить отсчет времени прокачки маслом (60 c). 3.3. Включить табло "Прокачка маслом". 4. При уменьшении частоты вращения ниже частоты вращения останова система управления должна выполнить перечисленные ниже действия.


24 4.1. Выдать в СУ ОКС сигнал "Полная остановка ДГ". 4.2. Выдать в генераторный щит сигнал "Полная остановка ДГ" длительностью 3 с. 4.3. Выдать команду на закрытие клапана подачи воды в газоохладитель и на закрытие клапана слива воды из сепаратора газоотвода. 5. Через установленное время (п. 3.2) после запуска маслопрокачивающего насоса система управления должна выполнить перечисленные ниже действия. 5.1. Снять команду на включение маслопрокачивающего насоса. 5.2. Разомкнуть контакт остановки маслопрокачивающего насоса и через 4 с вновь замкнуть этот контакт. 5.3. Отключить табло "Прокачка маслом" при размыкании контакта пускателя маслопрокачивающего насоса. 5.4. Снять питание с электромагнита остановки регулятора частоты вращения. 5.5. Отключить память команды останов. 5.6. Отключить табло "Останов". Схема связей автомата и граф переходов приведены на рис. 13, 14. 1.10.2. Схема связей Ч В О Р ДЧВ Ч В Ч В Н З Автомат экстренного останова A4 Частота вращения больше уставки ЧВО Частота вращения больше уставки РЧВ Частота вращения меньше уставки ЧВНЗ Начато выполнение экстренного останова Обработчики событий Инициализация вложенных автоматов Нажатие кнопки ОСТАНОВ Истечение времени прокачки маслом А3 x210 z20_0 Отключить табло ПРОКАЧКА МАСЛОМ z20_1 Включить табло ПРОКАЧКА МАСЛОМ x220 z110_0 Отключить табло ОСТАНОВ z110_1 Включить табло ОСТАНОВ x240 z271_0 Погасить индикатор состояния наружной захлопки Вложен в автомат A0 Мнемосхема y4 ≠ 0 e0 e30 e260 z400_0 Выдать команду на отключение МПН (e420) z400_1 Выдать команду на включение МПН (e410) z410 Остановить МПН на 4-е секунды (e390) z420_0 Снять питание с электромагнита стопа РЧВ z420_1 Подать питание на электромагнит стопа РЧВ z460 Установить частоту вращения 1-й ступени (e380) z480_0 Закрыть клапан подачи воды в газоохладитель (e420) z490_0 Закрыть клапан слива воды (e420) z730 Выдать сигнал ЗАКРЫТЬ НАРУЖНУЮ ЗАХЛОПКУ z740 Выдать сигнал ПОЛНАЯ ОСТАНОВКА ДГ Автомат управления клапаном с обратной связью A80 Автомат остановки МПН A60 Магнитный пускатель МПН Контакт остановки МПН Электромагнит стопа РЧВ Автомат управления частотой вращения A5 Автомат управления клапаном с обратной связью A80 Автомат управления клапаном с обратной связью A80 Клапан подачи воды в газоохладитель Клапан слива воды из сепаратора газоотвода СУ ОКС z750 Выдать сигнал ПОЛНАЯ ОСТАНОВКА ДГ в генераторный щит (e400) z840_0 Остановить таймер z840_1 Запустить таймер Автомат выдачи сигнала ПОЛНАЯ ОСТАНОВКА ДГ в генраторный щит A61 Таймер контроля времени прокачки маслом 60 с Рис. 13. Схема связей автомата останова


25 1.10.3. Граф переходов (y4 ≠ 0) z840_0 0. Начальное e30 z: 20_0; 110_0; 400_0 2. Останов z: 110_1; 420_1; 460 x240 3. Закрыть захлопку x220 z: 271_0; 730 4. Включить МПН x210 z: 20_1; 400_1; 840_1 5. Остановлен z: 740; 480_0; 490_0; 750 e260 z: 420_0; 410 Рис. 14. Граф переходов автомата останова 1.10.4. Текст функции, реализующей автомат #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_LOGGING log_exec( dg, "A3", y_old, e ) ; #endif switch( dg->y3 ) { case 0: if( e == 30 ) break ; dg->y3 = 2 ; case 2: if( dg->y4 != 0 ) { z840_0(dg) ; else if( x240(dg) ) break ; dg->y3 = 0 ; } dg->y3 = 3 ; case 3: if( dg->y4 != 0 ) { z840_0(dg) ; else if( !x220(dg) ) break ; dg->y3 = 0 ; } dg->y3 = 4 ; case 4: if( dg->y4 != 0 ) { z840_0(dg) ; else if( !x210(dg) ) break ; dg->y3 = 0 ; } dg->y3 = 5 ; case 5: if( dg->y4 != 0 ) { z840_0(dg) ; dg->y3 = 0 ; } else if( e == 260 ) { z410(dg) ; z420_0(dg) ; dg->y3 = 0 ; } break ; default: #ifdef GRAPH_ERRORS_LOGGING log_write( LOG_GRAPH_ERROR, dg->number, "ERROR IN A3: unknown state number!", 0 ) ; #endif break ; };


26 if( y_old == dg->y3 ) goto A3_end ; { #ifdef GRAPH_TRANS_LOGGING log_trans( dg, "A3", y_old, dg->y3 ) ; #endif #ifdef DEBUG_FRAME update_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 ; }; A3_end: #ifdef GRAPH_ENDS_LOGGING log_end( dg, "A3", dg->y3, e ) ; #endif ; }; 1.11. Автомат ожидания разрешения выполнения предпусковых операций 1.11.1. Словесное описание Автомат реализует часть алгоритма предпусковых операций, описанного в подразделе 1.5. При нажатии кнопки "Подготовка к пуску" автомат проверяет значения сигналов, запрещающих выполнение алгоритма предпусковых операций и, при необходимости, выдает в СУ ОКС сигнал "Подготовка к пуску". Схема связей автомата и граф переходов приведены на рис. 15, 16.


1.11.2. Схема связей 27 Вложен в автомат A0 Р ДЧВ Ч В Сигнализатор уровня воды в ГО ДВПМ ДППВ Наличие сигнала БЛОКИРОВКА ПУСКА Частота вращения больше уставки РЧВ Наличие сигнала ВОДА В ОХЛАДИТЕЛЕ (аварийный уровень) Наличие сигнала МВП НЕ ОТКЛЮЧЕН Наличие сигнала ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ А8 x700 z710 Выдать сигнал ПОДГОТОВКА К ПУСКУ x220 x500 x510 x520 СУ ОКС Обработчики событий Инициализация вложенных автоматов e0 Нажатие кнопки ПОДГОТОВКА К ПУСКУ e10 Снятие сигнала БЛОКИРОВКА ПУСКА из СУ ОКС e80 Рис. 15. Схема связей автомата ожидания разрешения выполнения предпусковых операций 1.11.3. Граф переходов e10⋅(x220 ∨ x500 ∨ x510 ∨ x520) 0. Начальное 1: e10⋅(x220 ∨ x500 ∨ x510 ∨ x520 ∨ x700) x220 ∨ x500 ∨ x510 ∨ x520 ∨ e0 1. Ожидание разрешения пуска z710 e80⋅(x220 ∨ x500 ∨ x510 ∨ x520) e0 2. Выполнить предпусковые операции Рис. 16. Граф переходов автомата ожидания разрешения выполнения предпусковых операций 1.11.4. Текст функции, реализующей автомат #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_LOGGING log_exec( dg, "A8", y_old, e ) ; #endif


28 switch( dg->y8 ) { case 0: if( e == 10 && !( x220(dg) || x500(dg) || x510(dg) || x520(dg) || x700(dg))) dg->y8 = 2 ; else if( 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 ; else if( 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_LOGGING log_write( LOG_GRAPH_ERROR, dg->number, "ERROR IN A8: unknown state number!", 0 ) ; #endif break ; }; if( y_old == dg->y8 ) goto A8_end ; { #ifdef GRAPH_TRANS_LOGGING log_trans( dg, "A8", y_old, dg->y8 ) ; #endif #ifdef DEBUG_FRAME update_debug() ; #endif }; switch( dg->y8 ) { case 1: z710(dg) ; break ; }; A8_end: #ifdef GRAPH_ENDS_LOGGING log_end( dg, "A8", dg->y8, e ) ; #endif ; }; 1.12. Автомат аварийной и предупредительной сигнализации 1.12.1. Словесное описание Автомат обобщает работу автоматов контроля параметров дизельгенратора. Выделены четыре режима работы алгоритма аварийной и предупредительной сигнализации. 1. Рабочий режим. Все параметры в допуске. 2. Аварийный останов. Аварийное отклонение как минимум одного из контролируемых параметров. 3. Авария без останова. Аварийное отклонение температуры масла или температуры воды при отключенной защите по этим параметрам. 4. Разнос. Частота вращения дизель-генератора превысила предельно допустимую. Схема связей автомата и граф переходов приведены на рис. 17, 18.


1.12.2. Схема связей Пульт ДЧВ Ппред Автомат контроля температуры масла A71 Автомат контроля давления масла A72 Автомат контроля температуры воды A74 Автомат контроля давления в отсеке A77 Автомат контроля уровня воды в охладителе A78 Защита включена Частота вращения больше ПРЕД Аварийный перегрев масла Аварийное снижение давления масла Аварийный перегрев воды Аварийное снижение давления в отсеке Аварийный уровень воды Обработчики событий Нажатие кнопки КВИТИРОВАНИЕ 29 Вложен в автомат A20. Вложенные автоматы: A71, A72, A73, A74, A75, A76, A77, A78 x20 x260 А7 z280_0 z280_1 z280_2 Отключить табло РАЗНОС Включить постоянное табло РАЗНОС Включить мигающее табло РАЗНОС Мнемосхема y71 = 4 y72 = 5 y74 = 4 z1300 Добавить сообщение в очередь сообщений об авариях y77 = 3 y78 = 2 e50 Рис. 17. Схема связей автомата аварийной и предупредительной сигнализации 1.12.3. Граф переходов ( ) C7_1 = x20 ⋅ (y71= 4) ∨ (y74 = 4) ∨ (y72 = 5) ∨ (y77 = 3) ∨ (y78 = 2) ( ) C7_2 = x20 ⋅ (y71= 4) ∨ (y74 = 4) 2 : C7_2 0. Рабочий режим A71, A72, A73, A74, A75, A76, A77, A78 x260 1 : C7_1 C7_2 3.Авария без останова A71, A72, A73, A74, A75, A76, A77, A78 1 : C7_1 C7_1 1 : C7_2 2. Аварийный останов A71, A72, A73, A74, A75, A76, A77, A78 x260 z280_0 4. Разнос A71, A72, A73, A74, A75, A76, A77, A78 z: 280_2; 1300 e50 z280_1 2 : x260 Рис. 18. Граф переходов автомата аварийной и предупредительной сигнализации 1.12.4. Текст функции, реализующей автомат #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 ; }; int C7_2( dg_t *dg ) { return !x20(dg) && ( dg->y71 == 4 || dg->y74 == 4 ) ; };


30 void A7( int e, dg_t *dg ) { int y_old = dg->y7 ; #ifdef GRAPH_EVENTS_LOGGING log_exec( dg, "A7", y_old, e ) ; #endif switch( 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 ; else if( C7_2(dg) ) dg->y7 = 3 ; else if( 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 ; else if( !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 ; else if( x260(dg) ) dg->y7 = 4 ; else if( !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 ; } else if( e == 50 ) { z280_1(dg) ; } break ; default: #ifdef GRAPH_ERRORS_LOGGING log_write( LOG_GRAPH_ERROR, dg->number, "ERROR IN A7: unknown state number!", 0 ) ; #endif break ; }; if( y_old == dg->y7 ) goto A7_end ; { #ifdef GRAPH_TRANS_LOGGING log_trans( dg, "A7", y_old, dg->y7 ) ; #endif #ifdef DEBUG_FRAME update_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 ; case 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 ;


31 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_LOGGING log_end( dg, "A7", dg->y7, e ) ; #endif ; }; 1.13. Автомат контроля температуры масла 1.13.1. Словесное описание Автомат производит контроль температуры масла, определяет и выполняет индикацию следующих ситуаций: − низкая температура. Температура масла ниже уставки Тмм; − предупредительный уставки Тмпр; перегрев. Температура масла выше − аварийный перегрев. Температура масла выше уставки Тма. Схема связей автомата и граф переходов приведены на рис. 19, 20. 1.13.2. Схема связей Пульт Датчик Тмм температуры Тмпр масла Тма Защита включена Температура масла ниже Тмм Температура масла выше Тмпр Температура масла выше Тма Обработчики событий Нажатие кнопки КВИТИРОВАНИЕ Нажатие кнопки РАЗБЛОКИРОВКА x20 x320 x330 x340 А71 z140_0 Отключить табло ХОЛОДНОЕ МАСЛО z140_1 Включить зеленое табло ХОЛОДНОЕ МАСЛО z150_0 Отключить табло ПЕРЕГРЕВ МАСЛА z150_1 Включить желтое табло ПЕРЕГРЕВ МАСЛА z150_2 Включить желтое мигающее табло ПЕРЕГРЕВ МАСЛА z150_3 Включить красное табло ПЕРЕГРЕВ МАСЛА z150_4 Включить красное мигающее табло ПЕРЕГРЕВ МАСЛА z700_1 e50 e60 z1300 Вложен в автомат A7 Мнемосхема Включить обобщенную звуковую сигнализацию Добавить сообщение в очередь сообщений об авариях Рис. 19. Схема связей автомата контроля температуры масла


32 1.13.3. Граф переходов 0. Нормальная x320 z: 140_0; 150_0 x330 z:1300; 700_1 x320 2. Низкая x330 3. Предупредительный перегрев ( ) 1 : e60 ∨ x20 ⋅ x330 ⋅ x340 ( ) e60 ∨ x20 ⋅ x340 4. Аварийный перегрев z: 140_1; 1300 z150_2 e50 z150_1 1: x340 z1300 z: 150_4, 700_1 e50 z150_3 Рис. 20. Граф переходов автомата контроля температуры масла 1.13.4. Текст функции, реализующей автомат #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_LOGGING log_exec( dg, "A71", y_old, e ) ; #endif switch( dg->y71 ) { case 0: if( x320(dg) ) dg->y71 = 2 ; else if( x330(dg) ) { z1300(dg, MSG_OIL_TEMP_HIGH_ALARM) ; z700_1(dg) ; dg->y71 = 3 ; } break ; case 2: if( !x320(dg) ) break ; dg->y71 = 0 ; case 3: if( x340(dg) ) { z1300(dg, MSG_OIL_TEMP_HIGH_FAIL) ; dg->y71 = 4 ; } else if( !x330(dg) ) dg->y71 = 0 ; else if( e == 50 ) { z150_1(dg) ; } break ; case 4: if( ( e == 60 || !x20(dg) ) && x330(dg) && !x340(dg)) dg->y71 = 3 ; else if( ( e == 60 || !x20(dg) ) && !x340(dg) ) dg->y71 = 0 ; else if( e == 50 ) { z150_3(dg) ; } break ;


33 default: #ifdef GRAPH_ERRORS_LOGGING log_write( LOG_GRAPH_ERROR, dg->number, "ERROR IN A71: unknown state number!", 0 ) ; #endif break ; }; if( y_old == dg->y71 ) goto A71_end ; { #ifdef GRAPH_TRANS_LOGGING log_trans( dg, "A71", y_old, dg->y71 ) ; #endif #ifdef DEBUG_FRAME update_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_LOGGING log_end( dg, "A71", dg->y71, e ) ; #endif ; }; 1.14. Автомат контроля давления масла 1.14.1. Словесное описание Автомат производит контроль давления масла, определяет и выполняет индикацию следующих ситуаций: − предупредительное снижение. Давление масла ниже уставки Рмпрi, где i - текущая ступень частоты вращения; − аварийное снижение. Давление масла ниже уставки Рмаi. Контроль давления масла включается через 10 с после запуска дизель-генератора. Схема связей автомата и граф переходов приведены на рис. 21, 22.


1.14.2. Схема связей ДЧВ Р Ч Частота вращения больше РЧВ В Д1СЧВ Первая ступень частоты вращения Д2СЧВ Вторая ступень частоты вращения Д3СЧВ Третья ступень частоты вращения Рмпр1 Давление масла ниже уставки Рмпр1 Рмпр2 Давление масла ниже уставки Рмпр2 Датчик Рмпр3 давления масла Рмав1 Давление масла ниже уставки Рмпр3 Давление масла ниже уставки Рмав1 Рмав2 Давление масла ниже уставки Рмав2 Рмав3 Давление масла ниже уставки Рмав3 34 x220 x280 x290 А72 z160_0 Отключить табло ДАВЛЕНИЕ МАСЛА z160_1 Включить желтое табло ДАВЛЕНИЕ МАСЛА z160_2 Включить желтое мигающее табло ДАВЛЕНИЕ МАСЛА z160_3 Включить красное табло ДАВЛЕНИЕ МАСЛА z160_4 Включить красное мигающее табло ДАВЛЕНИЕ МАСЛА Вложен в автомат A7 Мнемосхема x300 x360 x370 x380 z700_1 z1300 Включить обобщенную звуковую сигнализацию Добавить сообщение в очередь сообщений об авариях x390 x400 x410 Обработчики событий Нажатие кнопки КВИТИРОВАНИЕ e50 Нажатие кнопки РАЗБЛОКИРОВКА e60 Истечение времени задержки контроля параметров e261 z880_1 Запустить таймер Таймер задержки контроля параметров 10 с Рис. 21. Схема связей автомата контроля давления масла 1.14.3. Граф переходов x220 0. Ожидание РЧВ ( ) C721 = x220 ⋅ x280 ⋅ x360 ∨ x290 ⋅ x370 ∨ x300 ⋅ x380 ( ) C722 = x220 ⋅ x280 ⋅ x390 ∨ x290 ⋅ x400 ∨ x300 ⋅ x410 3. Задержка контроля e261 z880_1 1 : x220 1. Нормальное z160_0 C721 z:1300; 700_1 e50 z160_1 4. Предупредительное снижение z160_2 C721 1: C722 z1300 e50 z160_3 5. Аварийное снижение z: 160_4; 700_1 1 : e60 ⋅ C721 e60 ⋅ C722 Рис. 22. Граф переходов автомата контроля давления масла 1.14.4. Текст функции, реализующей автомат #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) ) ); };


35 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_LOGGING log_exec( dg, "A72", y_old, e ) ; #endif switch( dg->y72 ) { case 0: if( x220(dg) ) break ; dg->y72 = 3 ; case 1: if( !x220(dg) ) dg->y72 = 0 ; else if( C721(dg) ) { z1300(dg, MSG_OIL_PRESS_ALARM) ; z700_1(dg) ; dg->y72 = 4 ; } break ; case 3: if( e == 261 ) break ; dg->y72 = 1 ; case 4: if( C722(dg) ) { z1300(dg, MSG_OIL_PRESS_FAIL) ; dg->y72 = 5 ; } else if( !C721(dg) ) dg->y72 = 1 ; else if( e == 50 ) { z160_1(dg) ; } break ; case 5: if( e == 60 && C721(dg) ) else if( e == 60 && !C722(dg) ) else if( e == 50 ) { z160_3(dg) ; } break ; dg->y72 = 4 ; dg->y72 = 1 ; default: #ifdef GRAPH_ERRORS_LOGGING log_write( LOG_GRAPH_ERROR, dg->number, "ERROR IN A72: unknown state number!", 0 ) ; #endif break ; }; if( y_old == dg->y72 ) goto A72_end ; { #ifdef GRAPH_TRANS_LOGGING log_trans( dg, "A72", y_old, dg->y72 ) ; #endif #ifdef DEBUG_FRAME update_debug() ; #endif }; switch( dg->y72 ) { case 1: z160_0(dg) ; break ;


36 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_LOGGING log_end( dg, "A72", dg->y72, e ) ; #endif ; }; 1.15. Обработчики событий В качестве примера приведем несколько обработчиков событий, вызывающих автоматы. int e10( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) { if( widget == ABW_dg1_prepare_btn ) A20( 10, &dgs[DG1] ) ; else if( widget == ABW_dg2_prepare_btn ) A20( 10, &dgs[DG2] ) ; return( Pt_CONTINUE ) ; }; int e220( void *data, pid_t pid, void *msg, size_t msg_size ) { dg_t *dg = (dg_t*)data ; A20( 220, dg ) ; return Pt_END ; }; int e266( void *data, pid_t pid, void *msg, size_t msg_size ) { dg_t *dg = (dg_t*)data ; A13( 266, dg ) ; return Pt_END ; }; 1.16. Входные переменные В качестве примера приведем реализацию нескольких входных переменных. int x10( dg_t *dg ) { int result = 0 ; #ifdef IMITATOR_MODE { message_t msg, rmsg ; if( imitator_pid == -1 ) result = 0 ; else { msg.type = X10_MSG ; msg.dg_num = dg->number - 1 ;


37 Send( imitator_pid, &msg, &rmsg, sizeof(msg), sizeof(rmsg) ) ; result = rmsg.data ; } }; #endif #ifdef INPUTS_LOGGING log_input( dg, "x10 - дистанционное управление включено -", result ) ; #endif return result ; }; int x20( dg_t *dg ) { int result = 0 ; result = dg->number == 2 ? is_wgt_set(ABW_dg2_protection_btn) : is_wgt_set(ABW_dg1_protection_btn) ; #ifdef INPUTS_LOGGING log_input( dg, "x20 - защита включена -", result ) ; #endif return result ; }; int x320( dg_t *dg ) { int result = 0 ; result = get_dg_oil_temp(dg) < Tmm ; #ifdef INPUTS_LOGGING log_input( dg, "x320 - температура масла меньше Тмм -", result ) ; #endif return result ; }; 1.17. Выходные воздействия В качестве примера приведем реализацию нескольких выходных воздействий. void z10_0( dg_t *dg ) { #ifdef ACTIONS_LOGGING log_write( LOG_ACTION, dg->number, "z10_0. Отключить табло ПОДГОТОВКА К ПУСКУ.", 0 ) ; #endif tab_off( dg->prepare_tab ) ; }; void z10_1( dg_t *dg ) { #ifdef ACTIONS_LOGGING log_write( LOG_ACTION, dg->number, "z10_1. Включить табло ПОДГОТОВКА К ПУСКУ.", 0 ) ; #endif tab_on( dg->prepare_tab, on_tab_color ) ; }; void z810_0( dg_t *dg ) { #ifdef ACTIONS_LOGGING log_write( LOG_ACTION, dg->number, "z810_0. Сбросить таймер контроля проворота.", 0 ) ; #endif disarm_timer( dg->e220_timer_id ) ; dg->e220_timer_id = -1 ; };


38 void z810_1( dg_t *dg ) { #ifdef ACTIONS_LOGGING log_write( LOG_ACTION, dg->number, "z810_1. Запустить таймер контроля проворота.", 0 ) ; #endif dg->e220_timer_id = arm_timer( turn_timer_delay, 0, 0, 0, e220, dg ) ; }; 1.18. Вспомогательные модули Вспомогательные модули в зависимости от характера реализуемого ими алгоритма могут как содержать автоматы, так и не содержать их. В качестве примера приведем реализацию вспомогательных функций из модуля управления виджетами. //====== // Отключить табло. // void tab_off( PtWidget_t *wgt ) { PtArg_t args[5] ; int n=0; if( !wgt ) return ; PtSetArg( &args[n++], Pt_ARG_FLAGS, Pt_GHOST, Pt_GHOST ) ; PtSetArg( &args[n++], Pt_ARG_FILL_COLOR, Pg_GREY, 0 ) ; PtSetArg( &args[n++], Pt_ARG_COLOR, PgRGB(144,144,144), 0 ) ; PtSetResources( wgt, n, args ) ; }; //====== // Включить табло. // void tab_on( PtWidget_t *wgt, PgColor_t color ) { PtArg_t args[5] ; int n=0; if( !wgt ) return ; PtSetArg( &args[n++], Pt_ARG_FLAGS, ~Pt_GHOST, Pt_GHOST ) ; PtSetArg( &args[n++], Pt_ARG_FILL_COLOR, color, 0 ) ; PtSetArg( &args[n++], Pt_ARG_COLOR, Pg_BLACK, 0 ) ; PtSetResources( wgt, n, args ) ; }; 1.19. Протоколы функционирования системы управления Приведем примеры протоколов работы для системы управления в целом при обработке нажатия кнопки "Подготовка к пуску" (событие e10), полученный автоматически с выделенными вручную этапами. Диагностирующий (полный) протокол имеет следующий вид. Нажатие кнопки "Подготовка к пуску": 11:34:02.507{ DG1: A20: в состоянии 2 запущен с событием e10 11:34:02.507{ DG1: A7: в состоянии 0 запущен с событием e10 11:34:02.507{ DG1: A71: в состоянии 0 запущен с событием e10 11:34:02.507> DG1: x320 - температура масла меньше Тмм - вернул 0 11:34:02.507> DG1: x330 - температура масла больше Тмпр - вернул 0 11:34:02.507} DG1: A71: завершил обработку события e10 в состоянии 0 11:34:02.507{ DG1: A72: в состоянии 0 запущен с событием e10 11:34:02.507> DG1: x220 - частота вращения больше РЧВ - вернул 0 11:34:02.507} DG1: A72: завершил обработку события e10 в состоянии 0 11:34:02.507{ DG1: A73: в состоянии 0 запущен с событием e10


39 11:34:02.507> DG1: x220 - частота вращения больше РЧВ - вернул 0 11:34:02.507} DG1: A73: завершил обработку события e10 в состоянии 0 11:34:02.507{ DG1: A74: в состоянии 0 запущен с событием e10 11:34:02.507> DG1: x430 - температура воды меньше Твм - вернул 0 11:34:02.507> DG1: x440 - температура воды больше Твпр - вернул 0 11:34:02.507} DG1: A74: завершил обработку события e10 в состоянии 0 11:34:02.507{ DG1: A75: в состоянии 0 запущен с событием e10 11:34:02.507> DG1: x460 - давление наддува больше Рнпр - вернул 0 11:34:02.507} DG1: A75: завершил обработку события e10 в состоянии 0 11:34:02.507{ DG1: A76: в состоянии 0 запущен с событием e10 11:34:02.507> DG1: x470 - температура газов больше Твг - вернул 0 11:34:02.507} DG1: A76: завершил обработку события e10 в состоянии 0 11:34:02.507{ DG1: A77: в состоянии 0 запущен с событием e10 11:34:02.507> DG1: x480 - давление в отсеке ниже Ротс - вернул 0 11:34:02.507} DG1: A77: завершил обработку события e10 в состоянии 0 11:34:02.507{ DG1: A78: в состоянии 0 запущен с событием e10 11:34:02.507> DG1: x500 - сигнал ВОДА В ОХЛАДИТЕЛЕ - вернул 0 11:34:02.507} DG1: A78: завершил обработку события e10 в состоянии 0 11:34:02.507> DG1: x20 - защита включена - вернул 1 11:34:02.507> DG1: x20 - защита включена - вернул 1 11:34:02.507> DG1: x260 - частота вращения больше ППРЕД - вернул 0 11:34:02.507} DG1: A7: завершил обработку события e10 в состоянии 0 11:34:02.507{ DG1: A0: в состоянии 0 запущен с событием e10 11:34:02.507{ DG1: A8: в состоянии 0 запущен с событием e10 11:34:02.507> DG1: x220 - частота вращения больше РЧВ - вернул 0 11:34:02.507> DG1: x500 - сигнал ВОДА В ОХЛАДИТЕЛЕ - вернул 0 11:34:02.507> DG1: x510 - сигнал МВП НЕ ОТКЛЮЧЕН - вернул 0 11:34:02.507> DG1: x520 - сигнал ПРЕДЕЛЬНЫЙ ВЫКЛЮЧАТЕЛЬ - вернул 0 11:34:02.507> DG1: x700 - сигнал БЛОКИРОВКА ПУСКА из СУ ОКС - вернул 0 11:34:02.507T DG1: A8: перешел из состояния 0 в состояние 2 11:34:02.507} DG1: A8: завершил обработку события e10 в состоянии 2 11:34:02.507T DG1: A0: перешел из состояния 0 в состояние 1 11:34:02.507{ DG1: A4: в состоянии 0 запущен с событием e0 11:34:02.507{ DG1: A4_0: в состоянии 0 запущен с событием e0 11:34:02.507} DG1: A4_0: завершил обработку события e0 в состоянии 0 11:34:02.507} DG1: A4: завершил обработку события e0 в состоянии 0 11:34:02.507{ DG1: A3: в состоянии 0 запущен с событием e0 11:34:02.507} DG1: A3: завершил обработку события e0 в состоянии 0 11:34:02.507{ DG1: A1: в состоянии 0 запущен с событием e0 11:34:02.507T DG1: A1: перешел из состояния 0 в состояние 1 11:34:02.507{ DG1: A1_0: в состоянии 0 запущен с событием e0 11:34:02.507* DG1: z800_0. Сбросить счетчик проворотов. 11:34:02.507} DG1: A1_0: завершил обработку события e0 в состоянии 0 11:34:02.507* DG1: z10_1. Включить табло ПОДГОТОВКА К ПУСКУ. 11:34:02.507* DG1: z20_1. Включить табло ПРОКАЧКА МАСЛОМ. 11:34:02.507* DG1: z30_1. Включить табло ПРОВОРОТ. Запустить маслопрокачивающий насос: 11:34:02.507* DG1: z400_1. Включить магнитный пускатель МПН. 11:34:02.507{ DG1: A80( z400 ): в состоянии 0 запущен с событием e410 11:34:02.507> DG1: x900( z400 ) - клапан открыт - вернул 0 11:34:02.507T DG1: A80( z400 ): перешел из состояния 0 в состояние 3 11:34:02.507* DG1: z270_2( z400 ). Индикация состояния клапана - закрывается/открывается. 11:34:02.507* DG1: z950_1( z400 ). Запустить таймер контроля срабатывания. 11:34:02.507* DG1: z1000_1( z400 ). Открыть/запустить. 11:34:02.507} DG1: A80( z400 ): завершил обработку события e410 в состоянии 3 11:34:02.507* DG1: z420_1. Подать питание на электромагнит стопа РЧВ. Открыть клапан подачи воздуха к дизель-генератору: 11:34:02.507* DG1: z430_1. Открыть клапан подачи воздуха к ДГ. 11:34:02.507{ DG1: A80( z430 ): в состоянии 0 запущен с событием e410 11:34:02.507> DG1: x900( z430 ) - клапан открыт - вернул 0 11:34:02.507T DG1: A80( z430 ): перешел из состояния 0 в состояние 3 11:34:02.507* DG1: z270_2( z430 ). Индикация состояния клапана - закрывается/открывается. 11:34:02.507* DG1: z950_1( z430 ). Запустить таймер контроля срабатывания. 11:34:02.507* DG1: z1000_1( z430 ). Открыть/запустить. 11:34:02.507} DG1: A80( z430 ): завершил обработку события e410 в состоянии 3 Открыть клапан подачи воздуха низкого давления: 11:34:02.507* DG1: z440_1. Открыть клапан подачи воздуха низкого давления. 11:34:02.507{ DG1: A80( z440 ): в состоянии 0 запущен с событием e410 11:34:02.507> DG1: x900( z440 ) - клапан открыт - вернул 0


40 11:34:02.507T DG1: A80( z440 ): перешел из состояния 0 в состояние 3 11:34:02.507* DG1: z270_2( z440 ). Индикация состояния клапана - закрывается/открывается. 11:34:02.507* DG1: z950_1( z440 ). Запустить таймер контроля срабатывания. 11:34:02.507* DG1: z1000_1( z440 ). Открыть/запустить. 11:34:02.507} DG1: A80( z440 ): завершил обработку события e410 в состоянии 3 Выдать команду на установку частоты вращения первой ступени: 11:34:02.507* DG1: z460. Выдать команду на установку частоты вращения первой ступени. 11:34:02.507{ DG1: A5: в состоянии 0 запущен с событием e380 11:34:02.507> DG1: x810 - заданная частота вращения выше установленной - вернул 1 11:34:02.507T DG1: A5: перешел из состояния 0 в состояние 2 11:34:02.507* DG1: z610_1. Увеличить установленную частоту РЧВ. 11:34:02.507} DG1: A5: завершил обработку события e380 в состоянии 2 11:34:02.507* DG1: z810_1. Запустить таймер контроля проворота. 11:34:02.507} DG1: A1: завершил обработку события e0 в состоянии 1 11:34:02.507* DG1: z290_0. Индикация состояния ДГ - остановлен. 11:34:02.507} DG1: A0: завершил обработку события e10 в состоянии 1 11:34:02.507{ DG1: A5: в состоянии 2 запущен с событием e10 11:34:02.507> DG1: x810 - заданная частота вращения выше установленной - вернул 1 11:34:02.517> DG1: x820 - заданная частота вращения ниже установленной - вернул 0 11:34:02.517} DG1: A5: завершил обработку события e10 в состоянии 2 11:34:02.517{ DG1: A13: в состоянии 0 запущен с событием e10 11:34:02.517} DG1: A13: завершил обработку события e10 в состоянии 0 11:34:02.517{ DG1: A62: в состоянии 0 запущен с событием e10 11:34:02.517T DG1: A62: перешел из состояния 0 в состояние 1 11:34:02.517* DG1: z1110_1. Запустить таймер регистрации параметров. 11:34:02.517* DG1: z1120_1. Запустить таймер индикации параметров. 11:34:02.517} DG1: A62: завершил обработку события e10 в состоянии 1 11:34:02.517} DG1: A20: завершил обработку события e10 в состоянии 2 Ниже приводится проверяющий (короткий) протокол обработки нажатия кнопки "Подготовка к пуску" (событие e10). 11:41:06.188{ DG1: A20: в состоянии 2 запущен с событием e10 11:41:06.188* DG1: z800_0. Сбросить счетчик проворотов. 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 ). Индикация состояния клапана - закрывается/открывается. 11:41:06.188* DG1: z950_1( z400 ). Запустить таймер контроля срабатывания. 11:41:06.188* DG1: z1000_1( z400 ). Открыть/запустить. 11:41:06.188* DG1: z420_1. Подать питание на электромагнит стопа РЧВ. 11:41:06.188* DG1: z430_1. Открыть клапан подачи воздуха к ДГ. 11:41:06.188* DG1: z270_2( z430 ). Индикация состояния клапана - закрывается/открывается. 11:41:06.188* DG1: z950_1( z430 ). Запустить таймер контроля срабатывания. 11:41:06.188* DG1: z1000_1( z430 ). Открыть/запустить. 11:41:06.188* DG1: z440_1. Открыть клапан подачи воздуха низкого давления. 11:41:06.188* DG1: z270_2( z440 ). Индикация состояния клапана - закрывается/открывается. 11:41:06.188* DG1: z950_1( z440 ). Запустить таймер контроля срабатывания. 11:41:06.188* DG1: z1000_1( z440 ). Открыть/запустить. 11:41:06.188* DG1: z460. Выдать команду на установку частоты вращения первой ступени. 11:41:06.188* DG1: z610_1. Увеличить установленную частоту РЧВ. 11:41:06.188* DG1: z810_1. Запустить таймер контроля проворота. 11:41:06.188* DG1: z290_0. Индикация состояния ДГ - остановлен. 11:41:06.188* DG1: z1110_1. Запустить таймер регистрации параметров. 11:41:06.188* DG1: z1120_1. Запустить таймер индикации параметров. 11:41:06.188} DG1: A20: завершил обработку события e10 в состоянии 2 Для иллюстрации работы вложенных автоматов приведем структуру рассмотренного полного протокола. 1. A20 e10 в 2 В состояние 2 автомата А20 вложены А7,А0,А5,А13,А62 2. A7 e10 в 0 Вложен в состояние 2 автомата A20 3. A71 e10 в 0 Вложен в состояние 0 автомата A7 x320==0, x330==0 A71 Завершил обработку e10 в состоянии 0 4. A72 x220==0 A72 e10 в 0 Вложен в состояние 0 автомата A7 Завершил обработку e10 в состоянии 0


41 5. A73 e10 в 0 Вложен в состояние 0 автомата A7 x220==0 A73 Завершил обработку e10 в состоянии 0 6. A74 e10 в 0 Вложен в состояние 0 автомата A7 x430==0, x440==0 A74 Завершил обработку e10 в состоянии 0 7. A75 x460==0 A75 e10 в 0 Вложен в состояние 0 автомата A7 Завершил обработку e10 в состоянии 0 8. A76 x470==0 A76 e10 в 0 Вложен в состояние 0 автомата A7 Завершил обработку e10 в состоянии 0 9. A77 x480==0 A77 e10 в 0 Вложен в состояние 0 автомата A7 Завершил обработку e10 в состоянии 0 10. A78 e10 в 0 Вложен в состояние 0 автомата A7 x500==0 A78 Завершил обработку e10 в состоянии 0 x20==1, x260==0 A7 Завершил обработку e10 в состоянии 0 11. A0 e10 в 0 Вложен в состояние 2 автомата А20 12. A8 e10 в 0 Вложен в состояние 0 автомата А0 x220==0, x500==0, x510==0, x520==0, x700==0 A8 0→2 A8 Завершил обработку e10 в состоянии 2 A0 13. A4 14. A4_0 A4_0 0→2 В состояние 2 автомата А0 вложены А4, A3, A1 e0 в 0 Вложен в состояние 2 автомата А0 e0 в 0 Вложен в состояние 0 автомата А4 Завершил обработку e0 в состоянии 0 A4 Завершил обработку e0 в состоянии 0 15. A3 A3 e0 в 0 Вложен в состояние 2 автомата А0 Завершил обработку e0 в состоянии 0 16. A1 A1 e0 в 0 0→1 Вложен в состояние 2 автомата А0 В состояние 1 автомата А1 вложен A1_0 17. A1_0 z800_0 A1_0 e0 в 0 На петле в состоянии 0 Завершил обработку e0 в состоянии 0 z10_1, z20_1, z30_3 В состояние 1 автомата А1 z400_1 В состояние 1 автомата А1 18. A80(z400) e410 в 0 x900(z400)==0 А80(z400) 0 → 3 z270_2(z400), z950_1(z400), z1000_1(z400) А80(z400) Завершил обработку е410 в состоянии 3 z420_1 В состояние 1 автомата A1 z430_1 В состояние 1 автомата A1 19. А80(z430) е410 в 0 x900(z430)==0 А80(z430) 0 → 3 z270_2(z430), z950_1(z430), z1000_1(z430) А80(z430) Завершил обработку е410 в состоянии 3 z440_1 В состояние 1 автомата A1 20. A80(z440) е410 в 0 x900(z440)==0 A80(z440) 0 → 3 z270_2(z440), z950_1(z440), z1000_1(z440) A80(z440) Завершил обработку е410 в состоянии 3 z460 21. A5 x810==1 A5 z610_1 A5 e380 в 0 В состояние 1 автомата A1 Вызван из z460 0→2 Завершил обработку е380 в состоянии 2


z810_1 42 В состояние 1 автомата A1 A1 Завершил обработку е0 в состоянии 1 z290_0 A0 В состояние 2 автомата A0 Завершил обработку е0 в состоянии 2 22. A5 e10 в 2 Вложен в состояние 2 автомата A20 x810==1, x820==0 A5 Завершил обработку е10 в состоянии 2 23. A13 A13 e10 в 0 Вложен в состояние 2 автомата A20 Завершил обработку е10 в состоянии 0 24. A62 e10 в 0 Вложен в состояние 2 автомата A20 A62 0→1 z1110_1, z1120_1, z1140 A62 Завершил обработку е10 в состоянии 1 A20 Завершил обработку е10 в состоянии 2 2. Программный имитатор дизель-генератора Покажем, что предлагаемый подход применим не только для разработки программного обеспечения систем управления, но и для создания имитатора объекта управления, необходимого для автономной отладки указанной системы. Так как среди четырех разработанных автоматов между собой взаимодействуют только автоматы A30 и A31 (по вложенности), то схема взаимодействия автоматов не приводится. Обратим внимание, что некоторые из реализующих имитатор автоматов осуществляют управление аналоговыми параметрами. Среди автоматов, рассмотренных ниже, автомат A20 выполняет имитацию изменения затяжки пружины регулятора частоты вращения, а автомат A31 имитирует изменение частоты вращения дизель-генератора. Это возможно благодаря тому, что входные переменные и выходные воздействия автоматов реализуются функциями, которые могут выполнять произвольные действия. 2.1. Перечень событий Перечислим названия событий (е), на которые реагирует имитатор, и их номера. 0 Инициализация вложенных автоматов (внутреннее событие) 10 Открыть клапан 20 Закрыть клапан 30 Истечение времени исполнения команды 11 Остановить регулятор частоты вращения 21 Увеличить затяжку пружины регулятора частоты вращения 31 Уменьшить затяжку пружины регулятора частоты вращения 41 Достигнуто минимальное значение затяжки пружины регулятора частоты вращения 51 Достигнуто максимальное значение -"- 61 Сигнал от таймера синхроимпульсов модели регулятора частоты вращения 70 Открытие клапана низкого давления 71 Закрытие клапана низкого давления 72 Закрытие клапана подачи воздуха к ДГ 73 Закрытие главного пускового клапана 80 Частота вращения больше уставки ЧВО 81 Частота вращения меньше уставки ЧВО 90 Сигнал от таймера синхроимпульсов модели проворота 100 Сигнал от таймера имитации задержки пуска 110 Сигнал от таймера синхроимпульсов модели дизеля 200 Обобщенная команда останова дизеля


2.2. Перечень входных переменных Перечислим названия входных опрашиваются имитатором, и их номера. переменных (x), 43 которые 10 Клапан подачи воздуха к ДГ открыт 20 Клапан подачи воздуха низкого давления к ДГ открыт 30 Главный пусковой клапан открыт 40 Текущая частота вращения больше установленной на регуляторе 50 Текущая частота вращения меньше установленной на регуляторе 2.3. Перечень выходных воздействий Перечислим названия выходных воздействий (z), формируемых имитатором, и их номера. 10 Таймер задержки выполнения команды исполнительным устройством (0 - сбросить, 1 - запустить) 20 Таймер синхроимпульсов модели регулятора частоты вращения (0 - сбросить, 1 - запустить) 30 Изменить затяжку пружины регулятора частоты вращения (0 - уменьшить, 1 - увеличить) 50 Таймер синхроимпульсов модели проворота (0 - сбросить, 1 - запустить) 60 Выдать в СУ ДГ сигнал от датчика проворота коленчатого вала 70 Таймер имитации задержки пуска (0 - сбросить, 1 - запустить) 80 Установить частоту вращения дизеля на отметку частота вращения останова плюс 10 90 Таймер синхроимпульсов модели дизеля (0 - сбросить, 1 - запустить) 100 Изменить частоту вращения дизеля (0 - уменьшить, 1 - увеличить, 2 - резко уменьшить) 2.4. Автомат имитации исполнительного устройства 2.4.1. Словесное описание Автомат предназначен для имитации клапана (или любого аналогичного по логике работы исполнительного устройства, например, электродвигателя, используемого в рассматриваемой системе), снабженного сигнализаторами открытого и закрытого положений. При построении автомата учитываются следующие особенности моделируемого устройства. 1. При поступлении команды открытия или закрытия клапана включается задержка времени исполнения команды, по истечении которой имитируется срабатывание сигнализатора соответствующего положения. 2. Если до истечения времени задержки исполнения команды поступает команда перевода клапана в исходное положение, задержка включается заново и выполняется отработка новой команды. Схема связей автомата и граф переходов приведены на рис. 23, 24. 2.4.2. Схема связей Обработчики событий Открыть клапан Закрыть клапан Истечение времени исполнения команды А10 e10 z10_0 Сбросить таймер e20 z10_1 Запустить таймер e30 Таймер задержки выполнения команды исполнительным устройством Рис. 23. Схема связей автомата имитации исполнительного устройства


44 2.4.3. Граф переходов 0. Закрыт (остановлен) e10 2. Открывается (запускается) z10_1 e30 e20 z10_0 e10 z10_0 e30 3. Закрывается (останавливается) z10_1 1. Открыт (запущен) e20 Рис. 24. Граф переходов автомата имитации исполнительного устройства 2.4.4. Текст функции, реализующей автомат #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 ) break ; v->y = 2 ; case 1: if( e == 20 ) break ; v->y = 3 ; case 2: if( e == 30 ) v->y = 1 ; else if( e == 20 ) { z10_0(dg,v) ; v->y = 3 ; } ; break ; case 3: if( e == 30 ) v->y = 0 ; else if( 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 ; }; };


45 2.5. Автомат имитации регулятора частоты вращения 2.5.1. Словесное описание Автомат предназначен для имитации регулятора частоты вращения. При этом автомат обрабатывает команды на уменьшение или увеличение затяжки пружины регулятора, имитируя срабатывание сигнализаторов крайних положений регулятора. Схема связей автомата и граф переходов приведены на рис. 25, 26. 2.5.2. Схема связей Обработчики событий Остановить регулятор частоты вращения Увеличить затяжку пружины Уменьшить затяжку пружины Достигнуто минимальное значение затяжки Достигнуто максимальное значение затяжки Сигнал от таймера синхроимпульсов А20 e11 z20_0 Сбросить таймер e21 z20_1 Запустить таймер e31 e41 e51 z30_0 Сбросить таймер e61 z30_1 Запустить таймер Таймер синхроимпульсов модели регулятора частоты вращения Уменьшить затяжку пружины регулятора Увеличить затяжку пружины регулятора Рис. 25. Схема связей автомата имитации регулятора частоты вращения 2.5.3. Граф переходов e21 z20_1 0. Остановлен z20_0 e31 z20_1 1. Увеличивать e61 z30_1 e11 ∨ e51 e31 e11∨ e41 e21 2. Уменьшать e61 z30_0 Рис. 26. Граф переходов автомата имитации регулятора частоты вращения 2.5.4. Текст функции, реализующей автомат #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) ; else if( e == 31 ) { z20_1(dg) ; break ; dg->y20 = 1 ; } dg->y20 = 2 ; }


46 case 1: if( e == 11 || e == 51 ) dg->y20 = 0 ; else if( e == 31 ) dg->y20 = 2 ; else if( e == 61 ) { z30_1(dg) ; } ; break ; case 2: if( e == 11 || e == 41 ) dg->y20 = 0 ; else if( e == 21 ) dg->y20 = 1 ; else if( e == 61 ) { z30_0(dg) ; } ; break ; }; if( y_old == dg->y20 ) return ; switch( dg->y20 ) { case 0: z20_0(dg) ; break ; }; }; 2.6. Автомат имитации дизель-генератора 2.6.1. Словесное описание Автомат предназначен для имитации основных состояний дизельгенератора. В нем выделены состояния, перечисленные ниже. 1. Остановлен. 2. Проворот. Имитатор дизель-генератора переходит в это состояние при срабатывании имитаторов сигнализаторов открытых положений клапанов подачи воздуха и подачи воздуха низкого давления. В этом состоянии с заданной частотой имитируется выдача сигналов от датчика проворота коленвала. 3. Запуск. Имитатор дизель-генератора переходит в это состояние при срабатывании имитаторов сигнализаторов открытого положения клапана подачи воздуха и главного пускового клапана. При этом запускается задержка времени пуска, по истечении которой имитируется запуск дизель-генератора. 4. Работа. В этом состоянии выполняется алгоритм имитации изменения частоты вращения, описанный в следующем подразделе. Схема связей автомата и граф переходов приведены на рис. 27, 28.


2.6.2. Схема связей Параметры модели Открыт клапан подачи воздуха Открыт клапан подачи воздуха низкого давления к ДГ Открыт главный пусковой клапан Алгоритм имитации изменения частоты вращения A31 Дизель остановился Обработчики событий Сигнал от таймера проворота Сигнал от таймера задержки пуска Обобщенная команда останова дизеля 47 А30 x10 z50_0 Сбросить таймер z50_1 Запустить таймер x20 x30 z60 Выдать сигнал от ДПКВ y31 = 4 z70_0 Сбросить таймер z70_1 Запустить таймер Вложенные автоматы: A31 Таймер синхроимпульсов модели проворота СУ ДГ Таймер имитации задержки пуска z80 e90 e100 z90_0 Сбросить таймер e200 z90_1 Запустить таймер Установить частоту вращения ЧВО + 10 Таймер синхроимпульсов модели дизеля Рис. 27. Схема связей автомата имитации дизель-генератора 2.6.3. Граф переходов y31= 4 1. Проворот e90 z60 z50_1 x10 ⋅ x20 0. Остановлен x10 ∨ x20 ∨ e200 z: 50_0; 90_0 x10 ∨ x30 ∨ e200 2. Запуск x10 ⋅ x30 z70_1 e100 3. Работа z80 A31 z90_1 Рис. 28. Граф переходов автомата имитации дизель-генератора 2.6.4. Текст функции, реализующей автомат #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) ) else if( x10(dg) && x30(dg) ) break ; dg->y30 = 1 ; dg->y30 = 2 ; case 1: if( !x10(dg) || !x20(dg) || e == 200 ) else if( e == 90 ) { z60(dg) ; } ; break ; dg->y30 = 0 ; case 2: if( !x10(dg) || !x30(dg) || e == 200 ) else if( e == 100 ) { z80(dg) ; break ; dg->y30 = 0 ; dg->y30 = 3 ; } ;


48 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 ; }; }; 2.7. Автомат имитации изменения частоты вращения 2.7.1. Словесное описание Автомат предназначен для имитации изменения частоты вращения дизель-генератора. Если текущая частота вращения дизель-генератора отличается от установленной на регуляторе, то имитируется плавное изменение частоты вращения. При поступлении от системы управления команды на останов дизель-генератора (этой командой считается команда на закрытие наружной захлопки газоотвода), выполняется быстрое уменьшение его частоты вращения до нуля. Схема связей автомата и граф переходов приведены на рис. 29, 30. 2.7.2. Схема связей Параметры модели Частота вращения больше заданной Частота вращения меньше заданной А31 x40 z100_0 x50 z100_1 Обработчики событий Инициализация вложенных автоматов e0 Срабатывание уставки частоты вращения останова e81 Сигнал от таймера модели дизеля e110 Обобщенная команда останова дизеля e200 z100_2 Уменьшить частоту вращения Увеличить частоту вращения Резко уменьшить частоту вращения Рис. 29. Схема связей автомата имитации изменения частоты вращения


49 2.7.3. Граф переходов 0. Установившийся режим x40 x50 e200 2. Тормозится x40 x50 1. Разгоняется e110 e200 e0 z100_0 4. Остановлен 3. Останавливается e81 e200 e110 z100_2 e110 z100_1 Рис. 30. Граф переходов автомата имитации изменения частоты вращения 2.7.4. Текст функции, реализующей автомат #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) ) else if( x50(dg) ) else if( e == 200 ) break ; dg->y31 = 2 ; dg->y31 = 1 ; dg->y31 = 3 ; case 1: if( !x50(dg) ) dg->y31 = 0 ; else if( e == 110 ) { z100_1(dg) ; } else if( e == 200 ) dg->y31 = 3 ; break ; case 2: if( !x40(dg) ) dg->y31 = 0 ; else if( e == 110 ) { z100_0(dg) ; } else if( e == 200 ) dg->y31 = 3 ; break ; case 3: if( e == 81 ) dg->y31 = 4 ; else if( e == 110 ) { z100_2(dg) ; } ; break ; case 4: if( e == 0 ) break ; }; }; dg->y31 = 0 ;


50 2.8. Обработчики событий В качестве примера приведем несколько обработчиков событий, вызывающих автоматы. int e30( void *data, pid_t pid, void *msg, size_t msg_size ) { valve_t *v = (valve_t*)data ; dg_t *dg = (char*)v > (char*)&dgs[DG2] ? &dgs[DG2] : &dgs[DG1] ; A10( 30, dg, v ) ; return Pt_END ; }; int e61( void *data, pid_t pid, void *msg, size_t msg_size ) { dg_t *dg = (dg_t*)data ; A20( 61, dg ) ; return Pt_CONTINUE ; }; 2.9. Входные переменные В качестве примера приведем реализацию нескольких входных переменных. int x10( dg_t * dg ) { return dg->air_valve.y == 1 ; }; int x20( dg_t * dg ) { return dg->low_air_valve.y == 1 ; }; 2.10. Выходные воздействия В качестве примера приведем реализацию нескольких выходных воздействий. void z10_0( dg_t *dg, valve_t *v ) { disarm_timer( v->timer_id ) ; v->timer_id = -1 ; }; void z10_1( dg_t *dg, valve_t *v ) { v->timer_id = arm_timer( v->timeout, 0, 0, 0, e30, v ) ; }; void z80( dg_t *dg ) { set_freq( dg, 10 ) ; }; 2.11. Вспомогательные модули В качестве примера приведем событий. модуль, реализующий очередь #include "photon_stuff.h" #include "dg.h" #include "events_queue.h" enum { QUEUE_SIZE = 1000 } ; // Максимальный размер очереди.