Редактирование карты поведения.
В общем случае карта поведения представляет собой граф, узлы которого соответствуют качественным состояниям моделируемой системы, а дуги – переходам из одного состояния в другое (Рис 5.5). Узлам – состояниям соответствуют определенные поведения :
- пустое поведение, при котором значения переменных не изменяются, соответствующий узел изображается тонкой линией (на Рис 5.5 это узел Node_2):
- непрерывное поведение, заданное системой уравнений, соответствующий узел изображается жирной линией (на Рис 5.5 это Node_3);
- дискретное или гибридное поведение, заданное другой картой поведения, соответствующий узел изображается двойной тонкой линией (на Рис 5.5 это Node_1).
Переходы изображаются ломаной линией со стрелкой, указывающей направление перехода. Переход, у которого отсутствует начальный или конечный узел (или оба узла), является незавершенным. Незавершенные переходы изображаются пунктирными линиями и отсутствуют в выполняемой модели. Один из переходов является начальным (вместо исходного узла изображается жирная точка). Он срабатывает сразу при инициализации экземпляра карты поведения и таким образом указывает на начальный узел карты состояний (на Рис 5.5 это узел Node_2).
Кроме того, в окне карт поведения изображаются:
- имена узлов. Если из рисунка не очевидно, какое имя у данного узла, необходимо выделить этот узел и нажать кнопку на левой инструментальной панели. Перейти в режим редактирования имени можно двойным щелчком мыши на его изображении или с помощью команды «Редактировать/Редактировать как текст(F2)» главного меню;
- сноски, указывающие на приписанные поведения, входные и выходные действия в узле, условия и действия перехода. Сноски могут не изображаться (в случае перенасыщенности графа) при сбросе переключателя «Показывать сноски на картах состояния» на страничке «Вид» диалога «Настройки интегрированной среды», который можно открыть по команде «Сервис/Настройки» главного меню.
Рис 5.5
Один из элементов карты поведения может быть выделен нажатием левой кнопки мыши на изображении этого элемента. Выделение изображается прямоугольниками на месте опорных точек (на Рис 5.5 выделен переход из Node_2 в Node_3) либо цветом (для имен узлов). Выделенный элемент можно перемещать либо с помощью мыши с прижатой левой кнопкой, либо с помощью клавиш перемещения курсора.
Нажатием левой кнопки мыши при прижатой клавише «Shift» можно выделить группу элементов. Группу элементов можно переместить с помощью мыши с прижатой левой кнопкой, либо использовать для выравнивания с помощью команды «Редактировать/Выровнять» главного меню.
Любое изменение в карте поведения может быть отменено с помощью кнопки на панели кнопок главного окна или команды «Редактировать/Отменить изменения (Alt+Backspace)» главного меню. Количество отменяемых изменений задается в настройках интегрированной среды на странице «Основные» (команда «Сервис/Настройки» главного меню).
Окно редактора карты поведения имеет две панели кнопок: левую и верхнюю. Левая панель содержит кнопки с фиксацией, связанные с различными режимами работы графического редактора карты поведения (Рис 5.6). Стандартным является режим выделения, переходом в этот режим как правило заканчиваются все операции.
Рис 5.6
Верхняя панель содержит кнопки, связанные с редактированием свойств выделенного элемента или карты поведения в целом:
- кнопка предназначена для перехода в диалог редактирования имени карты поведения;
- кнопка предназначена для перехода в диалог редактирования пояснительного текста для карты поведения;
- кнопка предназначена для редактирования локальных переменных, функций и процедур карты поведения ;
- кнопка предназначена для перехода в диалог редактирования условия срабатывания выделенного перехода;
- кнопка предназначена для перехода в диалог редактирования последовательности мгновенных действий в выделенном переходе;
- кнопка предназначена для перехода в диалог редактирования последовательности входных действий выделенного узла;
- кнопка предназначена для перехода в диалог редактирования последовательности выходных действий выделенного узла;
- кнопка предназначена для перехода в окно редактирования поведения, приписанного выделенному узлу:
- кнопка предназначена для приписывания выделенному узлу пустого поведения.
Редактирование узлов.
Чтобы создать новый узел нужно:
- с помощью кнопки или команды «Создать новый узел» всплывающего меню перевести редактор в режим создания нового узла (признаком этого режима служит появление крестообразного курсора мыши);
- поставить крестообразный курсор в место, где должен располагаться левый верхний угол нового узла, нажать левую кнопку мыши и, не отпуская ее, перемещать мышь вправо и вниз. Вместе с мышью изменяется изображение узла. Положение курсора соответствует правому нижнему углу узла. В нужном положении следует отпустить кнопку мыши.
Новый узел будет по умолчанию иметь имя «Node_1, 2, …».
Если новый узел был первым в карте поведения, то ему будет автоматически сопоставлен начальный переход, то есть первый узел по умолчанию считается начальным. В дальнейшем вы можете сделать начальным другой узел, переместив начальный переход так, чтобы его стрелка оказалась на изображении этого узла.
Чтобы удалить узел, выделите его и выполните либо команду «Удалить узел» всплывающего меню, либо команду «Редактировать/Удалить» главного меню.
Чтобы переместить узел, нажмите на его изображении левую кнопку мыши и, перемещая мышь с прижатой кнопкой, отбуксируйте в нужное место после чего отпустите кнопку. Для более точного перемещения выделенного узла в определенном направлении можно использовать клавиши перемещения курсора на клавиатуре или специальные кнопки в правой части панели кнопок главного окна. Кроме того, вы можете точно задать положение узла с помощью команды «Положение» всплывающего меню. Вместе с узлом автоматически перемещаются последние сегменты связанных с этим узлом переходов.
Чтобы изменить размер узла, выделите его, схватите мышью одну из опорных точек, показанных квадратами, и тащите ее до нужного положения.
Чтобы переместить имя узла перетащите его методом «drag-and-drop».
Чтобы изменить имя узла щелкните на нем дважды мышью или выделите его и выполните команду «Редактировать/Редактировать как текст» главного меню (функциональная клавиша F2). На месте имени появится однострочный текстовый редактор, в котором вы можете отредактировать имя узла. Чтобы отменить редактирование нажмите «Esc», чтобы завершить редактирование нажмите «Enter» или щелкните мышью за пределами редактора строки.
Чтобы поместить в узел уже существующее локальное поведение (систему уравнений или карту поведения), выделите соответствующее поведение в окне класса и методом «drag-and-drop» переместите на изображение узла.
Чтобы поместить в узел новое локальное поведение, выполните команду «Создать новую систему уравнений» или команду «Создать новую карту поведения» всплывающего меню
Чтобы удалить из узла приписанное ему локальное поведение, выделите узел и нажмите кнопку или выполните команду «Установить пустое локальное поведение» всплывающего меню.
Руководствуясь этими правилами, создадим в классе «Маятник» новую карту поведения «Карта_поведения_1», кликнув дважды мышью на ее названии, перейдем в окно редактора карт поведения, введем в ней три новых узла и заменим их имена на «Колебания», «Свободный_полет» и «Останов» (Рис 5.7).
Рис 5.7
С целью улучшения внешнего вида карты состояния выделим все три узла как группу (напомним, это делается левой кнопкой мыши при прижатой клавише «Shift») и выполним команду «Редактировать/Выровнять» главного меню. В появившемся диалоге (Рис 5.8) выберем выравнивание по верхним сторонам. Нажмем «OK» и выполним эту же команду снова, выбрав на этот раз выравнивание по ширине и высоте. В результате мы получим три совершенно одинаковых по размерам узла, расположенные на одной горизонтальной линии.
Напомним, что любое изменение в карте поведения может быть отменено с помощью кнопки на панели кнопок главного окна или команды «Редактировать/Отменить изменения (Alt+Backspace)» главного меню.
Рис 5.8
Все созданные узлы карты поведения по умолчанию содержат пустые локальные поведения, то есть при нахождении модели в этом состоянии в ней ничего не будет меняться.. «Система_уравнений_1», описывающая колебания маятника, уже существует в классе «Маятник» и мы просто методом «drag-and-drop» перетащим ее из окна класса на узел «Колебания». Систему уравнений, описывающую свободный полет («Система_уравнений_3»), необходимо создать (Рис 5.9), а затем присвоить узлу «Свободный_полет». Для этой системы уравнений нам понадобятся еще две переменные:
Vx: double := 0;
Vy: double := 0;
Рис 5.9
Узел «Останов» должен содержать в своих входных действиях вызов предопределенной процедуры «Stop». Выделим этот узел и затем с помощью кнопки или команды «Входные действия в узле» всплывающего меню перейдем в окно редактирования последовательности входных действий (Рис 5.10).
Рис 5.10
Последовательность мгновенных действий (входных действий в узле, выходных действий в узле или действий в переходе) – это последовательность алгоритмических операторов, заданная в текстовой форме. Набор допустимых алгоритмических операторов (небольшое подмножество языка программирования ADA) описан в разделе «Входной язык/Алгоритмические операторы» справочной системы. В данном случае последовательность включает один единственный оператор – обращение к процедуре.
Теперь можно переходить к созданию переходов.
Редактирование переходов.
Чтобы создать завершенный переход, нужно:
- с помощью кнопки или команды «Создать новый переход» всплывающего меню перевести редактор в режим создания нового перехода (признаком этого режима служит появление крестообразного курсора мыши);
- подвести курсор мыши на изображение исходного узла (например, «Колебания»). Курсор при этом сменится на изображение креста в круге. Затем нажать левую кнопку мыши и, не отпуская ее, переместить мышь на изображение конечного узла (например, «Свободный_полет»). Когда курсор при этом сменится на изображение креста в круге, отпустить кнопку. Исходный и конечный узел может быть один и тот же.
Получаем переход из узла «Колебания» в узел «Свободный_полет» Точно таким же образом создаем переход из узла «Свободный_полет» в узел «Останов» (Рис 5.11).
Рис 5.11
Чтобы изменить линию перехода, нужно выделить переход, нажать левую кнопку мыши на квадрате, изображающем одну из опорных точек (не крайних), затем, не отпуская кнопки, перемещать мышь и в требуемом положении отпустить кнопку. Для точного указания координат опорных точек необходимо с помощью команды «Координаты точек» всплывающего меню вызвать диалог редактирования координат (на Рис 5.12 показан этот диалог применительно к выделенному переходу на Рис 5.5).
Замечание. Не забывайте, что в окнах MS Windows ось X направлена вправо, а ось Y вниз.
Рис 5.12
Чтобы изменить исходный или конечный узел перехода, нужно перетащить мышью соответствующую крайнюю опорную точку на изображение другого узла. В частности, если перетащить ее на свободное поле, можно сделать переход незавершенным.
Чтобы добавить новую опорную точку на линию перехода, нужно выделить переход и с помощью кнопки или команды «Добавить опорную точку» всплывающего меню перевести редактор в режим добавления опорной точки (признаком этого режима служит появление крестообразного курсора мыши). Затем следует подвести курсор к нужной точке линии перехода (курсор изменится на крест с квадратом в центре) и щелкнуть левой кнопкой маши.
Чтобы удалить опорную точку с линии перехода, нужно выделить переход и с помощью кнопки или команды «Удалить опорную точку» всплывающего меню перевести редактор в режим удаления опорной точки (признаком этого режима служит появление крестообразного курсора мыши). Затем следует подвести курсор к опорной точке, которую следует удалить (курсор изменится на изображение руки с вытянутым указательным пальцем) и щелкнуть левой кнопкой мыши.
Чтобы создать незавершенный переход, нужно в режиме создания нового перехода нажимать кнопку или отпускать кнопку вне изображения какого-либо узла, когда курсор имеет форму креста. Завершенный переход можно сделать незавершенным, если «оттащить» крайнюю точку линии перехода от изображения узла и бросить ее на свободном поле.
Замечание. Возникает вопрос: а зачем, собственно, нужны незавершенные переходы, если они все равно не попадают в выполняемую модель? Дело в том что, во-первых, незавершенными переходы могут становиться временно, когда либо уничтожается исходный или конечный узел, либо переход «отрывается» от своего исходного или конечного узла. Во-вторых, иногда бывает удобно использовать незавершенный переход как промежуточную форму в процессе редактирования. Например, переход из «Колебания» в «Свободный_полет» можно создать в три приема: сначала создать незавершенный переход (Рис 5.13а), затем, перетащив его начальную опорную точку на узел «Колебания», сделать его исходным (Рис 5.13б) и затем, перетащив последнюю опорную точку на узел «Свободный_полет», сделать этот узел конечным (Рис 5.13в).
а) б)
в)
Рис 5.13
Все введенные нами переходы по умолчанию являются безусловными, то есть они сработают немедленно, как только исходный узел станет текущим. Таким образом, работа модели, задаваемая картой поведения, показанной на Рис 5.11, начнется и закончится «в одно мгновение» во «временной щели» .
Чтобы этого не случилось, для переходов должны быть определены условия срабатывания. Выделим переход «Колебания» à «Свободный_полет» и с помощью кнопки или команды «Условие срабатывания перехода» всплывающего меню перейдем в диалог редактирования условия срабатывания (Рис 5.14), в котором введем необходимое условие (подробнее о переходах и условиях их срабатывания в разделе «Входной язык / Карта поведения» справочной системы). Предварительно добавим параметр
AlphaMax: double := pi/4;
Рис 5.14
Кроме условия в этом переходе имеются еще мгновенные действия, выполняемые при срабатывании перехода – расчет начальных значений составляющих скорости при отрыве маятника. Выделим переход и с помощью кнопки или команды «Действия перехода» всплывающего меню вызовем редактор последовательности действий (Рис 5.15). Заметим, что в любую последовательность мгновенных действий как и в систему уравнений могут быть вставлены необходимые комментарии.
Рис 5.15
Аналогичным образом введем условие срабатывания «when y<=Ymin» для перехода «Свободный_полет» à «Останов», добавив предварительно параметр
Ymin: double := -3;
Поместим теперь нашу карту состояния (Рис 5.3) в узел Init главной карты поведения (Рис 5.2) и наша модель готова.