События
Вторым по значимости элементом диаграмм машин состояний является событие. Если состояния обозначают режимы работы дрона, то события связаны со сменой режимов работы. Отсюда название данного подхода программирования — событийное
Методист образовательных программ «Программирование киберфизических систем»
Анита Ходова
Что такое событие?
Событие — это изменение в системе и окружающем ее мире, значимое для программы управления. События задают динамику программы и позволяют отразить в программе сложное поведение автономной системы в заранее неизвестном окружении
Рассмотрим уже знакомый нам пример модифицированной программы «Степлера» из модуля 3. В диаграмме ПРИМС состояния связаны стрелками переходов. На каждом таком переходе указывается событие, в данном случае обозначаемое двумя пиктограммами в желтой рамке. События имеют имена, часто сформулированные как совершенное действие, например «цель потеряна», «таймер истек», «дверца открыта» и т. д. Направление стрелки показывает изменение состояния при возникновении данного события.
Такие события называют внешними. Это события, которые приводят к смене состояния в машине состояний. При обнаружении цели модулем «Сканер» дрон переходит из состояния «Скан» в состояние «Бой:Сближение».
Из одного состояния не могут выходить два одинаковых перехода с одним и тем же событием, иначе машина состояний окажется в неопределенном состоянии. События могут иметь ограждающие условия срабатывания, они указываются в квадратных скобках после символа события и будут рассмотрены далее.
программист
Иван Кнут
Существует другой тип событий — внутренние события. Они позволяют реактивно выполнять действия без смены текущего состояния.
Представьте, что вы едете на велосипеде. По ходу движения приходится непрерывно корректировать положение и курс: отклоняться вправо и влево, удерживая равновесие. Можно было бы сделать дочерние состояния и переключаться между ними, но намного лаконичнее реализовать это поведение без смены состояний в виде внутренних событий и их обработки. Так можно использовать одно состояние «Удержание равновесия» для описания сложного поведения.

Внутренние события обозначаются на диаграмме внутри прямоугольника состояния, рядом с действиями входа и выхода (подробнее мы рассмотрим их в следующем модуле). В текстовом варианте диаграммы внутренние события обозначаются именем и символом косой черты (/). В «Защите пасеки» внутренние события также обозначаются пиктограммами в желтой рамочке
Диаграмма машины состояний описывает все события, на которые может реагировать программа, но срабатывают только те события, которые относятся к текущему состоянию. Для внешних событий — это те, что находятся на переходах из текущего состояния; для внутренних событий — это события, описанные внутри текущего состояния. Обратите внимание, что события срабатывают также для всех родительских состояний текущего состояния.
Задача
Хороший пример работы с событиями — задача об измерении игрового поля игры «Защита пасеки». Запрограммированный дрон может двигаться только в рамках доступного виртуального поля игры. Каковы его размеры?
Выясните точную длину поля, используя дрон в качестве измерительного инструмента
Задача
Чтобы решить задачу, можно открыть специальный уровень для тренировок «Полигон» и составить программу дрона, которая будет опираться на события модуля «Навигация», отвечающего за движение дрона:
  • «Навигация.ДвижениеЗавершено», которое возникает, когда движение по последней отданной команде успешно завершилось
  • «Навигация.ВстречаСПрепятствием», которое возникает, если в ходе выполнения движения произошло столкновение с препятствием
