Счетчик является дискретным устройством, его состояние изменяется в дискретные моменты времени. Поэтому для построения модели счетчика более естественно использовать средства, существующие в AnyLogic для разработки дискретно-событийных систем (события, порты, сообщения). В следующей главе модель такого же счетчика с использованием этих
средств будет подробно проанализирована, а здесь мы рассмотрим самую простую, хотя и не очень естественную его модель, построенную только с использованием непрерывных переменных и статического таймера — основного средства в AnyLogic для порождения событий.
Рассматриваемые вопросы
В результате построения модели счетчика будет рассмотрено несколько новых вопросов.
- Создание нового класса активного объекта. - Статический таймер. - Иерархическая структура модели.
- Входные и выходные переменные компонентов структуры. - Связи компонентов по переменным.
- Включение анимированных графических образов экземпляров активных объектов в анимацию включающего их активного объекта.
Постановка проблемы
Нужно построить модель трехразрядного десятичного счетчика, работающе-го от генератора "тиков". На рис. 5.15 представлен счетчик, насчитавший 278 импульсов от генератора.
Модель
Для реализации имитационной модели нужно построить генератор "тиков", работающий с заданной частотой, и три одинаковых десятичных разряда счетчика. Следовательно, модель должна содержать три класса активных объектов: генератор "тиков", разряд счетчика по модулю 10 и, кроме того, корневой активный объект, который будет включать в себя один экземпляр генератора и три одинаковых экземпляра одноразрядного счетчика, связанные подходящим образом.
Создайте новый проект под названием continuous counter. Корневой объект назовите Model. Модель будет состоять из нескольких подсистем, связанных между собой по переменным.
Генератор тиков
Постройте новый активный объект Gen. Для этого в дереве классов проекта щелкните правой кнопкой мыши по имени проекта counter и в появившемся контекстном меню выберите команду Новый класс активного объекта
(или щелкните мышью на кнопке панели инструментов). Назовите но-
вый активный объект Gen.
В появившемся окне структуры этого активного объекта слева на границе прямоугольника, ограничивающего объект Gen, расположите выходную переменную а (рис. 5.16).
Для создания а перенесите переменную с панели инструментов на ле-
вую границу прямоугольника и в появившемся окне свойств новой переменной определите ее в поле Направление как выходную с именем а, задав ее тип integer и значение по умолчанию 0. Далее, введите в качестве параметра активного объекта Gen вещественную переменную frequency со значением по умолчанию 2.
Переменная а должна возрастать на 1 с некоторой заданной частотой frequency (отражая число "тиков" генератора). Чтобы это сделать, в активный объект Gen введите статический таймер, у которого установите циклическое повторение срабатывания через каждые l/frequency единиц времени. Для этого перенесите иконку таймера с панели инструментов внутрь прямоугольника, ограничивающего активный объект Gen, и в появившемся окне свойств таймера установите, что этот таймер циклический, срабатывающий каждые l/frequency единиц модельного времени и при каждом срабатывании выполняющий действие а++, т. е. увеличение на 1 пе-
ременной а (рис. 5.16). Таким образом, например, если таймер проработал 278 раз, то выходная переменная а генератора будет иметь значение 278.
Проверьте синтаксическую правильность модели (щелкнув на кнопке панели инструментов). Ваша модель должна соответствовать модели continuousCounter1 в папке Model Examples\Part II.
Разряд счетчика
Введите еще один класс активного объекта в проект. Этот класс будет моделировать разряд десятичного счетчика. Он будет иметь три целые переменные: выходную а, входную b и внутреннюю я, в которой будет храниться значение данного разряда (рис. 5.17).
Пусть выходная переменная а принимает значение числа десятков входной величины b, а переменная п принимает значение числа единиц b, т. е. a = b /10, п = b — a *10 (заметьте, что делится целое число). Тогда, например, если на входе разряда счетчика переменная b имеет значение 278, то переменная а примет значение 27, а переменная п — значение 8. Если же b — 27, то а примет значение 2, а п — значение 7. Понятно, что последовательное сосединение таких одноразрядных счетчиков позволит отобразить во внутренних переменных п этих объектов последовательные десятичные разряды целого числа, поступившего на вход младшего разряда.
В соответствии с этими рассуждениями определим Вид переменных а и п в окне свойств этих переменных как Формула, установив в поле выра-
жение b/10 а в поле выражение a-b*10.
Корневой объект
Структура корневого объекта Model очевидна. Он содержит один экземпляр акгивного объекта Gen и три экземпляра счетчиков, соединенных по соот-ветствующим переменным.
Для введения экземпляра генератора в корневой объект, откройте окно редактора объекта Model и методом drag-and-drop перетащите в поле редактора один экземпляр генератора (нажав левую клавишу мыши на имени Gen) и три экземпляра счетчика. Экземпляры активных объектов получают имена по умолчанию и изображаются так, как показано на рис. 5.18 (эти имена и изображения экземпляров активных объектов можно менять).
Расположение интерфейсных переменных на изображении экземпляра объекта совпадает с их расположением на изображении класса. Следовательно, выходная переменная а у всех экземпляров объекта counter находится слева, входная переменная b — справа. Для связи экземпляров объектов, помещенных в поле редактора структуры объекта Model, щелкните на изображении одной из соединяемых интерфейсных переменных и, не отпуская клавишу мыши, протащите ее ко второй соединяемой переменной. Переменные окажутся связанными прямой линией. Семантика такой связи проста: входная интерфейсная переменная будет принимать значение соединенной с ней выходной интерфейсной переменной.
Запустите модель. В окне корневого объекта модели можно наблюдать изменение во времени значений всех переменных (рис. 5.19).
Если щелкнуть в окне редактора по изображению любого из включенных экземпляров активного объекта, то откроется окно структуры этого активного объекта. Например, щелкните по изображению counter1. Откроется окно редактора, показывающее структуру активного объекта counter.
Для наблюдения изменения переменных введите графики, на которые поместите значения counter.n, counter1.n и counter2.n. Сравните свою модель С МОДеЛЬЮ ContinuousCounter2.
Анимация модели
Анимация счетчика построена из анимированных графических образов разрядов и образа генератора. Эти графические образы должны быть определе-ны в окнах анимации соответствующих активных объектов. Графический образ каждого экземпляра активного объекта автоматически включается в окно анимации содержащего его активного объекта.
Анимация генератора
Графический образ объекта Gen представим прямоугольником, содержащим
изображение импульса (см. рис. 5.15). Щелкнув правой кнопкой по имени
Gen в дереве проекта, откройте контекстное меню и в нем выберите команду
Новая анимация. В открывшемся окне анимации нарисуйте прямоугольник
50x40, левым верхним углом помещенный в начало координат. Залейте его
каким-нибудь цветом, а также выберите цвет для линии границы. Ширину
линии можно сделать равной 2. Используя кнопку ломаной на панели
инструментов, нарисуйте в поле прямоугольника импульс в соответствии
с рис. 5.15. Одинарный щелчок мыши при рисовании ломаной порождает
очередную точку, двойной щелчок мыши заканчивает рисование.
Видимое поле анимации объекта Gen, ограниченное штриховой линией,
лучше сделать точно по границам прямоугольника.
Анимация разряда счетчика
Разряд счетчика представим прямоугольником, содержащим значение состояния разряда (оно хранится в переменной п). Создайте новую анимацию для объекта counter и в окне этой анимации нарисуйте прямоугольник 40x60, также левым верхним углом помещенный в начало координат. Залейте его каким-нибудь цветом, а также выберите цвет для линии границы. Внутрь прямоугольника нужно вставить цифру, т. е. текстовый символ. Поместите
туда текст (кнопка ) со статическим значением 0. Выберите характеристики текста: шрифт Arial, стиль Bold, размер 28, цвет зеленый. В поле динамического значения этого текста поместите имя переменной п, значение которой требуется отображать. Штриховую линию, ограничивающую видимое поле анимации, уменьшите точно по границам прямоугольника.