Лабораторная работа № 4
«Создание дискретно-событийной модели счетчика»
Цель работы: Отработать создание нового класса активного объекта, добавление событий,
изучить значки активного объекта, порты и сообщения, рассмотреть действия при
получении сообщений.
Шаг 1. Построение новой модели
1.1 Создайте
в своей рабочей директории новый проект под названием DCounter. Корневой объект переименуйте, назвав Model.
Модель будет состоять из нескольких подсистем,
связанных между собой. Генератор посылает сигналы с определенной частотой
разряду счетчика. Для этого предназначен специальный пакет данных – сообщение.
Сообщения принимаются и посылаются через специальные элементы активных объектов
– порты.
Шаг 2. Создание генератора тиков
2.1
Постройте новый активный объект Gen. Для этого в панели Проекты щелкните правой
кнопкой мыши по имени проекта DCounter и в появившемся контекстном меню
выберите команду Создать š Класс активного объекта. Измените
значение поля Имя на Gen и нажмите кнопку Готово, новый класс
должен появится на панели Проект, как показано на рисунке 50.
Рисунок 50 –
Новый активный объект Gen
2.2 Класс активного объекта Gen должен посылать сообщения первому разряду
счетчика с заданной частотой. Для генерации таких сообщений создадим Событие, для этого перетащите элемент Событие из палитры Основная на
диаграмму класса активного объекта Gen.
В окне свойств этого события нужно оставить Тип события По таймауту без изменений, а Режим установить Циклический.
Циклический режим события позволяет пользователю выполнять некоторые
действия с требуемой периодичностью, например, каждое утро или ежегодно. Период
срабатывания обратно-пропорционален частоте, поэтому в поле Период запишите 1/frequency, как представлено на рисунке 51.
Рисунок 51 –
Свойства объекта Событие
2.3 В нашей модели frequency
– это частота следования импульсов генератора, ее нужно объявить как Параметр модели.
Необходимо создать в классе Gen параметр frequency со значением по умолчанию равным 2, что видно на рисунке
52.
Рисунок 52 –
Добавление параметра frequency
Шаг 3. Презентация генератора
3.1 Внешний вид генератора, а точнее объекта Gen представим прямоугольником, содержащим изображение импульса.
Откройте палитру Презентация и перетащите на диаграмму класса Gen прямоугольник, ширина
прямоугольника – 80 единиц, а высота – 100. Залейте его желтым цветом, цвет
линии границы сделайте красным, а толщину линии равной 1.
3.2 Чтобы нарисовать изображение
импульса используйте элемент Ломаная
в окне Палитра на вкладке Презентация, рисуя ломаную точка за
точкой, последовательно щелкая мышью в тех
точках диаграммы, куда Вы хотите поместить вершины ломаной. Чтобы
завершить рисование, добавьте последнюю точку ломаной двойным щелчком мыши.
Нарисуйте в поле прямоугольника импульс в соответствии с приведенным примером
на рисунке 53.
Рисунок 53 –
Изображение импульса
3.3 Для того
чтобы вложенные объекты – экземпляры класса (Gen) отображались на структурной диаграмме верхнего уровня (Model) в
графическом виде и имели интерфейсные элементы – порты, нужно нарисовать для
вложенного объекта значок. Для этого нужно выделить последовательно каждую из
фигур Прямоугольник и Ломаная и на вкладке Основные панели
Свойства установите флажок Значок, как показано на рисунке 54.
Вокруг прямоугольника появится пунктирная линия и надпись Значок.
Рисунок 54 –
Значок для вложенного объекта
3.4
Центральную роль в механизме передачи сообщений играют порты. С их помощью
посылаются и получаются сообщения. Перетащите элемент Порт из палитры Основная
на диаграмму класса Gen, поместите его на левую сторону желтого
прямоугольника и назовите этот порт tick,
через этот порт наш экземпляр класса активного объекта Gen может посылать и
принимать сообщения от других активных объектов, как на рисунке 55.
Рисунок 55 –
Добавление объекта Порт
Шаг 4. Генерация импульсов и разряд
счетчика
4.1
Генератор нашей модели должен периодически с периодом 1/frequency посылать сообщения через порт tick. Ранее мы создали событие event,
циклически срабатывающее с частотой frequency.
При каждом срабатывании генератор должен выполнить действие - послать новое
сообщение типа Object через выходной порт с именем tick. Для этого введите в поле Действие окна свойств События следующее: tick.send ( new Object( ) );, что можно увидеть на рисунке 56.
Рисунок 56 –
Свойства объекта Событие
4.2 Введите еще один класс активного объекта в проект
– Counter. Этот класс будет моделировать разряд десятичного
счетчика. Он должен иметь одну целую переменную, Параметр – n, в которой будет
храниться значение данного разряда, и два порта: tick и overflow.
4.3 Создайте объект Параметр -
n в классе Counter с начальным
значением = 0.
4.4 Разряд счетчика представим в виде прямоугольника с цифрой разряда внутри. На диаграмме класса Counter
нарисуйте прямоугольник 60х100. Залейте его и линию рамки черным цветом. Внутрь
прямоугольника вставьте цифру в виде текстового символа. Для этого поместите на
прямоугольник текст (кнопка на палитре Презентация) со значением 0 в
поле Текст, вкладки Основные, свойств вставленного текста.
Установите параметры текста: шрифт SansSerif, размер 72, цвет желтый. Во
вкладку Динамические в поле Текст поместите имя переменной n, значение которой требуется
отображать. Отметьте галочкой выбор Значок в свойствах текста и
свойствах черного прямоугольника, как представлено на рисунке 57.
Рисунок 56
–Презентация разряда счетчика
Шаг 5. Счет импульсов
5.1 Создайте
два порта: tick и overflow и поместите их на диаграмму
класса Counter, каждый раз, когда приходит сообщение в порт tick, параметр n должен увеличиваться на единицу по модулю 10 с извещением по
порту overflow о переполнении, если
оно наступило. Это значит, что разряд счетчика увеличивает значение своего
параметра n на 1 при приеме каждого
сообщения, пришедшего через порт tick,
кроме случая, когда n равно 9. В
этом случае параметр n должен
принять значение 0, а через выходной порт overflow
будет послано сообщение. Именно это следует записать в поле Действие при получении в свойствах
порта tick:
if (n!=9) {
n++;}
else {
n = 0;
overflow.send(msg);}
Пример представлен на рисунке 57.
Рисунок 57
–Изменение поля Действие при получении
Таким
образом, через порт overflow, будет
передаваться каждое десятое сообщение, полученное в порт tick.
Шаг 6. Структура корневого объекта
Model
Перейдем к
работе с корневым объектом Model,
который должен содержать один экземпляр активного объекта Gen и три экземпляра разряда счетчика Counter, соединенных по соответствующим
портам.
6.1 Для создания экземпляра генератора в корневом объекте,
откройте диаграмму класса активного объекта Model и перетащите на нее один экземпляр генератора (левой кнопкой
мыши на имени Gen), а затем и три
экземпляра счетчика – Counter,
экземпляры активных объектов получат имена по умолчанию и будут выглядеть,как
на примере, на рисунке 58.
Рисунок 58
–Добавление вложенных объектов в Model
6.2 Чтобы
установить взаимодействие между объектами, Вам нужно соединить порты этих
объектов с помощью соединителей. Соединитель
- это линия, соединяющая два порта. Сделайте двойной щелчок мышью по одному из
портов, последовательно щелкните в тех местах диаграммы, где Вы хотите
поместить точки изгиба соединителя (для нашей модели не обязательно), завершите
процесс соединения, сделав двойной щелчок мышью по второму порту, соединенные
объекты выглядят, как на рисунке 59.
Рисунок 59
–Соединение имеющихся объектов через порты
6.3
Запустите модель. Вы увидите изменение во времени разрядов счетчика,
что видно из примера на рисунке 60.
Рисунок 60
–Запущенная модель счетчика
Шаг 7. Презентация корневого объекта
Для придания
созданной модели законченного вида следует добавить элементы описания и
интерактивности.
7.1
Поместите в модель описание и слайдер, регулирующий частоту генератора, как
показано на рисунке 61.
Рисунок 61
–Законченная модель с описанием и регулятором частоты
7.2
Продемонстрируйте модель преподавателю.