В этой задаче можно использовать самый простой способ движения — по координатам. Для этого нужно использовать команду того же модуля «Навигация.ДвигатьсяПоКоординатам ()», а перед ее запуском сбросить координаты командой «Навигация.СбросКоординат ()» и установить требуемые относительные координаты с помощью серии команд «Навигация.ЗадатьКоординату…(координата)».
Если связать включение диода соответствующего цвета с переходом по событиям модуля «Навигация», можно получить дрона-измерителя, который исследует поле игры и определит его размеры.
Модуль «Таймер»
Напишите такую программу для «Автобортника», чтобы он активировал свою специальную способность автоматически, когда его целостность составит менее 50%
Задача
В реальных системах, а также у дронов в «Защите пасеки» существует удобный инструмент генерации как внешних, так и внутренних событий — таймер. Таймер хорошо знаком любому пользователю электронных часов или умной колонки и позволяет сгенерировать событие через заданное время. Таймер может использоваться однократно («Поставить таймер на 5 минут» или «Выключи духовку через 10 минут») или регулярно («Капать раствор в пробирку каждый час»).
В «Защите пасеки» есть три варианта использования таймера, реализованные в модуле «Таймер»:
  • Явный запуск таймера с помощью команды «Таймер.Пуск (интервал)» с заданным интервалом в секундах. Событие таймера «Таймер.Истек» произойдет, когда установленное время пройдет. Это событие можно обрабатывать как внешнее на переходе, так и внутреннее, не приводящее к смене состояния. Если событие нужно повторить, таймер придется еще раз запустить явно
  • Постоянно генерируемое таймером событие «Таймер.Тик1Секунда», которое срабатывает каждую секунду, может обрабатываться или игнорироваться
  • Аналогичное генерируемое событие «Таймер.Тик», которое срабатывает 5 раз в секунду, каждые 200 мс. Это событие можно использовать для ситуаций, требующих быстрой, почти мгновенной реакций
Таймер может быть хорошим инструментом решения тактических задач в игре. В прошлом модуле мы сталкивались с недостатками модифицированной программы «Степлера». Например, если противники загоняют дрон в угол, выбраться оттуда ему будет непросто. Одна из причин в том, что разработанная нами программа не контролирует расстояние до цели, поэтому дрон может отступить слишком далеко.
Используя события таймера, можно реализовать более совершенную программу «Степлера», который будет удерживать дистанцию до цели. Для этого можно добавить в состояние
«Бой»
в котором дрон будет отступать от цели.
должно оставаться в назначенных пределах
с ограждающими условиями, в которых проверяется дистанция до цели:
можно реализовать по событию
еще одно дочернее состояние
Переходы между состояниями
«Дистанция»,
«АнализаторЦели.ДистанцияДо»
«Таймер.Тик»
«Атака» и «Дистанция»
Программист
Софья Дрёмова
На этом примере видно, что ограждающие условия позволяют игнорировать события, если условие не выполняется. В диаграммах машин состояний ограждающие условия удобно комбинировать с регулярными событиями таймера, чтобы совершать действия в связи с достижением порогового значения какого-то параметра дрона (дистанции до цели, целостности дрона, пройденного расстояния и т. п.)
Комментарий для педагога
В этом модуле мы познакомились со вторым фундаментальным элементом машин состояний — событием. Это позволяет создавать полноценные диаграммы машин состояний. Но программирование машин состояний отличается от привычного императивного программирования, представленного в блочном программировании и многих текстовых языках программирования. Очень важно увидеть эту разницу. Обозначим ключевые различия в таблице:
Императивный подход
Событийный подход
Логика программирования
Последовательное выполнение команд
Выполнение команд при смене состояний или возникновении событий
Исполнение
Непрерывно исполняется
Большую часть времени ожидает событий
Метафора
Конвейер
Лифт
Графическое обозначение программы
Блок-схема
Диаграмма машины состояний
Где используется
Блочное программирование (Scratch).
Языки программирования: Ассемблер, C, Pascal, Python и др.
Машины состояний.
Библиотеки автономного управления, графических интерфейсов, сетевого обмена и др.
Императивный подход (от англ. imperative — «приказ») подразумевает программирование через строгую последовательность команд: компьютер или автономная система будут делать только то, что предписывает исполняемая программа. Событийное программирование, наоборот, описывает только те ситуации, в которых происходят изменения в системе и в которых требуется реакция. Поэтому императивный подход хорош для программ, которые реализуют конкретные известные шаги, а событийный — при управлении автономными системами в слабо определенном окружении, например в ситуации взаимодействия с человеком или другими автономными системами.
Хорошей метафорой для императивного программирования является конвейер на заводе. Конвейер работает в строго определенной логике, последовательно обрабатывая детали и собирая конечный продукт. Событийное программирование лучше представить в виде лифта, работа которого ограничена заданными правилами, но в конечном счете будет определяться поведем пользователей, которые им управляют.
Различие подходов видно при сравнении блок-схем и диаграмм машин состояний. На первый взгляд эти схемы похожи и состоят из одних и тех же элементов, но эти формы описания программ противоположны по смыслу. Рассмотрим диаграмму машины состояний управления теплицей и соответствующую ей блок-схему.
Действия в блок-схеме описаны последовательно, для управления логикой используются условия, задающие ветвления, и циклы, задающие повторы исполнения. Логика программы задается самой последовательностью команд. Переходы в блок-схеме не несут самостоятельного смысла, они нужны только для обозначения последовательности блоков команд. Сами блоки не именуются, важно только их содержание. Блок-схема всегда находится в состоянии исполнения, вам нужно непрерывно следовать по ее блокам и переходам.
В машине состояний действия происходят при возникновении событий (на переходах или при входе или выходе из состояний), логика программы задается событиями, а переходы не менее осмыслены, чем состояния. Именование состояний и их иерархия позволяют задать более сложную логику работы программы. При этом большую часть времени машина состояний бездействует, ожидая событий, требующих обработки
Императивное программирование и блок-схемы хорошо подходят для тривиальных программ с простой логикой исполнения. При программировании любой достаточно сложной системы блок-схемы, не имеющие иерархии, разрастаются и становятся неудобными в использовании. Машины состояний и событийное программирование — лаконичные способы описания сложных систем.
Методист образовательных программ «Программирование киберфизических систем»
Анита Ходова
Императивное программирование получило широкое распространение вместе с текстовыми языками программирования. Со временем императивное программирование было дополнено функциональным, объектно-ориентированным, событийным программированием и другими подходами. Современные универсальные языки программирования вроде C++ или Python позволяют реализовывать любой из подходов. Событийное программирование часто используется при создании сложных программ: встраиваемых систем и электроники, графических интерфейсов, серверных приложений, реализующих сетевые протоколы, автономных систем.
Событийный подход является хорошим выбором при обучении программированию, поскольку позволяет более четко увидеть, что такое программирование как часть управления, а также какую роль в программировании играет выбор модели. Одновременно с этим вы осваиваете подход и технологию, используемые при создании действительно сложных программ.

Запишитесь на курс, чтобы выполнять задания и получить сертификат!

Программирование автономных систем на примере игры «Берлога: Защита пасеки»
Курс о том, как с помощью простых инструментов научиться программировать поведение автономных агентов. Вы увидите, как игровые дроны подчиняются коду и как эти же принципы применимы к роботам в реальной жизни.
  • Что вы получите
    • 12 уроков с разбором заданий прямо в игре
    • Авторская подача: сложное программирование простым языком
    • Возможность осмыслить педагогические методики, применяемые в каждой теме
    • Свободное расписание: нет дедлайнов и сроков сдачи заданий
    • Все материалы доступны сразу, можно начать обучение в удобное время
    • Проверочные задания после каждого урока
    • Профессиональное видео и современная графика
    • Быстрая связь с техподдержкой
    • Сертификат о прохождении курса
  • Зачем
    • Научиться и научить программировать через игру
    • Освоить язык ПРИМС — инструмент для создания умных и понятных алгоритмов
    • Разобраться, как работают современные киберфизические системы
    • Научиться строить управление: от простых реакций до сложных сценариев поведения
    • Получить готовую методику проведения занятий: с пояснениями, примерами и игровыми задачами
    • Сделать первый шаг к проектной работе с настоящими роботами и автономными системами
Находясь на сайте, вы даете согласие на обработку файлов cookie. Это необходимо для более стабильной работы сайта
OK