Концептуальное проектирование систем в AnyLogic и GPSS World

Модель функционирования сети связи

Разбить на страницы
Показывать лекцию целиком

Модель в AnyLogic

Постановка задачи

В сети связи имеются $$n_1$$ абонентов, обменивающихся между собой сообщениями. Адресация сообщений организована посредством маршрутизаторов. На маршрутизатор поступают сообщения через случайные промежутки времени от $$n_1$$ абонентов со средними интервалами времени $$T_1, T_2, …, T_{n_{1}}$$.

Сообщения могут быть $$n_2$$ категорий с вероятностями их появления $$p_{k1}}, p_{k2}}, …, p_{kn_{2}}$$ $$(p_{k1}}, p_{k2}}, …, p_{kn_{2}} =1)$$ и вычислительными сложностями обработки $$S_1, S_2, …, S_{n_{2}}$$ операций соответственно.

Маршрутизатор имеет k входов и k выходов, входной буфер 1 ёмкостью $$L_1$$ байт для хранения сообщений, ожидающих обработки. В маршрутизаторе сообщения обрабатываются вычислительным комплексом (ВК) с производительностью Q операций/с. В случае полного заполнения буфера 1 поступающие на маршрутизатор сообщения теряются. Принято допущение, что одна операция вычислительной сложности соответствует одному байту при размещении сообщения в буфере.

После обработки сообщения в зависимости от направления передачи поступают в соответствующие буферы, стоящие на входах каждого i-го направления связи, $$i=\overline{1,k}$$. Каждый буфер имеет ёмкость $$L_{2i}$$ байт, $$i=\overline{1,k}$$. В случае полного заполнения буфера направления поступающее сообщение теряется.

Из буферов сообщения передаются по своим направлениям. Каждое направление имеет основной и резервный каналы связи. Скорость передачи сообщений по основному и резервному каналам связи каждого из направлений $$V_{пi}$$ бит/с, $$i=\overline{1,k}$$.

ВК и основные каналы связи имеют конечную надёжность. Интервалы времени $$Т_{отВК}$$ и $$Т_{отК_{1}}, Т_{отК_{2}}, …, Т_{отК_{n}}$$ между отказами ВК и каналов связи случайные. Длительности восстановления ВК и каналов связи $$Т_{вВК}$$ и $$Т_{вК_{1}}, Т_{вК_{2}}, …, Т_{вК_{n}}$$ также случайные.

При отказе обрабатываемые ВК и передаваемые по каналам связи сообщения теряются.

Исходные данные

$$n_1 = 6; k = 4;$$ $$exponential(T_1)=exponential(T_2)= … =exponential(T_6)=exponential(30);$$ $$n_2=4; p_{k1}=0,3; p_{k2}=0,2; p_{k3}=0,2; p_{k4}=0,3; $$ $$Q =40000\text{ оп/с}; L_1=5000000;$$ $$normal(S_1, S_{o1})=normal(53000, 6100);$$ $$…$$ $$normal(S_3, S_{o3})=normal(66000, 7000);$$ $$normal(S_4, S_{o4})=normal(50000, 500);$$ $$exponential(T_{отК_{1}})= … =exponential(T_{отК_{2}})= exponential(360);$$ $$exponential(T_{вК_{1}})= … =exponential(T_{вК_{2}})= exponential(3.2);$$ $$exponential(T_{отВК_{1}})=exponential(3600), exponential(T_{вВК}})=exponential(3.7);$$ $$V_{пi}=5000 \text{ бит/с}, n_{3i}=1, L_{2i}=250000, i=\overline{1,4}.$$

Задание на исследование

Разработать имитационную модель функционирования сети связи. Исследовать влияние ёмкостей буферов, интервалов времени поступления сообщений, их вычислительных сложностей и других параметров на показатели функционирования сети с целью их оценки и принятия решений при необходимости по улучшению качества обслуживания сети.

Формализованное описание модели

Сообщения поступают от $$n_1=6$$ источников. Интервалы поступления сообщений, интервалы между отказами и время восстановления работоспособности распределяются по экспоненциальному закону (exponential), а вычислительные сложности сообщений в зависимости от категорий - по нормальному закону (normal). Для некоторых одинаковых параметров с целью упрощения принято, что они имеют равные значения, например, средние значения интервалов поступления сообщений. Модель же будет построена в некотором приближении универсальной так, что все эти значения могут быть любыми.

Вариант сети связи при принятых исходных данных (в том числе количестве входов и выходов маршрутизатора) может быть представлен в следующем виде (рис. 4.1).

(рис 4.1) Вариант схемы сети связи

Сообщения абонентов А4 - на вход 2 маршрутизатора М1, абонента А5 - на вход 3 маршрутизатора М1, абонента А6 - на вход 4 маршрутизатора М1.

Маршрутизатор М1 настроен таким образом, что сообщения, адресованные абонентам А1 и А2 поступают на вход 1 маршрутизатора М2, а абонентам А3 и А4 - на вход 2 маршрутизатора М2.

Маршрутизатор М2 настроен так, что его выходы 1…4 подключены к каналам связи, по которым передаются сообщения, адресованные абонентам А1…А4 соответственно.

Видно, что система связи представляет собой многофазную многоканальную систему массового обслуживания замкнутого типа с ограниченными ёмкостями буферов (накопителей), то есть с отказами.

Теперь представим маршрутизатор также как систему массового обслуживания и в общем виде (рис. 4.2).

(рис 4.2) Маршрутизатор как система массового обслуживания

В маршрутизаторе выделены блок контроля 1, накопитель (буфер) ВК, непосредственно ВК, блок контроля 2, накопители направлений связи.

Назначение и функции выделенных в структуре сети связи и маршрутизаторе блоков будет рассмотрено позже в ходе изложения технологии построения модели в AnyLogic.

Следует иметь в виду, что возможны и другие варианты декомпозиции сети связи как системы. Тем более что нами взята с учебной точки зрения одна из простых схем лишь для демонстрации цели работы.

Сообщения, поступающие на маршрутизатор, должны иметь следующие параметры:

  • numAbOtpr - номер абонента-отправителя сообщения;
  • numAbPol - номер абонента-получателя сообщения;
  • numKat - номер категории сообщения;
  • timeOtpr - время отправления сообщения абонентом;
  • dlina - длина сообщения, байт;
  • timeObr - время обработки сообщения ВК, с;
  • timePered - время передачи сообщения по каналу связи, с.
  • Эти параметры получаются путем розыгрыша по следующим исходным данным:

  • kolAbonent - количество абонентов;
  • timeAbonent - среднее время отправления сообщений абонентом, с;
  • verKat={verKat1, verKat2, verKat3, verKat4} - вероятности распределения видов сообщений первой, второй, третьей и четвёртой категорий соответственно,
  • verKat1+verKat2+verKat3+verKat4=1; dlKat={dlKat1, dlKat2, dlKat3, dlKat4} - средние длины сообщений, байт, первой, второй, третьей и четвёртой категорий соответственно;
  • dlKat0={dlKat01, dlKat02, dlKat03, dlKat04} - стандартные отклонения длин сообщений, байт, первой, второй, третьей и четвёртой категорий соответственно;
  • proizvod - производительность ВК при обработке сообщения, оп/c;
  • skorPeredKan - среднее время передачи сообщений по каналу связи, бит/с;
  • skorPeredKanR - среднее время передачи сообщений по резервному каналу связи, бит/с;
  • timeBklKanR - время включения резервного канала связи.
  • В ходе моделирования собирается следующая статистика:

  • kolOtprKat1, kolOtprKat2, kolOtprKat3, kolOtprKat4, kolOtpr - количество отправленных абонентом сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • kolPolKat1, kolPolKat2,kolPolKat3,kolPolKat4, kolPol - количество полученных абонентом сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • всегоОтпрКат1, всегоОтпрКат2, всегоОтпрКат3, всегоОтпрКат4, всегоОтпр - количество отправленных в сети сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • всегоПолКат1, всегоПолКат2, всегоПолКат3, всегоПолКат4, всегоПол - количество полученных в сети сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • количество отправленных сообщений каждым абонентом каждому абоненту сети;
  • количество полученных сообщений каждым абонентом от каждого абонента сети.
  • По этим статистическим данным рассчитываются:

  • коэффициенты пропускной способности между всеми абонентами сети;
  • коэфПропСпособ - коэффициент пропускной способности сети связи;
  • врПередачи - среднее время передачи абоненту одного сообщения;
  • врПередСооб - среднее время передачи в сети связи одного сообщения.
  • Коэффициенты пропускной способности определяются как отношение количества полученных сообщений к отправленным сообщениям.

    В модели также для выполнения условий ограничения ёмкостей буферов необходимо использовать:

  • emkBuferVx - ёмкость входного буфера абонента, байт;
  • tekEmkBuferVx - текущую ёмкость входного буфера абонента, байт;
  • emkBufer1 - ёмкость входного буфера маршрутизатора, байт;
  • tekEmkBufer1 - текущая ёмкость входного буфера, байт;
  • emkBuferNapr1,emkBuferNapr2,emkostBuferNapr3, emkBuferNapr4 - ёмкости на входах каналов связи первого, второго, третьего и четвёртого направлений соответственно, байт;
  • tekEmkNapr1, tekEmkNapr2, tekEmkNapr3,tekEmkNapr4 - текущие ёмкости на входах каналов связи первого, второго, третьего и четвёртого направлений соответственно, байт.
  • Отказы и восстановление ВК и каналов связи разыгрываются по следующим данным:

  • timeOtkВК - среднее время между отказами ВК;
  • timeVosstВК - среднее время восстановления ВК;
  • timeOtkKan - среднее время между отказами канала связи;
  • timeVosstKan - среднее время восстановления канала связи.
  • Создание новых классов активных объектов

    Построение модели начнём с создания новых классов активных объектов. Напомним, что согласно рис. 4.1 в сети связи выделены следующие сегменты (компоненты):

  • абонент;
  • маршрутизатор;
  • канал.
  • Реализуем эти сегменты средствами AnyLogic, а потом из них, как из созданных нами элементов, будем строить сеть на корневом объекте Main.

    Создайте три новых класса активных объектов: Абонент, Канал, Маршрутизатор.

  • Выполните команду Файл/Создать/Модель на панели инструментов. Появится диалоговое окно Новая модель.
  • Задайте имя новой модели. В поле Имя модели введите Сеть_связи. Выберите каталог, в котором будут сохранены файлы модели.
  • Щелкните кнопку Далее. Откроется вторая страница Мастера создания модели. Выберите Начать создание модели "с нуля". Щелкните кнопку Далее.
  • На панели Проекты щёлкните правой кнопкой Main и выберите из контекстного меню Создать/Класс активного объекта.
  • Откроется окно Новый класс активного объекта.
  • Введите в поле Имя: имя нового класса Абонент.
  • Если нужно, в поле Описание: введите описание назначения класса Абонент. Щелкните Готово. При построении даже таких моделей это целесообразно делать.
  • Также создайте классы Канал и Маршрутизатор.
  • Создание областей просмотра

    Последовательно переходите на классы объектов Main, Абонент, Канал, Маршрутизатор и создайте на каждом области просмотра. На них мы будем размещать элементы событийной части модели, а также исходные данные, переменные для промежуточных вычислений и результаты моделирования.

    Значения свойств элементов Область просмотра установите согласно табл. 4.1.

    Для всех областей просмотра оставьте Выравнивать по: Верхнему левому углу, установите из списка Масштабирование: Подогнать под окно.

    СвойстваОбъекты
    MainАбонентМаршрутизаторКанал
    Имя:облСетьоблАбонентоблМаршоблКанал
    Х:0000
    Y:0000
    Ширина:770810740400
    Высота:470360470340
    Имя:viewDataviewDataviewDataviewData
    Х:870000
    Y:600700550700
    Ширина:470450330400
    Высота:620420250180
    Имя:
    Х:00
    Y:6001200
    Ширина:442470
    Высота:820432

    Приступим к созданию сегментов сети связи.

    Сегмент Абонент

    Исходные данные

  • Откройте объект Абонент.
  • Перейдите на область просмотра viewData.
  • Перетащите из палитры Презентация элемент Скругленный прямоугольник. На странице Основные оставьте Имя:, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 5, Y: 745, Ширина: 435, Высота: 365.
  • Перетащите два элемента text и на странице Основные панели Свойства в поле Текст: введите Исходные данные и Результаты соответственно (рис. 4.3). (рис 4.3) Размещение элементов Параметр и Простая переменная
  • Переход между областями просмотра в ходе моделирования организуйте позднее.
  • Перетащите из палитры Основная элементы Простая переменная, разместите и дайте им имена согласно рис. 4.3. Тип всех простых переменных, кроме tekEmkBuferVx, установите double. Тип tekEmkBuferVx - int. Простые переменные предназначены для промежуточных вычислений и сбора статистических данных за одного абонента.
  • Перетащите элементы Параметр, разместите и дайте имена как на рис. 4.3. Тип всех элементов Параметр, кроме emkBuferVx и numAbonent, double. Тип emkBuferVx и numAbonent - int. Значения свойств установите согласно табл. 4.2.
  • ИмяМассивРазмерностьЗначение по умолчанию
    6
    30
    100
    1
    80000
    verKatУстановить флажкиKolKat{0.3, 0.5, 0.7, 1.0}
    KolKat{53000,86000,66000,50000}
    KolKat{6100,5000,7000,500}

    На рис. 4.2 видно, что элементы verKat, dlKat, dlKatO используются как массивы, размерность которых равна числу категорий сообщений. Создайте размерность KolKat.

  • Щёлкните правой кнопкой мышки в панели Проекты и в контекстном меню выберите Размерность.
  • В открывшемся окне Размерность в поле Имя: введите KolKat. Если введёте kolKat, в окне Ошибки появится сообщение: По соглашению, имена типов Java обычно начинаются с заглавной буквы.
  • Установите Тип размерности: Диапазон.
  • В открывшееся поле Диапазон: введите 1-4.
  • Щёлкните Готово.
  • Теперь создайте массив verKat.

  • Выделите элемент Параметр (см. рис. 4.3).
  • На странице Основные панели Свойства установите флажок Массив. Рядом появится значок {…}. Щёлкните по нему.
  • Откроется страница свойств Массив. В окошке Возможные размерности: выделите KolКат.
  • Щелкните кнопку . Размерность KolКат появится в окошке Выбранные размерности.
  • Вернитесь на страницу Основные панели Свойства.
  • В поле Значение по умолчанию: введите:
    {0.3, 0.5, 0.7, 1.0}
  • Создайте также массивы dlKat, dlKatO одинаковой размерности KolKat. Данные в поле По умолчанию введите из табл. 4.2.
  • Для получения стандартной статистической информации о времени передачи сообщений по каждому источнику добавьте элемент сбора статистики.

  • Перетащите элемент Данные гистограммы с палитры Статистика.
  • Задайте свойства элемента:
  • измените Имя: на врПередачи;
  • сделайте Количество интервалов: равным 10;
  • задайте Нач. размер интервалов: 0.01.
  • Теперь можно было бы приступить к построению событийной части сегмента. Однако вы решили вывести результаты моделирования в более презентабельном виде. Поэтому целесообразнее организовать этот вывод, поскольку полученные при этом данные (имена, опции и др.) необходимы будут в дальнейшем при написании кода в событийной части сегмента.

    Результаты моделирования по каждому абоненту

    Вариант размещения элементов для вывода результатов моделирования показан на рис. 4.4.

    Для вывода количественных показателей использован элемент Текстовое поле из палитры Элементы управления и элемент Гистограмма из палитры Статистика.

  • В Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра облАбонент.
  • На странице Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 13, Y: 1250, Ширина: 447, Высота: 371. (рис 4.4) Размещение элементов для вывода результатов моделирования
  • Перетащите элемент text. В поле Текст: введите Результаты моделирования.
  • В Палитре выделите Элементы управления. Перетащите элементы Текстовое поле на элемент Результаты моделирования. Разместите их так, как показано на рис. 4.4. Значения свойств установите согласно табл. 4.3. У элементов editbox и editbox5 Ширина: 100, Высота: 31. У остальных - Ширина: 50.
  • Осталось поместить элемент для обработки и вывода статистической информации о времени передачи одного сообщения.

  • В Палитре выделите Статистика.
  • Перетащите элемент Гистограмма. Характеристики его размещения даны в табл. 4.3.
    Всего сообщений получено Получено сообщений по категориям
    editboxeditbox1editbox2editbox3editbox4
    X: 21X: 177X: 247X: 317X: 389
    Y: 1310Y: 1310Y: 1310Y: 1310Y: 1310
    Всего сообщений отправленоОтправлено сообщений по категориям
    editbox5editbox6editbox7editbox8editbox9
    X: 19X: 179X: 249X: 319X: 389
    Y: 1390Y: 1390Y: 1390Y: 1390Y: 1390
    Время передачи сообщения
    МинимальноеМаксимальноеСреднее
    editbox13editbox12editbox15
    X: 319X: 319X: 319
    Y: 1470Y: 1520Y: 1570
    сhart-Гистограмма
    X: 19Y: 1450Ширина: 240Высота: 160
  • На странице Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • Щёлкните кнопку Добавить данные и введите в поле Данные: имя врПередачи.
  • В поле Заголовок: введите Время передачи.
  • Значения остальных свойств (цвет и др.) установите по собственному усмотрению.
  • Добавьте остальные элементы презентации (номера категорий сообщений, другую текстовую информацию) согласно рис. 4.4.
  • И снова, прежде чем перейти к построению событийной части сегмента Абонент, разместим на корневом объекте Main необходимые элементы для сбора статистических данных, обработки, расчёта показателей качества обслуживания сети и их вывода. Это необходимо сделать по той причине, что также имена этих элементов нужны будут при написании кода в сегменте Абонент.

    Показатели качества обслуживания сети связи

  • Откройте корневой объект Main.
  • Перейдите на область просмотра ViewData.
  • Перетащите или скопируйте элементы Простая переменная, разместите и дайте имена согласно рис. 4.5. (рис 4.5) Элементы для сбора и обработки данных за сеть в целом
  • Тип всех переменных double. Переменные отпр11…отпр66 предназначены для накопления статистических данных о количестве отправленных сообщений абонент - абонент. Например, отпр23 - количество сообщений, отправленных абонентом 2 абоненту 3, а отпр32 - количество сообщений, отправленных абонентом 3 абоненту 2. По этим данным рассчитываются коэффициенты пропускной способности кПрСп12…кПрСп66 абонент - абонент.
  • Выровняйте элементы. Выделите нужные элементы, щелкните правой кнопкой мышки, выберите Выравнивание.
  • Перетащите элемент Данные гистограммы с палитры Статистика.
  • Задайте свойства элемента:
  • измените Имя: на врПередСооб;
  • сделайте Количество интервалов: равным 10;
  • задайте Нач. размер интервалов: 0.01.
  • Теперь организуем вывод в более презентабельном виде. На рис. 4.6 показаны элементы для вывода показателей качества обслуживания сети связи. Часть результатов моделирования будем выводить в таком же виде и такие же, как и для каждого абонента.

  • Перейдите на область просмотра ViewResult.
  • Откройте объект Абонент.
  • Скопируйте элементы в скруглённом прямоугольнике с именем Результаты моделирования.
  • Перейдите на корневой объект Main и вставьте скопированные элементы в верхнюю часть области просмотра ViewResult (см. рис. 4.6).
  • Добавьте элемент Текстовое поле (editbox10) для вывода коэффициента пропускной способности сети.
  • Внесите правки в текстовые сообщения согласно рис. 4.6.
  • В Палитре выделите Статистика. Перетащите элемент Гистограмма.
  • На странице Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • Щёлкните кнопку Добавить данные и введите в поле Данные: имя врПередачи.
  • В поле Заголовок: введите Время передачи.
  • Значения остальных свойств (цвет и др.) установите по собственному усмотрению.
  • В Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра результатов ViewResult. (рис 4.6) Вывод показателей качества обслуживания сети
  • На странице Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 1000, Ширина: 420, Высота: 410.
  • Перетащите элемент text. В поле Текст: введите Коэффициенты пропускной способности абонент-абонент.
  • В Палитре выделите Элементы управления. Перетащите элемент Текстовое поле. Разместите X: 20, Y: 1078, Ширина: 48, Высота: 25. В поле Имя: введите КПрСп11. Сбросьте флажок Отображать имя.
  • Перетащите элемент text. В поле Текст: введите КПрСп11.
  • Скопируйте элементы text и Текстовое поле. Вставьте их пять раз согласно рис. 4.6. При этом в полях Имя: последовательно меняются имена КПрСп12… КПрСп16. Но поле Текст: останется неизменным, т.е. КПрСп11. Внесите правки в соответствии с рис. 4.6. Элемент text добавлен потому, что в ходе моделирования имя элемента Текстовое поле не отображается.
  • Аналогичным образом добавьте остальные элементы text и Текстовое поле согласно рис. 4.6.
  • Теперь можно перейти к построению событийной части сегмента.

    Построение событийной части сегмента

    Событийная часть сегмента, назовём её блок Абонент1, предназначена для имитации отправителя-получателя сообщений, поступления сообщений через случайные интервалы времени, розыгрыша параметров сообщений и счёта количества всего отправленных-полученных сообщений по категориям и абонентам, запоминания времени поступления каждого сообщения, используемого в последующем для расчёта минимального, максимального и среднего времени передачи одного сообщения.

    Алгоритм блока Абонент1 приведен на рис. 4.7, а его реализация средствами AnyLogic - на рис. 4.8.

  • Из палитры Презентация перетащите элемент Прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 50, Ширина: 450, Высота: 380.
  • Перетащите элемент text и в поле Текст: введите Абонент1. (рис 4.7) Алгоритм блока Абонент1
  • Перетащите из Основной библиотеки (Enterprise Library) объект source. Поместите его так же, как на рис. 4.8. Остальные объекты блока Абонент1 вы будете размещать по мере необходимости.
  • При построении модели нам придётся воспользоваться Java-кодом, в котором потребуются дополнительные поля сообщений. Для этого мы должны создать нестандартный класс заявки с дополнительными полями для записи и хранения параметров, о которых мы упоминали ранее (см. п. 4.1.4).

    (рис 4.8) Реализация блока Абонент1 средствами AnyLogic

    Создайте класс заявки Message.

  • Выделите объект source.
  • В панели Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса: Message.
  • В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса (в ранних версиях - anylogic.libraries.enterprise.Entity). Щелкните кнопку Далее.
  • Появится вторая страница Мастера создания Java класса. Добавьте поля Java класса, показанные на рис. 4.9. (рис 4.9) Дополнительные поля класса заявок Message
  • Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
  • Щелкните Готово. Закройте редактор кода.
  • Продолжим построение блока Абонент1.

  • Выделите объект source. На странице Основные панели Свойства установите следующие свойства:
  • Класс заявки: Message
  • Заявки прибывают согласно Времени между прибытиями
  • Время между прибытиями exponential(1/timeAbonent)
  • Количество заявок, прибывающих за один раз 1
  • Новая заявка new Message()
  • Действие при выходе
    double a=0;
    double b=kolAbonent;
       // Розыгрыш номера получателя сообщения
        a=uniform();
     for (int i=1; i<(kolAbonent+1); i++)
         {if (a<=((1/kolAbonent)*b))
            entity.numAbPol=i;
             b=b-1;}   
    entity.timeOtpr=time();
    entity.numAbOtpr=numAbonent;
  • Объект source будет генерировать сообщения с интервалами времени, распределёнными по экспоненциальному закону. Принято, что сообщения от данного абонента-отправителя с равной вероятностью могут быть отправлены любому абоненту сети. Поэтому разыгрывается номер абонента-получателя сообщения, и заносится в numAbPol. В поле timeOtpr заносится время отправления сообщения.

    Замечание. Основная библиотека (Enterprise Library) содержит объекты TimeMeasureStart и TimeMeasureEnd, позволяющие измерять время прохождения заявки между двумя заданными точками диаграммы процесса. TimeMeasureStart запоминает момент времени, в который заявка проходит через этот объект. TimeMeasureEnd вычисляет для поступившей в него заявки разность между текущим временем и запомненным объектом TimeMeasureStart, на который ссылается этот объект. Эта разность добавляется в элементы сбора статистики, встроенные в объект TimeMeasureEnd.
  • Перетащите объект selectOutput. Соедините его вход с выходом объекта source. Объект selectOutput выделяет и направляет объекту sink на уничтожение сообщения, адресованные абоненту-отправителю, то есть самому себе. Перетащите объект sink. Его вход соедините с выходом T объекта selectOutput.
  • Перетащите объект selectOutput5. Данный объект предназначен для розыгрыша категорий отправляемых сообщений. Его вход соедините с выходом F объекта selectOutput. На странице Основные панели Свойства установите свойства согласно табл. 4.4. Эти свойства являются кодом. Код предназначен для счёта отправленных сообщений за сеть связи в целом и по категориям сообщений, определения количества отправленных сообщений за один прогон, розыгрыша длин сообщений по категориям, вывода расчётов по каждому абоненту, а также за сеть связи в целом.
  • Перетащите два объекта selectOutput5 (имена selectOutput1 и selectOutput2). Объекты предназначены для разделения и счёта отправляемых сообщений по абонентам.
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    Класс заявки:Message
    Использовать:Условия
    Действие при входе:a=uniform();
    f++;
    kolOtpr=f/kolProg;
    editbox5.setText(kolOtpr, true);
    get_Main().f++;
    get_Main().всегоОтпр=get_Main().f/
    kolProg;
    get_Main().editbox5.setText(get_Main().
    всегоОтпр, true);
    Условие 0a<=verKat.get(1)
    Действие при выходе 0entity.numKat=1;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina=(int)(b);
    d1++;
    kolOtprKat1=d1/kolProg;
    editbox6.setText(kolOtprKat1, true);
    get_Main().d1++;
    get_Main().всегоОтпрКат1=get_Main().d1/kolProg;
    get_Main().editbox6.setText(get_Main().всегоОтпрКат1, true);
    Условие 1a<=ver verKat.get(2)
    Действие при выходе 1entity.numKat=2;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina = (int)(b);
    d2++;
    kolOtprKat2=d2/kolProg;
    editbox7.setText(kolOtprKat2, true);
    get_Main().d2++;
    get_Main().всегоОтпрКат2=get_Main().d2/kolProg;
    get_Main().editbox7.setText(get_Main().всегоОтпрКат2, true);
    Условие 2a<=verKat.get(3)
    Действие при выходе 2entity.numKat=3;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina=(int)(b);
    d3++;
    kolOtprKat3=d3/kolProg;
    editbox8.setText(kolOtprKat3, true);
    get_Main().d3++;
    get_Main().всегоОтпрКат3=get_Main().d3/ kolProg;
    get_Main().editbox8.setText(get_Main().всегоОтпрКат3, true);
    Условие 3a<=verKat.get(4)
    Действие при выходе 3entity.numKat=4;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina=(int)(b);
    d4++;
    kolOtprKat4=d4/kolProg;
    editbox9.setText(kolOtprKat4, true);
    get_Main().d4++;
    get_Main().всегоОтпрКат4=get_Main().d4/kolProg;
    get_Main().editbox9.setText(get_Main().всегоОтпрКат4, true);
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Условие 1entity.numAbPol==2
    Действие при выходе 1отпрАб2++;
    get_Main().отпр12=отпрАб2;
    Условие 2entity.numAbPol==3
    Действие при выходе 2отпрАб3++;
    get_Main().отпр13=отпрАб3;
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Действие при выходе 0отпрАб4++;
    get_Main().отпр14=отпрАб4;
    Условие 1entity.numAbPol==5
    Действие при выходе 1отпрАб5++;
    get_Main().отпр15=отпрАб5;
    Условие 2entity.numAbPol==6
    Действие при выходе 2отпрАб6++;
    get_Main().отпр16=отпрАб6;
  • Перетащите объект queue. Укажите его свойства: Имя:Буфер. Класс заявки: Message. Вместимость 100. Соедините выходы 0…3 selectOutput1 с входом элемента Буфер (см. рис. 4.8).
  • Соедините выход по умолчанию selectOutput1 с входом selectOutput2. Через этот выход будут проходить на selectOutput2 сообщения, адресованные абонентам 4, 5 и 6.
  • Выделите selectOutput2 и установите значения свойств, указанных также в табл. 4.4. Соедините все выходы selectOutput2 с входом элемента Буфер.
  • Отправляемое сообщение поступило в буфер. Дальше оно должно попасть в канал связи. Создайте порты для отправления и приёма сообщений.

  • Из палитры Презентация перетащите элемент Скруглённый прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 210, Y: 100, Ширина: 65, Высота: 60.
  • Из палитры Основная перетащите два элемента порт. Разместите их как на рис. 4.8. В поле Имя: замените предложенное системой на вх и вых.
  • Обратите внимание на то, чтобы у элементов Скруглённый прямоугольник и порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Абонент1 этот флажок должен быть сброшенным.
  • Итак, отправляемое сообщение поступило в канал связи, подключённый к порту вых.

    Через порт вх сообщения поступают из канала связи. Продолжим построение блока Абонент1.

  • Перетащите объект selectOutput (имя selectOutput3). Он предназначен для контроля текущей ёмкости входного буфера. В случае заполнения буфера, сообщения теряются.
  • Соедините порт вх с входом объекта selectOutput3.
  • Перетащите объект sink (имя sink1). Его вход соедините с выходом F объекта selectOutput3.
  • Выделите объект selectOutput3 и установите его свойства:
  • Класс заявки: Message
  • Выход true выбирается При выполнении условия
  • Условие emkBuferVx-tekEmkBuferVx>=entity.dlina
  • Перетащите объект queue. Укажите его свойства:
  • Имя: БуферВх
  • Класс заявки: Message
  • Вместимость emkBuferVx
  • Действие при входе tekEmkBuferVx+=entity.dlina;
  • Действие при выходе tekEmkBuferVx-=entity.dlina;
  • Соедините его вход с выходом Т объекта selectOutput3.

  • Перетащите объект selectOutput5 (имя selectOutput4). Он предназначен для разделения потока полученных сообщений по категориям. На странице Основные панели Свойства установите свойства согласно табл. 4.5. Эти свойства также являются кодом. Код предназначен для счёта полученных сообщений за сеть связи в целом и по категориям сообщений, определения количества полученных сообщений за один прогон, вывода расчётов за каждого абонента, а также за сеть связи в целом.
  • Соедините выход элемента БуферВх с выходом объекта selectOutput4.
    СвойствоselectOutput4
    Класс заявки:Message
    Использовать:Условия
    Действие при входе:g++;
    kolPol=g/kolProg;
    editbox.setText(kolPol, true);
    get_Main().g++;
    get_Main().всегоПол=get_Main().g/
    kolProg;
    get_Main().editbox.setText(get_Main().всегоПол, true);
    Условие 0entity.numKat==1
    Действие при выходе 0k1++;
    kolPolKat1=k1/kolProg;
    editbox1.setText(kolPolKat1, true);
    get_Main().k1++;
    get_Main().всегоПолКат1=get_Main().k1/kolProg;
    get_Main().editbox1.setText(get_Main().всегоПолКат1, true);
    Условие 1entity.numKat==2
    Действие при выходе 1k2++;
    kolPolKat2=k2/kolProg;
    editbox2.setText(kolPolKat2, true);
    get_Main().k2++;
    get_Main().всегоПолКат2=get_Main().k2/kolProg;
    get_Main().editbox2.setText(get_Main().всегоПолКат2, true);
    Условие 2entity.numKat==3
    Действие при выходе 2k3++;
    kolPolKat3=k3/kolProg;
    editbox3.setText(kolPolKat3, true);
    get_Main().k3++;
    get_Main().всегоПолКат3=get_Main().k3/kolProg;
    get_Main().editbox3.setText(get_Main().всегоПолКат3, true);
    Условие 3entity.numKat==4
    Действие при выходе 3k4++;
    kolPolKat4=k4/kolProg;
    editbox4.setText(kolPolKat4, true);
    get_Main().k4++;
    get_Main().всегоПолКат4=get_Main().k4/kolProg;
    get_Main().editbox4.setText(get_Main().всегоПолКат4, true);
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Условие 1entity.numAbOtpr==2
    Действие при выходе 1отАб2++;
    get_Main().кПрСп21=отАб2/get_Main().
    отпр21;
    get_Main().КПрСп21.setText(get_Main().кПрСп21, true);
    Условие 2entity.numAbOtpr==3
    Действие при выходе 2отАб3++;
    get_Main().кПрСп31=отАб3/get_Main().
    отпр31;
    get_Main().КПрСп31.setText(get_Main().кПрСп31, true);
    Условие 3entity.numAbOtpr==4
    Действие при выходе 3отАб4++;
    get_Main().кПрСп41=отАб4/get_Main().
    отпр41;
    get_Main().КПрСп41.setText(get_Main().кПрСп41, true);
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Действие при выходе 0отАб5++;
    get_Main().кПрСп51=отАб5/get_Main().
    отпр51;
    get_Main().КПрСп51.setText(get_Main().кПрСп51, true);
    Условие 1entity.numAbOtpr==6
    Действие при выходе 1отАб6++;
    get_Main().кПрСп61=отАб6/get_Main().
    отпр61;
    get_Main().КПрСп61.setText(get_Main().кПрСп61, true);
  • Перетащите два объекта selectOutput5 (имена selectOutput5 и selectOutput6). Объекты предназначены для разделения и счёта получаемых сообщений по абонентам. Значения свойств установите также согласно табл. 4.5. Выход по умолчанию объекта selectOutput5 соедините с входом объекта selectOutput6.
  • Перетащите объект sink2. Его вход соедините с выходами 0…3 объекта selectOutput5 и выходами объекта selectOutput6.
  • Установите свойства объекта sink2 согласно табл. 4.6. Код рассчитывает коэффициент пропускной способности сети связи и время передачи одного сообщения.
  • Свойствоsink2
    Класс заявки:Message
    Действие при входе:врПередачи.add(time()-entity.timeOtpr);
    editbox11.setText(врПередачи.mean(), true);
    editbox12.setText(врПередачи.max(), true);
    editbox13.setText(врПередачи.min(), true);
    get_Main().коэфПропСпособ=get_Main().
    всегоПол/get_Main().всегоОтпр;
    get_Main().editbox10.setText(get_Main().коэфПропСпособ, true);
    get_Main().врПередСооб.add(time()-entity.timeOtpr);
    get_Main().editbox11.setText(get_Main().врПередСооб.mean(), true);
    get_Main().editbox12.setText(get_Main().врПередСооб.max(), true);
    get_Main().editbox13.setText(get_Main().врПередСооб.min(), true);

    Сегмент Маршрутизатор

    Исходные данные

  • Откройте объект Маршрутизатор.
  • Перейдите на область просмотра viewData.
  • Перетащите из палитры Презентация элемент Скругленный прямоугольник. На странице Основные в поле Имя: оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 600, Ширина: 314, Высота: 190.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Исходные данные (рис. 4.9.).
  • Перетащите элементы Параметр и Простая переменная. Разместите их и дайте имена согласно рис. рис. 4.10.
  • Значения по умолчанию элементов Параметр установите согласно табл. 4.7.
  • Тип timeOtkBK, timeVosstBK, proizvod установите double, остальных параметров и простых переменных - int.
  • (рис 4.10) Исходные данные сегмента Маршрутизатор
    ИмяЗначение по умолчаниюИмяЗначение по умолчанию
    emkBufer15000000emkBuferNapr1250000
    timeOtkBK3600emkBuferNapr2250000
    timeVosstBK3,7emkBuferNapr3250000
    proizvod40000emkBuferNapr4250000

    Событийная часть сегмента Маршрутизатор

    Элементы событийной части сегмента Маршрутизатор показаны на рис. 4.11. Сегмент включает Вычислительный комплекс, Буфер 2, порты входа-выхода, Имитатор отказов вычислительного комплекса.

    В свою очередь вычислительный комплекс содержит Блок контроля 1, Буфер 1, Блок обработки сообщений.

    Приступим к построению событийной части сегмента Маршрутизатор.

    Блок контроля 1

    Блок предназначен для контроля текущей емкости буфера 1 маршрутизатора. Он анализирует наличие в буфере 1 свободной памяти, достаточной для хранения поступившего сообщения, и в зависимости от результата анализа сообщение либо помещается в буфер 1, либо уничтожается.

    Алгоритм работы Блока контроля 1 представлен на рис. 4.12.

    В AnyLogic этот алгоритм реализуется блоками selectOutput, hold и sink.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 26, Y: 50, Ширина: 154, Высота: 150.
  • Перетащите объекты selectOutput, hold и sink на диаграмму класса Маршрутизатор, разместите и соедините так, как показано на рис. 4.11.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Блок контроля 1.
  • Выделите объект selectOutput.
  • В поле Имя: вместо selectOutput введите blokKontrol_1.
  • В поле Класс заявки: Entity замените Message. (рис 4.11) Событийная часть сегмента Маршрутизатор (рис 4.12) Алгоритм работы Блока контроля 1
  • Установите Выход true выбирается При выполнении условия.
  • В поле Условие введите условие:
    (emkostBufer1-tekEmkostBufer1>=entity.dlina)
    (hold.isBlocked()==false)

    При выполнении условия заявка направляется на выход T (выходной порт для заявок, для которых выбирается выход true) и на выход F (выходной порт для заявок, для которых выбирается выход false), если условие не выполняется, соответственно.

  • Выделите объект sink. В поле Класс заявки: Entity замените Message.
  • В поле Действие при входе введите kolPotBK++; для счёта количества сообщений, потерянных при отказе вычислительного комплекса.
  • Выделите элемент hold. В поле Класс заявки: Entity замените Message.
  • Блок Буфер 1

    Блок Буфер 1 предназначен для приема, размещения и хранения поступающих на обработку сообщений.

    Алгоритм работы блока Буфер 1 приведен на рис. 4.13.

    В AnyLogic алгоритм блока Буфер 1 реализуется объектом queue, который выполняет функции очереди (FIFO).

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 190, Y: 50, Ширина: 126, Высота: 100.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Буфер 1. (рис 4.13) Алгоритм работы блока Буфер 1
  • Выделите объект queue.
  • В поле Имя: вместо queue введите bufer1.
  • В поле Класс заявки: Entity замените Message.
  • В поле Вместимость введите emkBufer1.
  • При помещении сообщения в буфер его текущая емкость увеличивается, поэтому в поле Действие при входе введите:
    tekEmkBufer1 += entity.dlina;
  • При выходе сообщения из буфера его текущая емкость уменьшается, поэтому в поле Действие при выходе введите:
    tekEmkBufer1 = -entity.dlina;
  • Поставьте флажок Включить сбор статистики.
  • Блок обработки сообщений

    Блок предназначен для имитации обработки сообщений.

    Алгоритм работы блока приведен на рис. 4.14.

    (рис 4.14) Алгоритм работы Блока обработки сообщений

    Для реализации алгоритма Блока обработки сообщений в AnyLogic используется объект delay.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 336, Y: 50, Ширина: 194, Высота: 100.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Блок обработки сообщений.
  • Перетащите объект delay, разместите и соедините с bufer_1 так, как на рис. 4.11.
  • Выделите объект delay. На странице Основные панели Свойства в поле Имя: вместо delay введите сomputer.
  • В поле Класс заявки: Entity замените Message.
  • Задержка задаётся установите Явно.
  • В поле Время задержки введите:
    exponential(1/entity.timeObr)
  • Оставьте Вместимость 1.
  • Действие при входе entity.timeObr= entity.dlina/proizvod;
  • Установите флажок Включить сбор статистики.
  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 20, Y: 40, Ширина: 520, Высота: 170.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Вычислительный комплекс.
  • Блок контроля 2

    Блок контроля 2 предназначен для распределения сообщений по направлениям и контроля текущих ёмкостей буферов (накопителей) направлений передачи сообщений.

    Алгоритм работы Блока контроля 2 приведен на рис. 4.15.

    Вначале определяется номер направления, по которому должно быть передано поступившее сообщение.

    (рис 4.15) Алгоритм работы блока Блок контроля 2

    Затем определяется наличие достаточной свободной памяти в буфере этого направления. При отсутствии нужного объёма памяти сообщение теряется.

    Для распределения сообщений по направлениям можно было бы использовать объекты selectOutput5 и sink. Однако мы используем другие объекты AnyLogic: exit и enter. Они позволяют организовать сложную маршрутизацию, вследствие чего на рис. 4.11 Блок контроля 2 не выделен, хотя функционально он существует.

  • Перетащите объект exit, вход которого соедините с выходом computer (рис. 4.10).
  • В поле Класс заявки: Entity замените Message.
  • В поле Действие при выходе введите код:
    int i;
      i=entity.numIstPol;
       {
          switch (i) 
    {
            case 1:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) {
                  enter1.take(entity);
                  break;}
                else {enter.take(entity);
                  break;}  
            case 2:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) {
                  enter1.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}  
            case 3:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
                  enter2.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}  
            case 4:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
                  enter2.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}
              case 5:if (emkBuferNapr3-tekEmkNapr3>=entity.dlina) {
                  enter3.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}
            case 6:if (emkBuferNapr4-tekEmkNapr4>=entity.dlina) {
                  enter4.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}     
          }
        }
  • Маршрутизатор настраивается определённым образом, например, таблицей маршрутизации. В данном случае он настраивается программным путём так, что сообщения первого и второго отправителей передаются по первому направлению, третьего и четвёртого отправителей - по второму направлению, пятого отправителя - по третьему и шестого отправителя - по четвёртому направлению. Такой вариант принят с учётом построения в дальнейшем сети связи (см. рис. 4.1).

    Блок Буфер 2

    Блок Буфер 2 предназначен для приема и хранения сообщений, передаваемых по каналам направлений. Он состоит из четырёх буферов - для каждого направления свой буфер.

    Алгоритм работы буфера каждого из направлений такой же, как и алгоритм работы буфера 1 (см. рис. 4.13).

    Реализуется каждый из буферов также объектом queue.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник (см. рис. 4.11).
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 550, Y: 20, Ширина: 140, Высота: 290.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Буфер 2.
  • Перетащите пять объектов enter, четыре объекта queue и один объект sink, разместите, дайте имена и соедините так, как на рис. 4.11.
  • Выделите элемент buferNapr1, вход которого соединён с выходом enter1 и установите значения свойств.
  • В поле Класс заявки: Entity замените Message.
  • Вместимость emkBuferNapr1
  • В поле Действие при входе введите:
    tekEmkNapr1 += entity.dlina;
  • В поле Действие при выходе введите:
    tekEmkNapr1 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr2, вход которого соединен с выходом enter2 и установите значения свойств.
  • В поле Класс заявки: Entity замените Message.
  • Вместимость emkBuferNapr2
  • В поле Действие при входе введите:
    tekEmkNapr2 += entity.dlina;
  • В поле Действие при выходе введите:
    tekEmkNapr2 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr3, вход которого соединен с выходом enter3 и установите значения свойств.
  • В поле Класс заявки: Entity замените Message.
  • Вместимость emkBuferNapr3
  • В поле Действие при входе введите:
    tekEmkNapr3 += entity.dlina;
  • В поле Действие при выходе введите:
    tekEmkNapr3 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr4, вход которого соединен с выходом enter4 и установите значения свойств.
  • В поле Класс заявки: Entity замените Message.
  • Вместимость emkBuferNapr4
  • В поле Действие при входе введите:
    tekEmkNapr4 += entity.dlina;
  • В поле Действие при выходе введите:
    tekEmkNapr4 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Организация входных и выходных портов

    Также как и для источника сообщений, для маршрутизатора нужно создать выходы, через которые отправлять сообщения, и входы, по которым получать сообщения. Создайте эти входы и выходы.

  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 536, Y: 340, Ширина: 83, Высота: 110.
  • Из палитры Основная перетащите восемь элементов Порт. Разместите их как на рис. 4.11. В полях Имя: предложенные системой имена замените согласно рис. 4.11. Установите флажки Отображать имя.
  • Обратите также внимание на то, чтобы у элементов Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Маршрутизатор этот флажок должен быть сброшенным.
  • Соедините выходы элементов buferNapr1… buferNapr4 с соответствующими портами вых1… вых4, а порты вх1… вх4 - с входом элемента blokKontrol_1 (Блок контроля 1).
  • Имитатор отказов вычислительного комплекса

    Принято, что вычислительный комплекс может выходить из строя и отказывать в обработке сообщений. Можно было бы построить имитатор отказов так, что генератор вырабатывает заявки-отказы в количестве, определяемом длительностью времени моделирования. Однако мы сделаем так, что генератор вырабатывает одну заявку, а затем этот процесс повторяется через интервалы времени, равные наработке до очередного отказа.

  • Перетащите элемент Прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 160, Y: 224, Ширина: 340, Высота: 140.
  • Перетащите объект source и два объекта delay. Разместите и соедините их как на рис. 4.11.
  • Выделите source и установите значения его свойств:
  • Заявки прибывают согласно Интенсивности
  • Интенсивность прибытия 1
  • Количество заявок, прибывающих за один раз 1
  • Ограниченное количество прибытий 1
  • Максимальное количество прибытий 1
  • Выделите первый объект delay и установите значения его свойств:
  • Имя: розыгрыш_инт_до_отказа
  • Задержка задаётся Явно
  • Время задержки exponential(1/timeOtkBK)
  • Вместимость 1
  • Действие при выходе
    hold.setBlocked(true);
    if (computer.size()!=0) {
    computer.remove((Message)computer.get(0));
    kolPoterBK ++;}
  • Выделите второй объект delay и установите значения его свойств:
  • Имя: имитация_восст_ВК
  • Задержка задаётся Явно
  • Время задержки exponential(1/timeVosstBK)
  • Вместимость 1
  • Действие при выходе
    hold.setBlocked(false)
  • Сегмент Канал

    Данный сегмент предназначен для имитации передачи сообщений по каналам связи.

    Для его реализации в AnyLogic используется имитационная модель направления связи (глава 2), которое состоит из основного и резервного каналов.

    Исходные данные

  • Откройте объект Канал. Перейдите на область просмотра viewData.
  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 10, Y: 752, Ширина: 377, Высота: 118.
  • Перетащите элементы Параметр и Простая переменная, разместите и дайте им имена согласно рис. 4.16.
  • Типы и значения по умолчанию установите согласно табл. 4.8.
  • ИмяТипЗначение по умолчанию
    skorPeredKandouble5000
    skorPeredKanRdouble5000
    timeOtkKan double360
    timeVosstKandouble3,2
    timeBklResKdouble0,1
    всего_потеряно_сообщint0

    Событийная часть сегмента Каналы

  • Перейдите на область просмотра облКаналы.
  • Перетащите элемент Прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 186, Y: 50, Ширина: 200, Высота: 135.
  • Перетащите два элемента hold, разместите как на рис. 4.17.
  • Оставьте имена, предложенные системой, и флажок Отображать имя.
  • В поле Класс заявки: Entity замените Message. (рис 4.16) Исходные данные сегмента Канал (рис 4.17) Объекты событийной части сегмента Канал
  • У элемента hold1 установите флажок Изначально заблокирован.
  • Перетащите объект delay, поместите сверху (см. рис. 4.16). В поле Имя: введите основной_канал.
  • Установите флажок Отображать имя.
  • В поле Класс заявки: Entity замените Message. Задержка задаётся установите Явно.
  • В поле Время задержки введите
    exponential(1/entity.timePered)
  • В поле Вместимость введите 1.
  • Действие при входе entity.timePered=entity.dlina/ skorPeredKan;
  • Установите флажок Включить сбор статистики.
  • Скопируйте объект delay. Вставьте его один раз. При этом изменится имя на основной_канал, а остальные свойства останутся неизменными.
  • Замените имя основной_канал на резерв_канал.
  • В поле Действие при входе замените имеющийся там код следующим:
    if (а==0)
    entity.timePered=entity.dlina/skorPeredKanR;
    if (а==1)
    {entity.timePered=entity.dlina/skorPeredKanR +
    timeBklResK;
    а=0;} 
  • Действие при выходе
    if (hold.isBlocked()== true)
    hold1.setBlocked(false);
  • Соедините объекты hold и delay согласно рис. 4.17.
  • Организация входного и выходного портов

  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 50, Y: 80, Ширина: 60, Высота: 52.
  • Из палитры Основная перетащите два элемента Порт. Разместите их как на рис. 4.17. В полях Имя: предложенные системой имена замените согласно рис. 4.17. Установите флажки Отображать имя.
  • Обратите также внимание на то, чтобы у элементов Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Канал этот флажок должен быть сброшенным.
  • Соедините выходы элементов основной_канал и резерв_канал с портом вых, а порт вх - с входами элементов hold и hold1.
  • Имитатор отказов каналов связи

    Имитатор отказов основного канала связи построен аналогично имитатору отказов вычислительного комплекса.

  • Перетащите элемент Прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 10, Y: 212, Ширина: 380, Высота: 120.
  • Перетащите объект source и два объекта delay. Разместите и соедините их как на рис. 4.17.
  • Выделите source и установите значения его свойств:
  • Отображать имя установите флажок
  • Заявки прибывают согласно Интенсивности
  • Интенсивность прибытия 1
  • Количество заявок, прибывающих за один раз 1
  • Ограниченное количество прибытий установите флажок
  • Максимальное количество прибытий 1
  • Действие при выходе
  • Выделите первый объект delay и установите значения его свойств:
  • Имя: розыг_инт_до_отказа
  • Отображать имя установите флажок
  • Задержка задаётся Явно
  • Время задержки exponential(1/timeOtkKan)
  • Вместимость 1
  • Действие при выходе
    hold.setBlocked(true);
    if (основной_канал.size()!=0) {
    основной_канал.remove((Message)
    основной_канал.get(0));
    всего_потеряно_сообщ ++;}
    hold1.setBlocked(false);
    а=1;
  • Выделите второй объект delay и установите значения его свойств:
  • Имя имитация_восст_осн_кан
  • Отображать имя установите флажок
  • Задержка задаётся Явно
  • Время задержки exponential(1/timeVosstkKan)
  • Вместимость 1
  • Действие при выходе
    hold.setBlocked(false);
    hold1.setBlocked(true);
  • Построение модели сети связи

    Все необходимое для построения модели сети из объектов классов активных объектов Абонент, Канал и Маршрутизатор нами создано. Приступим к построению модели сети.

  • Перейдите к области просмотра облСеть.
  • Из окна Проекты перетащите объект Абонент1 и поместите как на рис. 4.18.
  • Объект Абонент1 имитирует абонента 1. В свойствах Абонент1 записан код для расчёта коэффициентов пропускной способности абонентов 2…6 с абонентом 1. Следовательно, Абонент2 должен иметь код для расчёта коэффициентов пропускной способности абонентов 1, 3…6 с абонентом 2 и т.д.
  • Создайте активные объекты Абонент2 … Абонент6.
  • Откройте Абонент1. Скопируйте все объекты.
  • Вставьте скопированные объекты на объекты Абонент2 … Абонент6.
  • Внесите правки в коды согласно табл. 4.9.
  • Из окна Проекты перетащите объекты абонент2 … абонент6.
  • Из окна Проекты перетащите объект Канал и поместите вверху (см. рис. 4.18). В поле Имя: добавьте к предложенному имени 1.
  • Скопируйте объект Канал1. Вставьте пять объектов. Разместите их как на рис. 4.18.
  • Выходы объектов абонент1…абонент6 соедините с соответствующими входами объектов канал1…канал6.
  • Из окна Проекты перетащите объект Маршрутизатор. В поле Имя: сделайте маршрут1.
  • Соедините выходы первого и второго абонентов с вх1, выходы третьего и четвёртого - с вх2, пятого - с вх3, шестого - с вх4 объекта маршрут1.
  • (рис 4.18) Элементы модели функционирования сети связи
    Абонент2
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    numAbonent2
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Действие при выходе 0отпрАб1++;
    get_Main().отпр21=отпрАб1;
    Условие 1entity.numAbPol==2
    Условие 2entity.numAbPol==3
    Действие при выходе 2отпрАб3++;
    get_Main().отпр23=отпрАб3;
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Действие при выходе 0отпрАб4++;
    get_Main().отпр24=отпрАб4;
    Условие 1entity.numAbPol==5
    Действие при выходе 1отпрАб5++;
    get_Main().отпр25=отпрАб5;
    Условие 2entity.numAbPol==6
    Действие при выходе 2отпрАб6++;
    get_Main().отпр26=отпрАб6;
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Действие при выходе 0отАб1++;
    get_Main().кПрСп12=отАб1/get_Main().
    отпр12;
    get_Main().КПрСп12.setText(get_Main().кПрСп12, true);
    Условие 1entity.numAbOtpr==2
    Условие 2entity.numAbOtpr==3
    Действие при выходе 2отАб3++;
    get_Main().кПрСп32=отАб3/get_Main().
    отпр32;
    get_Main().КПрСп32.setText(get_Main().кПрСп32, true);
    Условие 3entity.numAbOtpr==4
    Действие при выходе 3отАб4++;
    get_Main().кПрСп42=отАб4/get_Main().
    отпр42;
    get_Main().КПрСп42.setText(get_Main().кПрСп42, true);
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Действие при выходе 0отАб5++;
    get_Main().кПрСп52=отАб5/get_Main().
    отпр52;
    get_Main().КПрСп52.setText(get_Main().кПрСп52, true);
    Условие 1entity.numAbOtpr==6
    Действие при выходе 1отАб6++;
    get_Main().кПрСп62=отАб6/get_Main().
    отпр62;
    get_Main().КПрСп62.setText(get_Main().кПрСп62, true);
    Абонент3
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    numAbonent3
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Действие при выходе 0отпрАб1++;
    get_Main().отпр31=отпрАб1;
    Условие 1entity.numAbPol==2
    Действие при выходе 2отпрАб2++;
    get_Main().отпр32=отпрАб2;
    Условие 2entity.numAbPol==3
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Действие при выходе 0отпрАб4++;
    get_Main().отпр34=отпрАб4;
    Условие 1entity.numAbPol==5
    Действие при выходе 1отпрАб5++;
    get_Main().отпр35=отпрАб5;
    Условие 2entity.numAbPol==6
    Действие при выходе 2отпрАб6++;
    get_Main().отпр36=отпрАб6;
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Действие при выходе 0отАб1++;
    get_Main().кПрСп13=отАб1/get_Main().
    отпр13;
    get_Main().КПрСп13.setText(get_Main().кПрСп13, true);
    Условие 1entity.numAbOtpr==2
    Действие при выходе 1отАб2++;
    get_Main().кПрСп23=отАб2/get_Main().
    отпр23;
    get_Main().КПрСп23.setText(get_Main().кПрСп23, true);
    Условие 2entity.numAbOtpr==3
    Условие 3entity.numAbOtpr==4
    Действие при выходе 3отАб4++;
    get_Main().кПрСп43=отАб4/get_Main().
    отпр43;
    get_Main().КПрСп43.setText(get_Main().кПрСп43, true);
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Действие при выходе 0отАб5++;
    get_Main().кПрСп53=отАб5/get_Main().
    отпр53;
    get_Main().КПрСп53.setText(get_Main().кПрСп53, true);
    Условие 1entity.numAbOtpr==6
    Действие при выходе 1отАб6++;
    get_Main().кПрСп63=отАб6/get_Main().
    отпр63;
    get_Main().КПрСп63.setText(get_Main().кПрСп63, true);
    Абонент4
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    numAbonent4
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Действие при выходе 0отпрАб1++;
    get_Main().отпр41=отпрАб1;
    Условие 1entity.numAbPol==2
    Действие при выходе 2отпрАб2++;
    get_Main().отпр42=отпрАб2;
    Условие 2entity.numAbPol==3
    Действие при выходе 2отпрАб3++;
    get_Main().отпр43=отпрАб3;
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Условие 1entity.numAbPol==5
    Действие при выходе 1отпрАб5++;
    get_Main().отпр45=отпрАб5;
    Условие 2entity.numAbPol==6
    Действие при выходе 2отпрАб6++;
    get_Main().отпр46=отпрАб6;
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Действие при выходе 0отАб1++;
    get_Main().кПрСп14=отАб1/get_Main().
    отпр14;
    get_Main().КПрСп14.setText(get_Main().кПрСп14, true);
    Условие 1entity.numAbOtpr==2
    Действие при выходе 1отАб2++;
    get_Main().кПрСп24=отАб2/get_Main().
    отпр24;
    get_Main().КПрСп24.setText(get_Main().кПрСп24, true);
    Условие 2entity.numAbOtpr==3
    Действие при выходе 2отАб3++;
    get_Main().кПрСп34=отАб3/get_Main().
    отпр34;
    get_Main().КПрСп34.setText(get_Main().кПрСп34, true);
    Условие 3entity.numAbOtpr==4
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Действие при выходе 0отАб5++;
    get_Main().кПрСп54=отАб5/get_Main().
    отпр54;
    get_Main().КПрСп54.setText(get_Main().кПрСп54, true);
    Условие 1entity.numAbOtpr==6
    Действие при выходе 1отАб6++;
    get_Main().кПрСп64=отАб6/get_Main().отпр64;
    get_Main().КПрСп64.setText(get_Main().кПрСп64, true);
    Абонент5
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    numAbonent5
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Действие при выходе 0отпрАб1++;
    get_Main().отпр51=отпрАб1;
    Условие 1entity.numAbPol==2
    Действие при выходе 2отпрАб2++;
    get_Main().отпр52=отпрАб2;
    Условие 2entity.numAbPol==3
    Действие при выходе 2отпрАб3++;
    get_Main().отпр53=отпрАб3;
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Действие при выходе 0отпрАб4++;
    get_Main().отпр54=отпрАб4;
    Условие 1entity.numAbPol==5
    Условие 2entity.numAbPol==6
    Действие при выходе 2отпрАб6++;
    get_Main().отпр56=отпрАб6;
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Действие при выходе 0отАб1++;
    get_Main().кПрСп15=отАб1/get_Main().
    отпр15;
    get_Main().КПрСп15.setText(get_Main().кПрСп15, true);
    Условие 1entity.numAbOtpr==2
    Действие при выходе 1отАб2++;
    get_Main().кПрСп25=отАб2/get_Main().
    отпр25;
    get_Main().КПрСп25.setText(get_Main().кПрСп25, true);
    Условие 2entity.numAbOtpr==3
    Действие при выходе 2отАб3++;
    get_Main().кПрСп35=отАб3/get_Main().
    отпр35;
    get_Main().КПрСп35.setText(get_Main().кПрСп35, true);
    Условие 3entity.numAbOtpr==4
    Действие при выходе 3отАб4++;
    get_Main().кПрСп45=отАб4/get_Main().
    отпр45;
    get_Main().КПрСп45.setText(get_Main().кПрСп45, true);
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Условие 1entity.numAbOtpr==6
    Действие при выходе 1отАб6++;
    get_Main().кПрСп65=отАб6/get_Main().
    отпр65;
    get_Main().КПрСп65.setText(get_Main().кПрСп65, true);
    Абонент6
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    numAbonent6
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Действие при выходе 0отпрАб1++;
    get_Main().отпр61=отпрАб1;
    Условие 1entity.numAbPol==2
    Действие при выходе 2отпрАб2++;
    get_Main().отпр62=отпрАб2;
    Условие 2entity.numAbPol==3
    Действие при выходе 2отпрАб3++;
    get_Main().отпр63=отпрАб3;
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Действие при выходе 0отпрАб4++;
    get_Main().отпр64=отпрАб4;
    Условие 1entity.numAbPol==5
    Действие при выходе 1отпрАб5++;
    get_Main().отпр65=отпрАб5;
    Условие 2entity.numAbPol==6
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Действие при выходе 0отАб1++;
    get_Main().кПрСп16=отАб1/get_Main().отпр16;
    get_Main().КПрСп16.setText(get_Main().кПрСп16, true);
    Условие 1entity.numAbOtpr==2
    Действие при выходе 1отАб2++;
    get_Main().кПрСп26=отАб2/get_Main().отпр26;
    get_Main().КПрСп26.setText(get_Main().кПрСп26, true);
    Условие 2entity.numAbOtpr==3
    Действие при выходе 2отАб3++;
    get_Main().кПрСп35=отАб3/get_Main().
    отпр35;
    get_Main().КПрСп35.setText(get_Main().кПрСп35, true);
    Условие 3entity.numAbOtpr==4
    Действие при выходе 3отАб3++;
    get_Main().кПрСп36=отАб3/get_Main().
    отпр36;
    get_Main().КПрСп36.setText(get_Main().кПрСп36, true);
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Действие при выходе 0отАб5++;
    get_Main().кПрСп56=отАб5/get_Main().
    отпр56;
    get_Main().КПрСп56.setText(get_Main().кПрСп56, true);
    Условие 1entity.numAbOtpr==6

    Для того чтобы связь была между всеми абонентами и они могли бы обмениваться сообщениями, нам потребуется ещё один маршрутизатор. Однако мы не можем использовать второй элемент этого же класса, так как программно он настроен именно на наш вариант организации связи.

  • Создайте ещё класс активного объекта Маршрутизатор1.
  • Откройте объект Маршрутизатор.
  • Выделите все объекты и скопируйте их.
  • Перейдите на Маршрутизатор1 и вставьте скопированные объекты.
  • Выделите элемент exit и в поле Действие при выходе замените имеющийся там код следующим кодом:
    int i;
      i=entity.numAbPol;
       {
          switch (i) {
            case 1:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) 
    {enter1.take(entity);
                  break;}
                else {enter.take(entity);
                  break;}  
            case 2:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
                  enter2.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}  
            case 3:if (emkBuferNapr3-tekEmkNapr3>=entity.dlina) {
                  enter3.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}  
            case 4:if (emkBuferNapr4-tekEmkNapr4>=entity.dlina) {
                  enter4.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}
            }
        }
  • Теперь Маршрутизатор1 настроен так, что сообщения от абонентов 1…4 будут направляться на его выходы 1…4 соответственно.
  • Из окна Проекты перетащите элемент Маршрутизатор1. В поле Имя: установите маршрут2.
  • Соедините вых1 маршрут1 с вх1 маршрут2, а вых2 - с вх2.
  • Скопируйте элемент Канал1. Вставьте шесть элементов. Разместите их как на рис. 4.18.
  • Соедините вых3 маршрут1 с вх канал11, вых4 - с вх канал12.
  • Соедините вых1…вых4 маршрут2 с вх канал7…канал10 соответственно.
  • Соедините вых канал7…канал12 с входами абонент1…абонент6 соответственно.
  • Построение модели сети связи завершено. Но надо ещё организовать переключение между областями просмотра.

    Переключение между областями просмотра

    Переключение между областями просмотра организуем так, чтобы можно было из сети переходить к любому абоненту, каналу, маршрутизатору и обратно. В каждом активном объекте - к данным и обратно или в сеть.

    Для переключения используем элемент button из палитры Элементы управления.

  • Перетащите элемент button (см. рис. 4.18).
  • На странице Основные панели Свойства укажите:
  • Метка: Абонент1
  • Действие: абонент1.облАбонент1.navigateTo()
  • Скопируйте кнопку Абонент1. Вставьте пять раз. Последовательно откройте и внесите соответствующие правки в полях Метка: и Действие:.
  • Перетащите элемент button. Укажите свойства:
  • Метка: Результаты
  • Действие: viewData.navigateTo()
  • Перетащите элемент button. Укажите свойства:
  • Метка: маршрут1
  • Действие: маршрут1.облМарш.navigateTo()
  • Скопируйте кнопку маршрут1. Скорректируйте свойства:
  • Метка: маршрут2
  • Действие: маршрут2.облМарш.navigateTo()
  • (рис 4.19) Область просмотра облКан

    Так как каналов 12, то давайте создадим ещё одну область просмотра облКан, и на ней разместим 12 кнопок (рис. 4.19).

  • Перетащите из палитры Презентация элемент Область просмотра. На странице Основные в поле Имя: введите облКан.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 1780, Ширина: 450, Высота: 200.
  • Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Канал1
  • Действие: канал1.облКан.navigateTo()
  • Скопируйте кнопку Канал1. Вставьте одиннадцать раз. Последовательно откройте и внесите соответствующие правки в полях Метка: и Действие:. Например:
  • Метка: Канал2
  • Действие: Канал2.облКан.navigateTo()
  • Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Сеть
  • Действие: облСеть.navigateTo()
  • Перейдите на область просмотра облСеть. Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Каналы
  • Действие: облКан.navigateTo()
  • Нам осталось добавить элементы для переключения между областями просмотра на классах активных объектов и возвращения на корневой объект Main на область просмотра облСеть.

    Последовательно переходите от объекта к объекту, добавляя на них нужное число элементов button и устанавливая значения свойств согласно табл. 4.10. Размещение этих элементов было уже показано на рис. 4.3… 4.6, 4.8, 4.10, 4.11, 4.16… 4.18.

    ОбъектОбласть просмотраСвойстваЗначение
    АбонентоблАбонентМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    облАбонентМетка:Исходные данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    viewDataМетка:Абонент
    Действие:облАбонент.navigateTo()
    КаналоблКанМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    облКанМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Канал
    Действие:облКан.navigateTo()
    МаршрутизатороблМаршМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    облМаршМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    viewDataМетка:Маршрутизатор
    Действие:облМарш.navigateTo()
    Маршрутизатор1облМаршМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    облМаршМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    viewDataМетка:Маршрутизатор
    Действие:облМарш.navigateTo()

    Запуск и отладка модели

    Прежде чем запустить модель:

  • В окне Проекты выделите Сеть_связи.
  • На странице Основные в поле Единицы модельного времени: установите секунды.
  • В окне Проекты выделите Simulation: Main.
  • На странице Основные установите Фиксированное начальное число (воспроизводимые "прогоны").
  • В поле Начальное число: введите 897.
  • Перейдите на страницу Модельное время. В поле Остановить: выберите В заданное время.
  • В поле Конечное время: введите 3600000.0. Время моделирования увеличено в 1000 раз по числу прогонов модели.
  • Запустите модель. Если появятся ошибки, исправьте их.
  • При правильном построении модели вы получите результаты, показанные на рис. 4.20.

    Среди них показатели качества обслуживания сети связи: коэффициент пропускной способности 0,815 и среднее время передачи одного сообщения 6,050. Коэффициент пропускной способности, например, абонент 2- абонент 3 равен 0,816. Обратите внимание на существенную разницу между минимальным и максимальным временами передачи сообщения. Она объясняется принятым экспоненциальным законом распределения времени передачи сообщений: максимальное значение может отличаться от среднего значения в восемь раз.

    Количество отправленных и полученных сообщений всего и по категориям рассчитано за один прогон модели, то есть за 3600 сек. Для расчёта, как вы помните, был введён параметр kolProg=1000 и в 1000 раз было увеличено модельное время. Всего отправлено сообщений 600,559, а получено всего абонентами - 490,035. Если разделить количество полученных сообщений на количество отправленных, то и будет получен коэффициент пропускной способности сети.

    Точно такие же результаты моделирования, коэффициенты пропускной способности, выводятся и по каждому абоненту сети.

    Перейдите в область просмотра Сеть, щёлкнув кнопку Сеть. Затем, щёлкните, например, кнопку Абонент2. Вы увидите результаты моделирования, показанные на рис. 4.21.

    (рис 4.20) Результаты моделирования (рис 4.21) Результаты моделирования по абоненту 2

    Модель в GPSS World

    Состав GPSS-модели

    Модель в GPSS World разработана согласно постановке и включает следующие элементы:

  • задание исходных данных:
  • определение матриц;
  • описание функций, задающих исходные данные;
  • арифметические выражения;
  • сегмент имитации поступления сообщений от источников:
  • розыгрыш абонентов-получателей сообщений;
  • розыгрыш категории сообщения и счёта сообщений;
  • розыгрыш характеристик сообщений;
  • сегмент имитации работы основных каналов 1-6;
  • сегмент имитации работы маршрутизатора 1;
  • сегмент имитации работы маршрутизатора 2;
  • сегмент имитации работы основных каналов 7-10;
  • сегмент имитации работы основных каналов 11-12;
  • сегмент имитации получения сообщений;
  • сегмент имитации работы резервных каналов 13-18;
  • сегмент имитации работы резервных каналов 19-24;
  • сегмент имитации работы резервных каналов 19-24;
  • сегмент имитации отказов ВК1;
  • сегмент имитации отказов ВК2;
  • сегмент имитации отказов каналов связи 1-6;
  • сегмент имитации отказов каналов связи 7-12;
  • сегмент счёта переданных и потерянных сообщений и расчёт вероятностей передачи сообщений;
  • задание времени моделирования и расчёт результатов.
  • GPSS-программа

    Ввод данных в виде массивов организован таким образом, во-первых, чтобы в программе было меньшее количество строк, во-вторых, чтобы удобнее было использовать эти данные при написании программы модели и, в-третьих, чтобы при изменении числа элементов массива требовалась бы незначительная коррекция. Для организации такого ввода использованы функции. Например, функцией S_ задаются средние вычислительные сложности (длины) сообщений. Выборка соответствующей средней длины в зависимости от категории осуществляется по аргументу, представляющему собой параметр транзакта Р1. В этот параметр заранее посредством розыгрыша заносится код категории.

    Сообщения имитируются транзактами с параметрами, необходимыми согласно логике работы модели. Каналы связи и ВК имитируются одноканальными устройствами (ОКУ): основные каналы связи - ОКУ1…ОКУ12, резервные каналы - ОКУ13…ОКУ24, ВК1 - ОКУ25, ВК2 - ОКУ26.

    Для одновременной проверки выполнения каких-либо условий используются булевы переменные. Например, булева переменная Prov2 проверяет исправность ВК1 и наличие свободной ёмкости входного буфера, достаточной для размещения поступившего сообщения. Эти проверки можно выполнить и по отдельности, но использование булевой переменной более эффективно. Булева переменная Prov1 используется для выделения сообщений, адресованных абонентам 5 и 6.

    Количество отправленных сообщений каждым абонентом каждому абоненту сети накапливается в матрице Otpr, а количество полученных сообщений каждым абонентом от каждого абонента сети - в матрице Pol. По эти статистическим данным рассчитываются коэффициенты пропускной способности абонент-абонент и записываются в матрицу KPS.

    Коэффициент пропускной способности сети (КПС) связи в целом сохраняется в ячейке VPerS. А среднее время передачи одного сообщения - в ячейке TimeS.

    GPSS-программа приведена ниже.

    ; Модель функционирования сети связи
     Определение матриц
    Otpr  MATRIX  ,6,6  ; Матрица для записи отправленных сообщений
    Pol  MATRIX  ,6,6 ; Матрица для записи полученных сообщений
    KPS  MATRIX  ,6,6 ; Матрица для записи коэффициентов пропускной способности
    ; Задание исходных данных
    VrMod EQU    3600  ; Время моделирования,1 ед. мод. вр.=1с
    KolAb EQU    6    ; Количество абонентов сообщений
    Q_     EQU    40000  ; Производительность ВК, оп/c
    V_     EQU  40000  ; Скорость передачи, бит/с
    MaxKat  EQU  4  ; Количество категорий сообщений
    NKan    EQU  12  ; Количество каналов передачи данных
    KolNapr  EQU  4  ; Количество направлений в маршрутизаторе
    KolBK  EQU  2  ; Количество ВК
    T5    EQU  0.1  ; Время включения резервного канала
    EmkBK1  EQU  5000000  ; Ёмкость входного буфера ВК1
    EmkBK2  EQU  5000000  ; Ёмкость входного буфера ВК2
    ; Описание функций, задающих исходные данные
    NaprM1  FUNCTION  P$NumPol,D6 ; Таблица адресов в маршрутизаторе 1
    1,1/2,1/3,2/4,2/5,3/6,4
    NaprM2  FUNCTION  P$NumPol,D4 ; Таблица адресов в маршрутизаторе 2
    1,1/2,2/3,3/4,4
    TOtkBK  FUNCTION  P4,D2  ; Среднее время между отказами ВК
    1,3600/2,3600
    TVosstBK  FUNCTION P4,D2; Среднее время восстановления ВК
    1,3.7/2,3.7
    TOtkKan   FUNCTION  P4,D12 ; Среднее время между отказами каналов
    1,3600/2,3600/3,3600/4,3600/5,3600/6,3600/7,3600/
    8,3600/9,3600/10,3600/11,3600/12,3600
    TVosstKan  FUNCTION  P4,D12 ; Среднее время восстановления каналов
    1,3.2/2,3.2/3,3.2/4,3.2/5,3.2/6,3.2/7,3.2/8,3.2/
    9,3.2/10,3.2/11,3.2/12,3.2
    TimeAb  FUNCTION  P$NumOtpr,D6 ; Среднее время передачи сообщений от абонентов
    1,30/2,30/3,30/4,30/5,30/6,30
    Kat  FUNCTION  RN897,D4 ; Вероятности видов категорий
    .3,1/.5,2/.7,3/1,4
    S_  FUNCTION  P1,D4  ; Средние вычислительные сложности сообщений (длины), оп (байт) по категориям
    1,53000/2,86000/3,66000/4,50000
    So_  FUNCTION  P1,D4  ; Среднеквадратические отклонения вычислительных сложностей (длин) сообщений, оп (байт) по категориям
    1,6100/2,5000/3,7000/4,500
    EmkNaprM1  FUNCTION  P$NumNapr,D4 ; Ёмкости накопителей направлений, байт
    1,250000/2,250000/3,250000/4,250000
    EmkNaprM2  FUNCTION  P$NumNapr,D4 ; Ёмкости накопителей направлений, байт
    5,250000/6,250000/7,250000/8,250000
    BufAb  FUNCTION  P$NumPol,D6  ; Ёмкости входных буферов абонентов
    1,80000/2,80000/3,80000/4,80000/5,80000/6,80000
    Prov1  BVARIABLE  (P$NumPol'E'5)'OR'(P$NumPol'E'6)
    Prov2 BVARIABLE  (FV*NumBK1)'AND'(P2'LE'(EmkBK1-Q*NumBK1))
    Prov3   BVARIABLE  (FV*NumBK2)'AND'(P2'LE'(EmkBK2-Q*NumBK2))
     Арифметические выражения вычисления
    DL  VARIABLE  INT(NORMAL(897,FN$S_,FN$So_))  ; Длин (вычислительных сложностей) сообщений
    VrPer  VARIABLE  (P2/V_) ; Времени передачи сообщения
    VrObr  VARIABLE  P2/Q_  ; Времени обработки сообщения
    ; Сегмент имитации поступления сообщений от источников
      GENERATE  ,,,KolAb    ; Число транзактов по числу абонентов
      SAVEVALUE  Num+,1;Нумерация абонента-отправителя
      ASSIGN  NumOtpr,X$Num ; Номер абонента-отправителя в NumOtpr
    Soob  ADVANCE  (Exponential(897,0,FN$TimeAb))  ; Время отправления сообщений
      SPLIT  1,Soob  ; Создание двойника сообщения
     Розыгрыш абонентов-получателей сообщений
    Met1  SAVEVALUE  VerAb,(RN897/1000); Получение РРСЧ
    Met2  ASSIGN  NumPol+,1 ; В Р$NumPol номер абонента-получателя сообщения
      TEST LE  X$VerAb,(P$NumPol#(1/KolAb)),Met2
      TEST NE  P$NumOtpr,P$NumPol,Met6  ; Отправитель не себе ли отправляет?
     Розыгрыш категории сообщения и счёта сообщений
    Met4  ASSIGN  1,FN$Kat  ; В Р1 код категории и счет сообщений всех категорий
      ASSIGN  TimeVxod,AC1 ; Запись времени входа сообщения в сеть
      ASSIGN  10,(200+P1) ; В Р10 номера Х для счета отправленных сообщений по категориям
      ASSIGN  11,(P10+MaxKat) ; В Р11 номера Х для счета полученных сообщений по категориям
      ASSIGN  12,(P11+MaxKat) ; В Р12 номера Х для счета потерянных сообщений по категориям
      ASSIGN  13,(P12+MaxKat) ; В Р13 номера Х для записи КПС полученных сообщений по категориям
      ASSIGN  14,(P13+MaxKat) ; В Р14 номера Х для записи КПС потерянных сообщений по категориям
      SAVEVALUE  *10+,1 ; Cчет отправленных сообщений по категориям
      MSAVEVALUE Otpr+,P$NumOtpr,P$NumPol,1 ; Запись в матрицу количества отправляемых сообщений абонентам
     Розыгрыш характеристик сообщений
    Met02  ASSIGN  2,V$DL ; Занесение в Р2 длины (вычислительной сложности) сообщения
      ASSIGN  3,V$VrPer ; Занесение в Р3 времени передачи сообщения
      ASSIGN  8,V$VrObr ; Занесение в Р8 времени обработки сообщения
    ; Сегмент имитации работы основных каналов 1-6
    OsnK1  GATE FV  P$NumOtpr,ResK1 ; Исправен ли канал?
      ASSIGN  Vsp1,P$NumOtpr  ; Запись в параметр Vsp1 номера абонента отправителя
      GATE NU  P$Vsp1;Свободен канал с номером в P$Vsp1?
      SEIZE  P$Vsp1; Занять канал с номером в P$Vsp1
      ADVANCE  P3      ; Имитация передачи сообщения
      RELEASE   P$Vsp1 ; Освободить канал с номером в P$Vsp1
    ; Сегмент имитации работы маршрутизатора 1
    Met11  ASSIGN  NumBK1,(2#NKan+1); Запись в параметр номера маршрутизатора как ОКУ
      TEST E  BV$Prov2,1,Met5 ; Исправен ли ВК1 и есть ли место в его буфере?
      QUEUE  P$NumBK1,P2   ; Если есть, поместить в буфер ВК1
    Met14  SEIZE  P$NumBK1     ; Занять ВК1
      DEPART  P$NumBK1,P2    ; Освободить буфер ВК1
      ADVANCE  P8      ; Имитация обработки сообщения
      ASSIGN  NumNapr,FN$NaprM1 ; Определение номера направления маршрутизатора 1  
      RELEASE  P$NumBK1  ; Освобождение ВК1
      TEST LE P2,(FN$EmkNaprM1-Q*NumNapr),Met5; Есть ли место в буфере направления
      QUEUE  P$NumNapr,P2 ; Поместить в буфер направления
      TEST NE P$NumPol,5,Met21 ; Выделение сообщения для абонента 5
      TEST NE P$NumPol,6,Met21 ; Выделение сообщения для абонента 6
      TRANSFER  ,Met15 ; Отправить на маршрутизатор 2 сообщения  для абонентов 1-4 
    Met21  DEPART  P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 1
      TRANSFER  ,Met16 ; Отправить на каналы сообщения для абонентов 5 и 6
    Met15  DEPART  P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 1
    ; Сегмент имитации работы маршрутизатора 2
      ASSIGN  NumBK2,(2#NKan+2)
      TEST E  BV$Prov3,1,Met5 ; Если маршрутизатор 2 исправен и есть место в его буфере, то
      QUEUE  P$NumBK2,P2 ; поместить в буфер маршрутизатора 2
      SEIZE  P$NumBK2  ; Занять BK2
      DEPART  P$NumBK2,P2 ; Покинуть буфер маршрутизатора 2
      ADVANCE  P8  ; Имитация обработки сообщения
      RELEASE  P$NumBK2  ; Освобождение BK2
      TEST E  P$NumPol,1,Met24
    ; Определить номер направления маршрутизатора 2
      ASSIGN  NumNapr,(KolNapr+1) 
      TEST LE  P2,(FN$EmkNaprM2-Q*NumNapr),Met5
      TRANSFER  ,Met25
    Met24  TEST E  P$NumPol,2,Met26
      ASSIGN  NumNapr,(KolNapr+2) ; Определить номер направления маршрутизатора 2
      TEST LE  P2,(FN$EmkNaprM2-Q*NumNapr),Met5
      TRANSFER  ,Met25
    Met26  TEST E  P$NumPol,3,Met27
      ASSIGN  NumNapr,(KolNapr+3) ; Определить номер направления маршрутизатора 2
      TEST LE  P2,(FN$EmkNaprM2-Q*NumNapr),Met5
      TRANSFER  ,Met25
    Met27  TEST E  P$NumPol,4,Met24
      ASSIGN  NumNapr,(KolNapr+4) ; Определить номер направления маршрутизатора 2
      TEST LE  P2,(FN$EmkNaprM2-Q*NumNapr),Met5
    Met25  QUEUE  P$NumNapr,P2 ; Поместить в буфер направления маршрутизатора 2
    ; Сегмент имитации работы основных каналов 7-10  
      ASSIGN  Vsp1,(KolAb+P$NumPol); Определение каналов 7-10
      DEPART  P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 2
      GATE FV  P$Vsp1,ResK2 ; Если исправен основной канал, 
      GATE NU  P$Vsp1  ; и свободен, то
      SEIZE  P$Vsp1  ; занять его
      ADVANCE  P3  ; Передача сообщения
      RELEASE  P$Vsp1  ; Освободить канал
      TRANSFER  ,Met17 ; Отправить для имитации получения сообщения
    ; Сегмент имитации работы основных каналов 11-12  
    Met16  ASSIGN  Vsp1,(KolAb+P$NumPol); Определение каналов 11-12
      GATE FV  P$Vsp1,ResK2 ; Если исправен основной канал, 
      GATE NU  P$Vsp1       ; и свободен, то
      SEIZE  P$Vsp1       ; занять его
    Met20  ADVANCE  P3         ; Передача сообщения
      RELEASE P$Vsp1       ; Освободить канал
    ; Сегмент имитации получения сообщений
    Met17  ASSIGN  Vsp3,(2#KolNapr+P$NumPol); Запись в Vsp3 номера буфера абонента-получателя
      TEST LE P2,(FN$BufAb-Q*Vsp3),Met5 ; Есть ли место в буфере абонента получателя?
      QUEUE  P$Vsp3,P2 ; Поместить сообщение в буфер
      DEPART  P$Vsp3,P2 ; Освободить буфер
      TRANSFER  ,Met10  ; Отправить для счёта полученных сообщений
    ; Сегмент имитации работы резервных каналов 13-18
    ResK1  ASSIGN  Vsp1,(NKan+P$NumOtpr)
      GATE NU  P$Vsp1  ; Свободен ли резервный канал?
      TEST E  X*Vsp1,1,Met7 ; Включить резервный канал
      ADVANCE  T5  ; Включение резервного канала
      SAVEVALUE  P$Vsp1,0 ; Признак того, что резервный канал включён
    Met7  SEIZE  P$Vsp1   ; Занять резервный канал
      ADVANCE  P3  ; Передача
      RELEASE  P$Vsp1   ; Освободить резервный канал
      TRANSFER  ,Met11 ; Отправить на маршрутизатор 1
    ; Сегмент имитации работы резервных каналов 19-24
    ResK2  ASSIGN  Vsp1,(NKan+KolAb+P$NumPol)
      TEST NE  P$NumPol,5,Met22 ; Выделение сообщения для абонента 5
      TEST NE  P$NumPol,6,Met22 ; Выделение сообщения для абонента 6
    Met22  GATE NU  P$Vsp1 ; Свободен ли резервный канал?
      TEST E  X*Vsp1,1,Met8 ; Включить резервный канал
      ADVANCE  T5  ; Включение резервного канала
      SAVEVALUE  P$Vsp1,0 ; Признак включения ResK
    Met8  SEIZE  P$Vsp1  ; Занять резервный канал
      ADVANCE  P3       ; Передача
      RELEASE  P$Vsp1  ; Освободить резервный канал
      TRANSFER  ,Met17 ; Отправить для имитации получения сообщения
    ; Сегмент имитации отказов ВК1
      GENERATE  ,,,1
      ASSIGN  4,(2#NKan+1) ; Номер BK в P4
    Met50  ADVANCE  (Exponential(897,0,FN$TOtkBK)) ; Розыгрыш времени до очередного отказа
      GATE FV  P4,Met50
      FUNAVAIL  P4,RE,Met117 ; Перевод ВК в неисправное состояние
      ADVANCE  (Exponential(897,0,FN$TVosstBK))  ; Имитация восстановления
      FAVAIL  P4  ; Перевод ВК в исправное состояние
      TRANSFER  ,Met50   ; Отправить для розыгрыша очередного отказа
    Met117  RELEASE  P$NumBK1 ; Освобождение ВК прерванным сообщением
      TRANSFER  ,Met5  ; Отправить для счета потерь
    ; Сегмент имитации отказов ВК2
      GENERATE  ,,,1
      ASSIGN  4,(2#NKan+2) ; Номер BK в P4
    Met49  ADVANCE  (Exponential(897,0,FN$TOtkBK)) ; Розыгрыш времени до очередного отказа
      GATE FV  P4,Met49
      FUNAVAIL  P4,RE,Met115 ; Перевод ВК в неисправное состояние
      ADVANCE  (Exponential(897,0,FN$TVosstBK))  ; Имитация восстановления
      FAVAIL  P4  ; Перевод ВК в исправное состояние
      TRANSFER  ,Met49   ; Отправить для розыгрыша очередного отказа
    Met115  RELEASE  P$NumBK2 ; Освобождение ВК прерванным сообщением
      TRANSFER  ,Met5  ; Отправить для счета потерь
    ; Сегмент имитации отказов каналов связи 1-6
      GENERATE  ,,,KolAb ; Число транзактов - по числу каналов связи
      SAVEVALUE  NumKan+,1 ; Записать в X$NumCan последовательно 1, 2, ..., KolAb
      ASSIGN  4,X$NumKan  ; Записать в Р4 последовательно 1, 2, ..., KolAb
    Met19  ADVANCE  (Exponential(897,0,FN$TOtkKan)) ; Розыгрыш времени до очередного отказа
      GATE FV  P4,Met19
      FUNAVAIL  P4,RE,Met112 ; Перевод канала в неисправное состояние
      ASSIGN  NumKan,(NKan+P4)
      SAVEVALUE  P$NumKan,1 ; Признак включения резервного канала
      ADVANCE  (Exponential(47,0,FN$TVosstKan)) ; Имитация восстановления канала
      FAVAIL  P4  ; Перевод в исправное состояние
      TRANSFER  ,Met19   ; Отправить для розыгрыша очередного отказа
    Met112  RELEASE  P$Vsp1   ; Освобождение канала с номером в Р$Vsp1
      TRANSFER  ,Met5  ; Отправить для счета потерь
    ; Сегмент имитации отказов каналов связи 7-12
      GENERATE  ,,,KolAb  ; Число транзактов - по числу каналов связи
      SAVEVALUE  NumKan+,1 ; Записать в X$NumCan последовательно 1, 2, ..., KolAb
      ASSIGN  4,(X$NumKan+KolAb) ; Записать в Р4 последовательно KolAb+1, ...,KolAb+KolAb 
    Met23  ADVANCE  (Exponential(897,0,FN$TOtkKan)) ; Розыгрыш времени до очередного отказа
      GATE FV   P4,Met23
      FUNAVAIL  P4,RE,Met113 ; Перевод канала в неисправное состояние
      ASSIGN  NumKan,(NKan+P4)
      SAVEVALUE  P$NumKan,1 ; Признак включения резервного канала
      ADVANCE  (Exponential(47,0,FN$TVosstKan)) ; Имитация восстановления канала
      FAVAIL  P4  ; Перевод в исправное состояние
      TRANSFER  ,Met23   ; Отправить для розыгрыша очередного отказа
    Met113  RELEASE  P$Vsp1   ; Освобождение канала с номером в Р$Vsp1
      TRANSFER  ,Met5  ; Отправить для счета потерь
    Met6  TERMINATE  ; Уничтожение сообщений, отправленных самим себе
    ; Сегмент счета переданных и потерянных сообщений и расчет вероятностей передачи сообщений
    Met10  SAVEVALUE  *11+,1 ; Cчет в ячейке с номером в Р11 полученных сообщений всего и по категориям
      SAVEVALUE  *13,(X*11/X*10) ; Расчет и сохранение в ячейке с номером в Р13 КПС сети по категориям
      MSAVEVALUE Pol+,P$NumPol,P$NumOtpr,1 ; Счёт и запись в матрицу полученных сообщений
      MSAVEVALUE KPS,P$NumOtpr,P$NumPol, (MX$Pol(P$NumPol,P$NumOtpr)/MX$Otpr(P$NumOtpr,P$NumPol))
      TERMINATE  
    Met5  SAVEVALUE  *12+,1 ; Cчет в ячейке с номером в Р12 потерянных сообщений всего и по категориям
      TERMINATE
    ; Задание времени моделирования и расчёт результатов
      GENERATE  VrMod  ; Задание времени моделирования
      TEST L  X$Prog,TG1,Met30 ; Если X$Prog<TG1,
      SAVEVALUE  Prog,TG1      ; то X$Prog=TG1
    Met30  TEST E  TG1,1,Met32 ; Если TG1=1, расчёт и сохранение результатов
      SAVEVALUE  TimeS,(X$TimeSum/N$Met10) ; Расчёт и сохранение в TimeS среднего времени передачи одного сообщения
      SAVEVALUE  VPerS,(N$Met10/N$Met4)  ; Расчет и сохранение в ячейке VPerS КПС сети
      SAVEVALUE  VPotS,(N$Met5/N$Met4)  ; Расчет и сохранение в ячейке VPotS КПС сети
    Met32 TERMINATE  1
      START  1000

    Интерпретация результатов моделирования

    Всего выполнено 6 экспериментов. Изменение параметров сети связи проводилось так же, как и в предыдущих моделях. То есть в каждом следующем эксперименте параметры, изменённые в предыдущем эксперименте, остаются такими же, если не указано их изменение. В шестом эксперименте кроме указанных параметров были также изменены средние интервалы поступления сообщений от всех абонентов с 30 до 20.

    В Anylogic в поле Конечное время: было введено 3600000.0. Время моделирования увеличено в 1000 раз по числу прогонов модели. В GPSS указывается модельное время 3600 и 1000 прогонов модели.

    Результаты экспериментов сведены в табл. 4.11. Видно, что результаты моделирования отличаются незначительно. Коэффициенты пропускной способности ($$\Delta_{11} … \Delta_{61}$$) отличаются на 0…0,001, а среднее время передачи одного сообщения ($$\Delta_{12} … \Delta_{62}$$) - на 0,075…1,085 с. Коэффициенты загрузки вычислительных комплексов также отличаются на 0…0,020, а коэффициенты загрузки основных каналов - на 0,000…0,001.

    В четвёртом и пятом экспериментах в связи с уменьшением ёмкостей входных буферов ВК1 и ВК2 сообщения второй категории не передаются, так как их средняя длина из всех категорий максимальная.

    Сравнительная оценка позволяет сделать вывод об адекватности результатов моделирования, полученных при использовании для построения моделей одной и той же системы инструментальных средств GPSS World и AnyLogic.

    Машинное время выполнения модели в GPSS World составляет 22 … 24 с, а в AnyLogic примерно 5 мин.

    Показатели функционирования сети связи
    ПоказателиGPSS WorldAnyLogic
    1) Согласно постановке задачи
    Коэффициент пропускной способности сети связи0,8160,815
    $$\Delta_{11}=\mid 0,816-0,815\mid=0,001$$
    Среднее время передачи одного сообщения6,1276,052
    $$\Delta_{12}=\mid6,127-6,052\mid=0,075$$
    Коэффициент загрузки ВК10,2550,255
    Коэффициент загрузки ВК20,170,17
    Средний коэффициент загрузки основных каналов 0,0420,042
    Среднее количество полученных / отправленных сообщений489,930/600,263490,195/601,092
    2) emkBuferVx =…= emkBuferVx = 70000
    Коэффициент пропускной способности сети связи0,7410,741
    $$\Delta_{21}=\mid0,741-0,741\mid=0,000$$
    Среднее время передачи одного сообщения6,1275,867
    $$\Delta_{22}=\mid6,127-5,867\mid=0,260$$
    Коэффициент загрузки ВК10,2550,255
    Коэффициент загрузки ВК20,170,17
    Средний коэффициент загрузки основных каналов 0,0430,043
    Среднее количество полученных / отправленных сообщений444,728/600,263444,863/600,347
    3) emkBuferVx =…= emkBuferVx = 60000
    Коэффициент пропускной способности сети связи0,5990,599
    $$\Delta_{31}=\mid0,599-0,599\mid=0,000$$
    Среднее время передачи одного сообщения6,1325,66
    $$\Delta_{32}=\mid6,132-5,660\mid=0,472$$
    Коэффициент загрузки ВК10,2550,256
    Коэффициент загрузки ВК20,170,17
    Средний коэффициент загрузки основных каналов 0,0430,043
    Среднее количество полученных / отправленных сообщений359,640/600,584360,251/601,104
    4) emkBufer1 = 4 000 000
    Коэффициент пропускной способности сети связи0,5990,6
    $$\Delta_{41}=\mid0,599-0,600\mid=0,001$$
    Среднее время передачи одного сообщения6,1325,65
    $$\Delta_{42}=\mid6,132-5,650\mid=0,482$$
    Коэффициент загрузки ВК10,2550,251
    Коэффициент загрузки ВК20,170,169
    Средний коэффициент загрузки основных каналов 0,0430,042
    Среднее количество полученных / отправленных сообщений359,640/600,584359,651/599,302
    5) emkBufer1 = 3 000 000
    Коэффициент пропускной способности сети связи0,5990,598
    $$\Delta_{51}=\mid0,599-0,598\mid=0,001$$
    Среднее время передачи одного сообщения6,1325,648
    $$\Delta_{52}=\mid6,132-5,648\mid\mid=0,484$$
    Коэффициент загрузки ВК10,2550,256
    Коэффициент загрузки ВК20,170,17
    Средний коэффициент загрузки основных каналов 0,0430,044
    Среднее количество полученных / отправленных сообщений359,640/600,584360,114/601,495
    6) emkBuferVx =…= emkBuferVx = 100000, emkBufer1 = 6 000 000
    Коэффициент пропускной способности сети связи0,9960,996
    $$\Delta_{61}=\mid0,996-0,996\mid=0,000$$
    Среднее время передачи одного сообщения6,1557,237
    $$\Delta_{62}=\mid6,155-7,237\mid=1,082$$
    Коэффициент загрузки ВК10,3620,382
    Коэффициент загрузки ВК20,2380,254
    Средний коэффициент загрузки основных каналов 0,0640,064
    Среднее количество полученных / отправленных сообщений848,296/851,388896,072/899,333
    Страницы:

    Модель в AnyLogic

    Постановка задачи

    В сети связи имеются $$n_1$$ абонентов, обменивающихся между собой сообщениями. Адресация сообщений организована посредством маршрутизаторов. На маршрутизатор поступают сообщения через случайные промежутки времени от $$n_1$$ абонентов со средними интервалами времени $$T_1, T_2, …, T_{n_{1}}$$.

    Сообщения могут быть $$n_2$$ категорий с вероятностями их появления $$p_{k1}}, p_{k2}}, …, p_{kn_{2}}$$ $$(p_{k1}}, p_{k2}}, …, p_{kn_{2}} =1)$$ и вычислительными сложностями обработки $$S_1, S_2, …, S_{n_{2}}$$ операций соответственно.

    Маршрутизатор имеет k входов и k выходов, входной буфер 1 ёмкостью $$L_1$$ байт для хранения сообщений, ожидающих обработки. В маршрутизаторе сообщения обрабатываются вычислительным комплексом (ВК) с производительностью Q операций/с. В случае полного заполнения буфера 1 поступающие на маршрутизатор сообщения теряются. Принято допущение, что одна операция вычислительной сложности соответствует одному байту при размещении сообщения в буфере.

    После обработки сообщения в зависимости от направления передачи поступают в соответствующие буферы, стоящие на входах каждого i-го направления связи, $$i=\overline{1,k}$$. Каждый буфер имеет ёмкость $$L_{2i}$$ байт, $$i=\overline{1,k}$$. В случае полного заполнения буфера направления поступающее сообщение теряется.

    Из буферов сообщения передаются по своим направлениям. Каждое направление имеет основной и резервный каналы связи. Скорость передачи сообщений по основному и резервному каналам связи каждого из направлений $$V_{пi}$$ бит/с, $$i=\overline{1,k}$$.

    ВК и основные каналы связи имеют конечную надёжность. Интервалы времени $$Т_{отВК}$$ и $$Т_{отК_{1}}, Т_{отК_{2}}, …, Т_{отК_{n}}$$ между отказами ВК и каналов связи случайные. Длительности восстановления ВК и каналов связи $$Т_{вВК}$$ и $$Т_{вК_{1}}, Т_{вК_{2}}, …, Т_{вК_{n}}$$ также случайные.

    При отказе обрабатываемые ВК и передаваемые по каналам связи сообщения теряются.

    Исходные данные

    $$n_1 = 6; k = 4;$$ $$exponential(T_1)=exponential(T_2)= … =exponential(T_6)=exponential(30);$$ $$n_2=4; p_{k1}=0,3; p_{k2}=0,2; p_{k3}=0,2; p_{k4}=0,3; $$ $$Q =40000\text{ оп/с}; L_1=5000000;$$ $$normal(S_1, S_{o1})=normal(53000, 6100);$$ $$…$$ $$normal(S_3, S_{o3})=normal(66000, 7000);$$ $$normal(S_4, S_{o4})=normal(50000, 500);$$ $$exponential(T_{отК_{1}})= … =exponential(T_{отК_{2}})= exponential(360);$$ $$exponential(T_{вК_{1}})= … =exponential(T_{вК_{2}})= exponential(3.2);$$ $$exponential(T_{отВК_{1}})=exponential(3600), exponential(T_{вВК}})=exponential(3.7);$$ $$V_{пi}=5000 \text{ бит/с}, n_{3i}=1, L_{2i}=250000, i=\overline{1,4}.$$

    Задание на исследование

    Разработать имитационную модель функционирования сети связи. Исследовать влияние ёмкостей буферов, интервалов времени поступления сообщений, их вычислительных сложностей и других параметров на показатели функционирования сети с целью их оценки и принятия решений при необходимости по улучшению качества обслуживания сети.

    Формализованное описание модели

    Сообщения поступают от $$n_1=6$$ источников. Интервалы поступления сообщений, интервалы между отказами и время восстановления работоспособности распределяются по экспоненциальному закону (exponential), а вычислительные сложности сообщений в зависимости от категорий - по нормальному закону (normal). Для некоторых одинаковых параметров с целью упрощения принято, что они имеют равные значения, например, средние значения интервалов поступления сообщений. Модель же будет построена в некотором приближении универсальной так, что все эти значения могут быть любыми.

    Вариант сети связи при принятых исходных данных (в том числе количестве входов и выходов маршрутизатора) может быть представлен в следующем виде (рис. 4.1).

    (рис 4.1) Вариант схемы сети связи

    Сообщения абонентов А4 - на вход 2 маршрутизатора М1, абонента А5 - на вход 3 маршрутизатора М1, абонента А6 - на вход 4 маршрутизатора М1.

    Маршрутизатор М1 настроен таким образом, что сообщения, адресованные абонентам А1 и А2 поступают на вход 1 маршрутизатора М2, а абонентам А3 и А4 - на вход 2 маршрутизатора М2.

    Маршрутизатор М2 настроен так, что его выходы 1…4 подключены к каналам связи, по которым передаются сообщения, адресованные абонентам А1…А4 соответственно.

    Видно, что система связи представляет собой многофазную многоканальную систему массового обслуживания замкнутого типа с ограниченными ёмкостями буферов (накопителей), то есть с отказами.

    Теперь представим маршрутизатор также как систему массового обслуживания и в общем виде (рис. 4.2).

    (рис 4.2) Маршрутизатор как система массового обслуживания

    В маршрутизаторе выделены блок контроля 1, накопитель (буфер) ВК, непосредственно ВК, блок контроля 2, накопители направлений связи.

    Назначение и функции выделенных в структуре сети связи и маршрутизаторе блоков будет рассмотрено позже в ходе изложения технологии построения модели в AnyLogic.

    Следует иметь в виду, что возможны и другие варианты декомпозиции сети связи как системы. Тем более что нами взята с учебной точки зрения одна из простых схем лишь для демонстрации цели работы.

    Сообщения, поступающие на маршрутизатор, должны иметь следующие параметры:

  • numAbOtpr - номер абонента-отправителя сообщения;
  • numAbPol - номер абонента-получателя сообщения;
  • numKat - номер категории сообщения;
  • timeOtpr - время отправления сообщения абонентом;
  • dlina - длина сообщения, байт;
  • timeObr - время обработки сообщения ВК, с;
  • timePered - время передачи сообщения по каналу связи, с.
  • Эти параметры получаются путем розыгрыша по следующим исходным данным:

  • kolAbonent - количество абонентов;
  • timeAbonent - среднее время отправления сообщений абонентом, с;
  • verKat={verKat1, verKat2, verKat3, verKat4} - вероятности распределения видов сообщений первой, второй, третьей и четвёртой категорий соответственно,
  • verKat1+verKat2+verKat3+verKat4=1; dlKat={dlKat1, dlKat2, dlKat3, dlKat4} - средние длины сообщений, байт, первой, второй, третьей и четвёртой категорий соответственно;
  • dlKat0={dlKat01, dlKat02, dlKat03, dlKat04} - стандартные отклонения длин сообщений, байт, первой, второй, третьей и четвёртой категорий соответственно;
  • proizvod - производительность ВК при обработке сообщения, оп/c;
  • skorPeredKan - среднее время передачи сообщений по каналу связи, бит/с;
  • skorPeredKanR - среднее время передачи сообщений по резервному каналу связи, бит/с;
  • timeBklKanR - время включения резервного канала связи.
  • В ходе моделирования собирается следующая статистика:

  • kolOtprKat1, kolOtprKat2, kolOtprKat3, kolOtprKat4, kolOtpr - количество отправленных абонентом сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • kolPolKat1, kolPolKat2,kolPolKat3,kolPolKat4, kolPol - количество полученных абонентом сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • всегоОтпрКат1, всегоОтпрКат2, всегоОтпрКат3, всегоОтпрКат4, всегоОтпр - количество отправленных в сети сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • всегоПолКат1, всегоПолКат2, всегоПолКат3, всегоПолКат4, всегоПол - количество полученных в сети сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • количество отправленных сообщений каждым абонентом каждому абоненту сети;
  • количество полученных сообщений каждым абонентом от каждого абонента сети.
  • По этим статистическим данным рассчитываются:

  • коэффициенты пропускной способности между всеми абонентами сети;
  • коэфПропСпособ - коэффициент пропускной способности сети связи;
  • врПередачи - среднее время передачи абоненту одного сообщения;
  • врПередСооб - среднее время передачи в сети связи одного сообщения.
  • Коэффициенты пропускной способности определяются как отношение количества полученных сообщений к отправленным сообщениям.

    В модели также для выполнения условий ограничения ёмкостей буферов необходимо использовать:

  • emkBuferVx - ёмкость входного буфера абонента, байт;
  • tekEmkBuferVx - текущую ёмкость входного буфера абонента, байт;
  • emkBufer1 - ёмкость входного буфера маршрутизатора, байт;
  • tekEmkBufer1 - текущая ёмкость входного буфера, байт;
  • emkBuferNapr1,emkBuferNapr2,emkostBuferNapr3, emkBuferNapr4 - ёмкости на входах каналов связи первого, второго, третьего и четвёртого направлений соответственно, байт;
  • tekEmkNapr1, tekEmkNapr2, tekEmkNapr3,tekEmkNapr4 - текущие ёмкости на входах каналов связи первого, второго, третьего и четвёртого направлений соответственно, байт.
  • Отказы и восстановление ВК и каналов связи разыгрываются по следующим данным:

  • timeOtkВК - среднее время между отказами ВК;
  • timeVosstВК - среднее время восстановления ВК;
  • timeOtkKan - среднее время между отказами канала связи;
  • timeVosstKan - среднее время восстановления канала связи.
  • Создание новых классов активных объектов

    Построение модели начнём с создания новых классов активных объектов. Напомним, что согласно рис. 4.1 в сети связи выделены следующие сегменты (компоненты):

  • абонент;
  • маршрутизатор;
  • канал.
  • Реализуем эти сегменты средствами AnyLogic, а потом из них, как из созданных нами элементов, будем строить сеть на корневом объекте Main.

    Создайте три новых класса активных объектов: Абонент, Канал, Маршрутизатор.

  • Выполните команду Файл/Создать/Модель на панели инструментов. Появится диалоговое окно Новая модель.
  • Задайте имя новой модели. В поле Имя модели введите Сеть_связи. Выберите каталог, в котором будут сохранены файлы модели.
  • Щелкните кнопку Далее. Откроется вторая страница Мастера создания модели. Выберите Начать создание модели "с нуля". Щелкните кнопку Далее.
  • На панели Проекты щёлкните правой кнопкой Main и выберите из контекстного меню Создать/Класс активного объекта.
  • Откроется окно Новый класс активного объекта.
  • Введите в поле Имя: имя нового класса Абонент.
  • Если нужно, в поле Описание: введите описание назначения класса Абонент. Щелкните Готово. При построении даже таких моделей это целесообразно делать.
  • Также создайте классы Канал и Маршрутизатор.
  • Создание областей просмотра

    Последовательно переходите на классы объектов Main, Абонент, Канал, Маршрутизатор и создайте на каждом области просмотра. На них мы будем размещать элементы событийной части модели, а также исходные данные, переменные для промежуточных вычислений и результаты моделирования.

    Значения свойств элементов Область просмотра установите согласно табл. 4.1.

    Для всех областей просмотра оставьте Выравнивать по: Верхнему левому углу, установите из списка Масштабирование: Подогнать под окно.

    СвойстваОбъекты
    MainАбонентМаршрутизаторКанал
    Имя:облСетьоблАбонентоблМаршоблКанал
    Х:0000
    Y:0000
    Ширина:770810740400
    Высота:470360470340
    Имя:viewDataviewDataviewDataviewData
    Х:870000
    Y:600700550700
    Ширина:470450330400
    Высота:620420250180
    Имя:
    Х:00
    Y:6001200
    Ширина:442470
    Высота:820432

    Приступим к созданию сегментов сети связи.

    Сегмент Абонент

    Исходные данные

  • Откройте объект Абонент.
  • Перейдите на область просмотра viewData.
  • Перетащите из палитры Презентация элемент Скругленный прямоугольник. На странице Основные оставьте Имя:, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 5, Y: 745, Ширина: 435, Высота: 365.
  • Перетащите два элемента text и на странице Основные панели Свойства в поле Текст: введите Исходные данные и Результаты соответственно (рис. 4.3). (рис 4.3) Размещение элементов Параметр и Простая переменная
  • Переход между областями просмотра в ходе моделирования организуйте позднее.
  • Перетащите из палитры Основная элементы Простая переменная, разместите и дайте им имена согласно рис. 4.3. Тип всех простых переменных, кроме tekEmkBuferVx, установите double. Тип tekEmkBuferVx - int. Простые переменные предназначены для промежуточных вычислений и сбора статистических данных за одного абонента.
  • Перетащите элементы Параметр, разместите и дайте имена как на рис. 4.3. Тип всех элементов Параметр, кроме emkBuferVx и numAbonent, double. Тип emkBuferVx и numAbonent - int. Значения свойств установите согласно табл. 4.2.
  • ИмяМассивРазмерностьЗначение по умолчанию
    6
    30
    100
    1
    80000
    verKatУстановить флажкиKolKat{0.3, 0.5, 0.7, 1.0}
    KolKat{53000,86000,66000,50000}
    KolKat{6100,5000,7000,500}

    На рис. 4.2 видно, что элементы verKat, dlKat, dlKatO используются как массивы, размерность которых равна числу категорий сообщений. Создайте размерность KolKat.

  • Щёлкните правой кнопкой мышки в панели Проекты и в контекстном меню выберите Размерность.
  • В открывшемся окне Размерность в поле Имя: введите KolKat. Если введёте kolKat, в окне Ошибки появится сообщение: По соглашению, имена типов Java обычно начинаются с заглавной буквы.
  • Установите Тип размерности: Диапазон.
  • В открывшееся поле Диапазон: введите 1-4.
  • Щёлкните Готово.
  • Теперь создайте массив verKat.

  • Выделите элемент Параметр (см. рис. 4.3).
  • На странице Основные панели Свойства установите флажок Массив. Рядом появится значок {…}. Щёлкните по нему.
  • Откроется страница свойств Массив. В окошке Возможные размерности: выделите KolКат.
  • Щелкните кнопку . Размерность KolКат появится в окошке Выбранные размерности.
  • Вернитесь на страницу Основные панели Свойства.
  • В поле Значение по умолчанию: введите:
    {0.3, 0.5, 0.7, 1.0}
  • Создайте также массивы dlKat, dlKatO одинаковой размерности KolKat. Данные в поле По умолчанию введите из табл. 4.2.
  • Для получения стандартной статистической информации о времени передачи сообщений по каждому источнику добавьте элемент сбора статистики.

  • Перетащите элемент Данные гистограммы с палитры Статистика.
  • Задайте свойства элемента:
  • измените Имя: на врПередачи;
  • сделайте Количество интервалов: равным 10;
  • задайте Нач. размер интервалов: 0.01.
  • Теперь можно было бы приступить к построению событийной части сегмента. Однако вы решили вывести результаты моделирования в более презентабельном виде. Поэтому целесообразнее организовать этот вывод, поскольку полученные при этом данные (имена, опции и др.) необходимы будут в дальнейшем при написании кода в событийной части сегмента.

    Результаты моделирования по каждому абоненту

    Вариант размещения элементов для вывода результатов моделирования показан на рис. 4.4.

    Для вывода количественных показателей использован элемент Текстовое поле из палитры Элементы управления и элемент Гистограмма из палитры Статистика.

  • В Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра облАбонент.
  • На странице Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 13, Y: 1250, Ширина: 447, Высота: 371. (рис 4.4) Размещение элементов для вывода результатов моделирования
  • Перетащите элемент text. В поле Текст: введите Результаты моделирования.
  • В Палитре выделите Элементы управления. Перетащите элементы Текстовое поле на элемент Результаты моделирования. Разместите их так, как показано на рис. 4.4. Значения свойств установите согласно табл. 4.3. У элементов editbox и editbox5 Ширина: 100, Высота: 31. У остальных - Ширина: 50.
  • Осталось поместить элемент для обработки и вывода статистической информации о времени передачи одного сообщения.

  • В Палитре выделите Статистика.
  • Перетащите элемент Гистограмма. Характеристики его размещения даны в табл. 4.3.
    Всего сообщений получено Получено сообщений по категориям
    editboxeditbox1editbox2editbox3editbox4
    X: 21X: 177X: 247X: 317X: 389
    Y: 1310Y: 1310Y: 1310Y: 1310Y: 1310
    Всего сообщений отправленоОтправлено сообщений по категориям
    editbox5editbox6editbox7editbox8editbox9
    X: 19X: 179X: 249X: 319X: 389
    Y: 1390Y: 1390Y: 1390Y: 1390Y: 1390
    Время передачи сообщения
    МинимальноеМаксимальноеСреднее
    editbox13editbox12editbox15
    X: 319X: 319X: 319
    Y: 1470Y: 1520Y: 1570
    сhart-Гистограмма
    X: 19Y: 1450Ширина: 240Высота: 160
  • На странице Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • Щёлкните кнопку Добавить данные и введите в поле Данные: имя врПередачи.
  • В поле Заголовок: введите Время передачи.
  • Значения остальных свойств (цвет и др.) установите по собственному усмотрению.
  • Добавьте остальные элементы презентации (номера категорий сообщений, другую текстовую информацию) согласно рис. 4.4.
  • И снова, прежде чем перейти к построению событийной части сегмента Абонент, разместим на корневом объекте Main необходимые элементы для сбора статистических данных, обработки, расчёта показателей качества обслуживания сети и их вывода. Это необходимо сделать по той причине, что также имена этих элементов нужны будут при написании кода в сегменте Абонент.

    Показатели качества обслуживания сети связи

  • Откройте корневой объект Main.
  • Перейдите на область просмотра ViewData.
  • Перетащите или скопируйте элементы Простая переменная, разместите и дайте имена согласно рис. 4.5. (рис 4.5) Элементы для сбора и обработки данных за сеть в целом
  • Тип всех переменных double. Переменные отпр11…отпр66 предназначены для накопления статистических данных о количестве отправленных сообщений абонент - абонент. Например, отпр23 - количество сообщений, отправленных абонентом 2 абоненту 3, а отпр32 - количество сообщений, отправленных абонентом 3 абоненту 2. По этим данным рассчитываются коэффициенты пропускной способности кПрСп12…кПрСп66 абонент - абонент.
  • Выровняйте элементы. Выделите нужные элементы, щелкните правой кнопкой мышки, выберите Выравнивание.
  • Перетащите элемент Данные гистограммы с палитры Статистика.
  • Задайте свойства элемента:
  • измените Имя: на врПередСооб;
  • сделайте Количество интервалов: равным 10;
  • задайте Нач. размер интервалов: 0.01.
  • Теперь организуем вывод в более презентабельном виде. На рис. 4.6 показаны элементы для вывода показателей качества обслуживания сети связи. Часть результатов моделирования будем выводить в таком же виде и такие же, как и для каждого абонента.

  • Перейдите на область просмотра ViewResult.
  • Откройте объект Абонент.
  • Скопируйте элементы в скруглённом прямоугольнике с именем Результаты моделирования.
  • Перейдите на корневой объект Main и вставьте скопированные элементы в верхнюю часть области просмотра ViewResult (см. рис. 4.6).
  • Добавьте элемент Текстовое поле (editbox10) для вывода коэффициента пропускной способности сети.
  • Внесите правки в текстовые сообщения согласно рис. 4.6.
  • В Палитре выделите Статистика. Перетащите элемент Гистограмма.
  • На странице Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • Щёлкните кнопку Добавить данные и введите в поле Данные: имя врПередачи.
  • В поле Заголовок: введите Время передачи.
  • Значения остальных свойств (цвет и др.) установите по собственному усмотрению.
  • В Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра результатов ViewResult. (рис 4.6) Вывод показателей качества обслуживания сети
  • На странице Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 1000, Ширина: 420, Высота: 410.
  • Перетащите элемент text. В поле Текст: введите Коэффициенты пропускной способности абонент-абонент.
  • В Палитре выделите Элементы управления. Перетащите элемент Текстовое поле. Разместите X: 20, Y: 1078, Ширина: 48, Высота: 25. В поле Имя: введите КПрСп11. Сбросьте флажок Отображать имя.
  • Перетащите элемент text. В поле Текст: введите КПрСп11.
  • Скопируйте элементы text и Текстовое поле. Вставьте их пять раз согласно рис. 4.6. При этом в полях Имя: последовательно меняются имена КПрСп12… КПрСп16. Но поле Текст: останется неизменным, т.е. КПрСп11. Внесите правки в соответствии с рис. 4.6. Элемент text добавлен потому, что в ходе моделирования имя элемента Текстовое поле не отображается.
  • Аналогичным образом добавьте остальные элементы text и Текстовое поле согласно рис. 4.6.
  • Теперь можно перейти к построению событийной части сегмента.

    Построение событийной части сегмента

    Событийная часть сегмента, назовём её блок Абонент1, предназначена для имитации отправителя-получателя сообщений, поступления сообщений через случайные интервалы времени, розыгрыша параметров сообщений и счёта количества всего отправленных-полученных сообщений по категориям и абонентам, запоминания времени поступления каждого сообщения, используемого в последующем для расчёта минимального, максимального и среднего времени передачи одного сообщения.

    Алгоритм блока Абонент1 приведен на рис. 4.7, а его реализация средствами AnyLogic - на рис. 4.8.

  • Из палитры Презентация перетащите элемент Прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 50, Ширина: 450, Высота: 380.
  • Перетащите элемент text и в поле Текст: введите Абонент1. (рис 4.7) Алгоритм блока Абонент1
  • Перетащите из Основной библиотеки (Enterprise Library) объект source. Поместите его так же, как на рис. 4.8. Остальные объекты блока Абонент1 вы будете размещать по мере необходимости.
  • При построении модели нам придётся воспользоваться Java-кодом, в котором потребуются дополнительные поля сообщений. Для этого мы должны создать нестандартный класс заявки с дополнительными полями для записи и хранения параметров, о которых мы упоминали ранее (см. п. 4.1.4).

    (рис 4.8) Реализация блока Абонент1 средствами AnyLogic

    Создайте класс заявки Message.

  • Выделите объект source.
  • В панели Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса: Message.
  • В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса (в ранних версиях - anylogic.libraries.enterprise.Entity). Щелкните кнопку Далее.
  • Появится вторая страница Мастера создания Java класса. Добавьте поля Java класса, показанные на рис. 4.9. (рис 4.9) Дополнительные поля класса заявок Message
  • Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
  • Щелкните Готово. Закройте редактор кода.
  • Продолжим построение блока Абонент1.

  • Выделите объект source. На странице Основные панели Свойства установите следующие свойства:
  • Класс заявки: Message
  • Заявки прибывают согласно Времени между прибытиями
  • Время между прибытиями exponential(1/timeAbonent)
  • Количество заявок, прибывающих за один раз 1
  • Новая заявка new Message()
  • Действие при выходе
    double a=0;
    double b=kolAbonent;
       // Розыгрыш номера получателя сообщения
        a=uniform();
     for (int i=1; i<(kolAbonent+1); i++)
         {if (a<=((1/kolAbonent)*b))
            entity.numAbPol=i;
             b=b-1;}   
    entity.timeOtpr=time();
    entity.numAbOtpr=numAbonent;
  • Объект source будет генерировать сообщения с интервалами времени, распределёнными по экспоненциальному закону. Принято, что сообщения от данного абонента-отправителя с равной вероятностью могут быть отправлены любому абоненту сети. Поэтому разыгрывается номер абонента-получателя сообщения, и заносится в numAbPol. В поле timeOtpr заносится время отправления сообщения.

    Замечание. Основная библиотека (Enterprise Library) содержит объекты TimeMeasureStart и TimeMeasureEnd, позволяющие измерять время прохождения заявки между двумя заданными точками диаграммы процесса. TimeMeasureStart запоминает момент времени, в который заявка проходит через этот объект. TimeMeasureEnd вычисляет для поступившей в него заявки разность между текущим временем и запомненным объектом TimeMeasureStart, на который ссылается этот объект. Эта разность добавляется в элементы сбора статистики, встроенные в объект TimeMeasureEnd.
  • Перетащите объект selectOutput. Соедините его вход с выходом объекта source. Объект selectOutput выделяет и направляет объекту sink на уничтожение сообщения, адресованные абоненту-отправителю, то есть самому себе. Перетащите объект sink. Его вход соедините с выходом T объекта selectOutput.
  • Перетащите объект selectOutput5. Данный объект предназначен для розыгрыша категорий отправляемых сообщений. Его вход соедините с выходом F объекта selectOutput. На странице Основные панели Свойства установите свойства согласно табл. 4.4. Эти свойства являются кодом. Код предназначен для счёта отправленных сообщений за сеть связи в целом и по категориям сообщений, определения количества отправленных сообщений за один прогон, розыгрыша длин сообщений по категориям, вывода расчётов по каждому абоненту, а также за сеть связи в целом.
  • Перетащите два объекта selectOutput5 (имена selectOutput1 и selectOutput2). Объекты предназначены для разделения и счёта отправляемых сообщений по абонентам.
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    Класс заявки:Message
    Использовать:Условия
    Действие при входе:a=uniform();
    f++;
    kolOtpr=f/kolProg;
    editbox5.setText(kolOtpr, true);
    get_Main().f++;
    get_Main().всегоОтпр=get_Main().f/
    kolProg;
    get_Main().editbox5.setText(get_Main().
    всегоОтпр, true);
    Условие 0a<=verKat.get(1)
    Действие при выходе 0entity.numKat=1;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina=(int)(b);
    d1++;
    kolOtprKat1=d1/kolProg;
    editbox6.setText(kolOtprKat1, true);
    get_Main().d1++;
    get_Main().всегоОтпрКат1=get_Main().d1/kolProg;
    get_Main().editbox6.setText(get_Main().всегоОтпрКат1, true);
    Условие 1a<=ver verKat.get(2)
    Действие при выходе 1entity.numKat=2;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina = (int)(b);
    d2++;
    kolOtprKat2=d2/kolProg;
    editbox7.setText(kolOtprKat2, true);
    get_Main().d2++;
    get_Main().всегоОтпрКат2=get_Main().d2/kolProg;
    get_Main().editbox7.setText(get_Main().всегоОтпрКат2, true);
    Условие 2a<=verKat.get(3)
    Действие при выходе 2entity.numKat=3;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina=(int)(b);
    d3++;
    kolOtprKat3=d3/kolProg;
    editbox8.setText(kolOtprKat3, true);
    get_Main().d3++;
    get_Main().всегоОтпрКат3=get_Main().d3/ kolProg;
    get_Main().editbox8.setText(get_Main().всегоОтпрКат3, true);
    Условие 3a<=verKat.get(4)
    Действие при выходе 3entity.numKat=4;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina=(int)(b);
    d4++;
    kolOtprKat4=d4/kolProg;
    editbox9.setText(kolOtprKat4, true);
    get_Main().d4++;
    get_Main().всегоОтпрКат4=get_Main().d4/kolProg;
    get_Main().editbox9.setText(get_Main().всегоОтпрКат4, true);
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Условие 1entity.numAbPol==2
    Действие при выходе 1отпрАб2++;
    get_Main().отпр12=отпрАб2;
    Условие 2entity.numAbPol==3
    Действие при выходе 2отпрАб3++;
    get_Main().отпр13=отпрАб3;
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Действие при выходе 0отпрАб4++;
    get_Main().отпр14=отпрАб4;
    Условие 1entity.numAbPol==5
    Действие при выходе 1отпрАб5++;
    get_Main().отпр15=отпрАб5;
    Условие 2entity.numAbPol==6
    Действие при выходе 2отпрАб6++;
    get_Main().отпр16=отпрАб6;
  • Перетащите объект queue. Укажите его свойства: Имя:Буфер. Класс заявки: Message. Вместимость 100. Соедините выходы 0…3 selectOutput1 с входом элемента Буфер (см. рис. 4.8).
  • Соедините выход по умолчанию selectOutput1 с входом selectOutput2. Через этот выход будут проходить на selectOutput2 сообщения, адресованные абонентам 4, 5 и 6.
  • Выделите selectOutput2 и установите значения свойств, указанных также в табл. 4.4. Соедините все выходы selectOutput2 с входом элемента Буфер.
  • Отправляемое сообщение поступило в буфер. Дальше оно должно попасть в канал связи. Создайте порты для отправления и приёма сообщений.

  • Из палитры Презентация перетащите элемент Скруглённый прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 210, Y: 100, Ширина: 65, Высота: 60.
  • Из палитры Основная перетащите два элемента порт. Разместите их как на рис. 4.8. В поле Имя: замените предложенное системой на вх и вых.
  • Обратите внимание на то, чтобы у элементов Скруглённый прямоугольник и порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Абонент1 этот флажок должен быть сброшенным.
  • Итак, отправляемое сообщение поступило в канал связи, подключённый к порту вых.

    Через порт вх сообщения поступают из канала связи. Продолжим построение блока Абонент1.

  • Перетащите объект selectOutput (имя selectOutput3). Он предназначен для контроля текущей ёмкости входного буфера. В случае заполнения буфера, сообщения теряются.
  • Соедините порт вх с входом объекта selectOutput3.
  • Перетащите объект sink (имя sink1). Его вход соедините с выходом F объекта selectOutput3.
  • Выделите объект selectOutput3 и установите его свойства:
  • Класс заявки: Message
  • Выход true выбирается При выполнении условия
  • Условие emkBuferVx-tekEmkBuferVx>=entity.dlina
  • Перетащите объект queue. Укажите его свойства:
  • Имя: БуферВх
  • Класс заявки: Message
  • Вместимость emkBuferVx
  • Действие при входе tekEmkBuferVx+=entity.dlina;
  • Действие при выходе tekEmkBuferVx-=entity.dlina;
  • Соедините его вход с выходом Т объекта selectOutput3.

  • Перетащите объект selectOutput5 (имя selectOutput4). Он предназначен для разделения потока полученных сообщений по категориям. На странице Основные панели Свойства установите свойства согласно табл. 4.5. Эти свойства также являются кодом. Код предназначен для счёта полученных сообщений за сеть связи в целом и по категориям сообщений, определения количества полученных сообщений за один прогон, вывода расчётов за каждого абонента, а также за сеть связи в целом.
  • Соедините выход элемента БуферВх с выходом объекта selectOutput4.
    СвойствоselectOutput4
    Класс заявки:Message
    Использовать:Условия
    Действие при входе:g++;
    kolPol=g/kolProg;
    editbox.setText(kolPol, true);
    get_Main().g++;
    get_Main().всегоПол=get_Main().g/
    kolProg;
    get_Main().editbox.setText(get_Main().всегоПол, true);
    Условие 0entity.numKat==1
    Действие при выходе 0k1++;
    kolPolKat1=k1/kolProg;
    editbox1.setText(kolPolKat1, true);
    get_Main().k1++;
    get_Main().всегоПолКат1=get_Main().k1/kolProg;
    get_Main().editbox1.setText(get_Main().всегоПолКат1, true);
    Условие 1entity.numKat==2
    Действие при выходе 1k2++;
    kolPolKat2=k2/kolProg;
    editbox2.setText(kolPolKat2, true);
    get_Main().k2++;
    get_Main().всегоПолКат2=get_Main().k2/kolProg;
    get_Main().editbox2.setText(get_Main().всегоПолКат2, true);
    Условие 2entity.numKat==3
    Действие при выходе 2k3++;
    kolPolKat3=k3/kolProg;
    editbox3.setText(kolPolKat3, true);
    get_Main().k3++;
    get_Main().всегоПолКат3=get_Main().k3/kolProg;
    get_Main().editbox3.setText(get_Main().всегоПолКат3, true);
    Условие 3entity.numKat==4
    Действие при выходе 3k4++;
    kolPolKat4=k4/kolProg;
    editbox4.setText(kolPolKat4, true);
    get_Main().k4++;
    get_Main().всегоПолКат4=get_Main().k4/kolProg;
    get_Main().editbox4.setText(get_Main().всегоПолКат4, true);
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Условие 1entity.numAbOtpr==2
    Действие при выходе 1отАб2++;
    get_Main().кПрСп21=отАб2/get_Main().
    отпр21;
    get_Main().КПрСп21.setText(get_Main().кПрСп21, true);
    Условие 2entity.numAbOtpr==3
    Действие при выходе 2отАб3++;
    get_Main().кПрСп31=отАб3/get_Main().
    отпр31;
    get_Main().КПрСп31.setText(get_Main().кПрСп31, true);
    Условие 3entity.numAbOtpr==4
    Действие при выходе 3отАб4++;
    get_Main().кПрСп41=отАб4/get_Main().
    отпр41;
    get_Main().КПрСп41.setText(get_Main().кПрСп41, true);
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Действие при выходе 0отАб5++;
    get_Main().кПрСп51=отАб5/get_Main().
    отпр51;
    get_Main().КПрСп51.setText(get_Main().кПрСп51, true);
    Условие 1entity.numAbOtpr==6
    Действие при выходе 1отАб6++;
    get_Main().кПрСп61=отАб6/get_Main().
    отпр61;
    get_Main().КПрСп61.setText(get_Main().кПрСп61, true);
  • Перетащите два объекта selectOutput5 (имена selectOutput5 и selectOutput6). Объекты предназначены для разделения и счёта получаемых сообщений по абонентам. Значения свойств установите также согласно табл. 4.5. Выход по умолчанию объекта selectOutput5 соедините с входом объекта selectOutput6.
  • Перетащите объект sink2. Его вход соедините с выходами 0…3 объекта selectOutput5 и выходами объекта selectOutput6.
  • Установите свойства объекта sink2 согласно табл. 4.6. Код рассчитывает коэффициент пропускной способности сети связи и время передачи одного сообщения.
  • Свойствоsink2
    Класс заявки:Message
    Действие при входе:врПередачи.add(time()-entity.timeOtpr);
    editbox11.setText(врПередачи.mean(), true);
    editbox12.setText(врПередачи.max(), true);
    editbox13.setText(врПередачи.min(), true);
    get_Main().коэфПропСпособ=get_Main().
    всегоПол/get_Main().всегоОтпр;
    get_Main().editbox10.setText(get_Main().коэфПропСпособ, true);
    get_Main().врПередСооб.add(time()-entity.timeOtpr);
    get_Main().editbox11.setText(get_Main().врПередСооб.mean(), true);
    get_Main().editbox12.setText(get_Main().врПередСооб.max(), true);
    get_Main().editbox13.setText(get_Main().врПередСооб.min(), true);

    Сегмент Маршрутизатор

    Исходные данные

  • Откройте объект Маршрутизатор.
  • Перейдите на область просмотра viewData.
  • Перетащите из палитры Презентация элемент Скругленный прямоугольник. На странице Основные в поле Имя: оставьте имя, предложенное системой.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 600, Ширина: 314, Высота: 190.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Исходные данные (рис. 4.9.).
  • Перетащите элементы Параметр и Простая переменная. Разместите их и дайте имена согласно рис. рис. 4.10.
  • Значения по умолчанию элементов Параметр установите согласно табл. 4.7.
  • Тип timeOtkBK, timeVosstBK, proizvod установите double, остальных параметров и простых переменных - int.
  • (рис 4.10) Исходные данные сегмента Маршрутизатор
    ИмяЗначение по умолчаниюИмяЗначение по умолчанию
    emkBufer15000000emkBuferNapr1250000
    timeOtkBK3600emkBuferNapr2250000
    timeVosstBK3,7emkBuferNapr3250000
    proizvod40000emkBuferNapr4250000

    Событийная часть сегмента Маршрутизатор

    Элементы событийной части сегмента Маршрутизатор показаны на рис. 4.11. Сегмент включает Вычислительный комплекс, Буфер 2, порты входа-выхода, Имитатор отказов вычислительного комплекса.

    В свою очередь вычислительный комплекс содержит Блок контроля 1, Буфер 1, Блок обработки сообщений.

    Приступим к построению событийной части сегмента Маршрутизатор.

    Блок контроля 1

    Блок предназначен для контроля текущей емкости буфера 1 маршрутизатора. Он анализирует наличие в буфере 1 свободной памяти, достаточной для хранения поступившего сообщения, и в зависимости от результата анализа сообщение либо помещается в буфер 1, либо уничтожается.

    Алгоритм работы Блока контроля 1 представлен на рис. 4.12.

    В AnyLogic этот алгоритм реализуется блоками selectOutput, hold и sink.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 26, Y: 50, Ширина: 154, Высота: 150.
  • Перетащите объекты selectOutput, hold и sink на диаграмму класса Маршрутизатор, разместите и соедините так, как показано на рис. 4.11.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Блок контроля 1.
  • Выделите объект selectOutput.
  • В поле Имя: вместо selectOutput введите blokKontrol_1.
  • В поле Класс заявки: Entity замените Message. (рис 4.11) Событийная часть сегмента Маршрутизатор (рис 4.12) Алгоритм работы Блока контроля 1
  • Установите Выход true выбирается При выполнении условия.
  • В поле Условие введите условие:
    (emkostBufer1-tekEmkostBufer1>=entity.dlina)
    (hold.isBlocked()==false)

    При выполнении условия заявка направляется на выход T (выходной порт для заявок, для которых выбирается выход true) и на выход F (выходной порт для заявок, для которых выбирается выход false), если условие не выполняется, соответственно.

  • Выделите объект sink. В поле Класс заявки: Entity замените Message.
  • В поле Действие при входе введите kolPotBK++; для счёта количества сообщений, потерянных при отказе вычислительного комплекса.
  • Выделите элемент hold. В поле Класс заявки: Entity замените Message.
  • Блок Буфер 1

    Блок Буфер 1 предназначен для приема, размещения и хранения поступающих на обработку сообщений.

    Алгоритм работы блока Буфер 1 приведен на рис. 4.13.

    В AnyLogic алгоритм блока Буфер 1 реализуется объектом queue, который выполняет функции очереди (FIFO).

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 190, Y: 50, Ширина: 126, Высота: 100.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Буфер 1. (рис 4.13) Алгоритм работы блока Буфер 1
  • Выделите объект queue.
  • В поле Имя: вместо queue введите bufer1.
  • В поле Класс заявки: Entity замените Message.
  • В поле Вместимость введите emkBufer1.
  • При помещении сообщения в буфер его текущая емкость увеличивается, поэтому в поле Действие при входе введите:
    tekEmkBufer1 += entity.dlina;
  • При выходе сообщения из буфера его текущая емкость уменьшается, поэтому в поле Действие при выходе введите:
    tekEmkBufer1 = -entity.dlina;
  • Поставьте флажок Включить сбор статистики.
  • Блок обработки сообщений

    Блок предназначен для имитации обработки сообщений.

    Алгоритм работы блока приведен на рис. 4.14.

    (рис 4.14) Алгоритм работы Блока обработки сообщений

    Для реализации алгоритма Блока обработки сообщений в AnyLogic используется объект delay.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 336, Y: 50, Ширина: 194, Высота: 100.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Блок обработки сообщений.
  • Перетащите объект delay, разместите и соедините с bufer_1 так, как на рис. 4.11.
  • Выделите объект delay. На странице Основные панели Свойства в поле Имя: вместо delay введите сomputer.
  • В поле Класс заявки: Entity замените Message.
  • Задержка задаётся установите Явно.
  • В поле Время задержки введите:
    exponential(1/entity.timeObr)
  • Оставьте Вместимость 1.
  • Действие при входе entity.timeObr= entity.dlina/proizvod;
  • Установите флажок Включить сбор статистики.
  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 20, Y: 40, Ширина: 520, Высота: 170.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Вычислительный комплекс.
  • Блок контроля 2

    Блок контроля 2 предназначен для распределения сообщений по направлениям и контроля текущих ёмкостей буферов (накопителей) направлений передачи сообщений.

    Алгоритм работы Блока контроля 2 приведен на рис. 4.15.

    Вначале определяется номер направления, по которому должно быть передано поступившее сообщение.

    (рис 4.15) Алгоритм работы блока Блок контроля 2

    Затем определяется наличие достаточной свободной памяти в буфере этого направления. При отсутствии нужного объёма памяти сообщение теряется.

    Для распределения сообщений по направлениям можно было бы использовать объекты selectOutput5 и sink. Однако мы используем другие объекты AnyLogic: exit и enter. Они позволяют организовать сложную маршрутизацию, вследствие чего на рис. 4.11 Блок контроля 2 не выделен, хотя функционально он существует.

  • Перетащите объект exit, вход которого соедините с выходом computer (рис. 4.10).
  • В поле Класс заявки: Entity замените Message.
  • В поле Действие при выходе введите код:
    int i;
      i=entity.numIstPol;
       {
          switch (i) 
    {
            case 1:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) {
                  enter1.take(entity);
                  break;}
                else {enter.take(entity);
                  break;}  
            case 2:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) {
                  enter1.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}  
            case 3:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
                  enter2.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}  
            case 4:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
                  enter2.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}
              case 5:if (emkBuferNapr3-tekEmkNapr3>=entity.dlina) {
                  enter3.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}
            case 6:if (emkBuferNapr4-tekEmkNapr4>=entity.dlina) {
                  enter4.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}     
          }
        }
  • Маршрутизатор настраивается определённым образом, например, таблицей маршрутизации. В данном случае он настраивается программным путём так, что сообщения первого и второго отправителей передаются по первому направлению, третьего и четвёртого отправителей - по второму направлению, пятого отправителя - по третьему и шестого отправителя - по четвёртому направлению. Такой вариант принят с учётом построения в дальнейшем сети связи (см. рис. 4.1).

    Блок Буфер 2

    Блок Буфер 2 предназначен для приема и хранения сообщений, передаваемых по каналам направлений. Он состоит из четырёх буферов - для каждого направления свой буфер.

    Алгоритм работы буфера каждого из направлений такой же, как и алгоритм работы буфера 1 (см. рис. 4.13).

    Реализуется каждый из буферов также объектом queue.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник (см. рис. 4.11).
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 550, Y: 20, Ширина: 140, Высота: 290.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Буфер 2.
  • Перетащите пять объектов enter, четыре объекта queue и один объект sink, разместите, дайте имена и соедините так, как на рис. 4.11.
  • Выделите элемент buferNapr1, вход которого соединён с выходом enter1 и установите значения свойств.
  • В поле Класс заявки: Entity замените Message.
  • Вместимость emkBuferNapr1
  • В поле Действие при входе введите:
    tekEmkNapr1 += entity.dlina;
  • В поле Действие при выходе введите:
    tekEmkNapr1 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr2, вход которого соединен с выходом enter2 и установите значения свойств.
  • В поле Класс заявки: Entity замените Message.
  • Вместимость emkBuferNapr2
  • В поле Действие при входе введите:
    tekEmkNapr2 += entity.dlina;
  • В поле Действие при выходе введите:
    tekEmkNapr2 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr3, вход которого соединен с выходом enter3 и установите значения свойств.
  • В поле Класс заявки: Entity замените Message.
  • Вместимость emkBuferNapr3
  • В поле Действие при входе введите:
    tekEmkNapr3 += entity.dlina;
  • В поле Действие при выходе введите:
    tekEmkNapr3 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr4, вход которого соединен с выходом enter4 и установите значения свойств.
  • В поле Класс заявки: Entity замените Message.
  • Вместимость emkBuferNapr4
  • В поле Действие при входе введите:
    tekEmkNapr4 += entity.dlina;
  • В поле Действие при выходе введите:
    tekEmkNapr4 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Организация входных и выходных портов

    Также как и для источника сообщений, для маршрутизатора нужно создать выходы, через которые отправлять сообщения, и входы, по которым получать сообщения. Создайте эти входы и выходы.

  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 536, Y: 340, Ширина: 83, Высота: 110.
  • Из палитры Основная перетащите восемь элементов Порт. Разместите их как на рис. 4.11. В полях Имя: предложенные системой имена замените согласно рис. 4.11. Установите флажки Отображать имя.
  • Обратите также внимание на то, чтобы у элементов Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Маршрутизатор этот флажок должен быть сброшенным.
  • Соедините выходы элементов buferNapr1… buferNapr4 с соответствующими портами вых1… вых4, а порты вх1… вх4 - с входом элемента blokKontrol_1 (Блок контроля 1).
  • Имитатор отказов вычислительного комплекса

    Принято, что вычислительный комплекс может выходить из строя и отказывать в обработке сообщений. Можно было бы построить имитатор отказов так, что генератор вырабатывает заявки-отказы в количестве, определяемом длительностью времени моделирования. Однако мы сделаем так, что генератор вырабатывает одну заявку, а затем этот процесс повторяется через интервалы времени, равные наработке до очередного отказа.

  • Перетащите элемент Прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 160, Y: 224, Ширина: 340, Высота: 140.
  • Перетащите объект source и два объекта delay. Разместите и соедините их как на рис. 4.11.
  • Выделите source и установите значения его свойств:
  • Заявки прибывают согласно Интенсивности
  • Интенсивность прибытия 1
  • Количество заявок, прибывающих за один раз 1
  • Ограниченное количество прибытий 1
  • Максимальное количество прибытий 1
  • Выделите первый объект delay и установите значения его свойств:
  • Имя: розыгрыш_инт_до_отказа
  • Задержка задаётся Явно
  • Время задержки exponential(1/timeOtkBK)
  • Вместимость 1
  • Действие при выходе
    hold.setBlocked(true);
    if (computer.size()!=0) {
    computer.remove((Message)computer.get(0));
    kolPoterBK ++;}
  • Выделите второй объект delay и установите значения его свойств:
  • Имя: имитация_восст_ВК
  • Задержка задаётся Явно
  • Время задержки exponential(1/timeVosstBK)
  • Вместимость 1
  • Действие при выходе
    hold.setBlocked(false)
  • Сегмент Канал

    Данный сегмент предназначен для имитации передачи сообщений по каналам связи.

    Для его реализации в AnyLogic используется имитационная модель направления связи (глава 2), которое состоит из основного и резервного каналов.

    Исходные данные

  • Откройте объект Канал. Перейдите на область просмотра viewData.
  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 10, Y: 752, Ширина: 377, Высота: 118.
  • Перетащите элементы Параметр и Простая переменная, разместите и дайте им имена согласно рис. 4.16.
  • Типы и значения по умолчанию установите согласно табл. 4.8.
  • ИмяТипЗначение по умолчанию
    skorPeredKandouble5000
    skorPeredKanRdouble5000
    timeOtkKan double360
    timeVosstKandouble3,2
    timeBklResKdouble0,1
    всего_потеряно_сообщint0

    Событийная часть сегмента Каналы

  • Перейдите на область просмотра облКаналы.
  • Перетащите элемент Прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 186, Y: 50, Ширина: 200, Высота: 135.
  • Перетащите два элемента hold, разместите как на рис. 4.17.
  • Оставьте имена, предложенные системой, и флажок Отображать имя.
  • В поле Класс заявки: Entity замените Message. (рис 4.16) Исходные данные сегмента Канал (рис 4.17) Объекты событийной части сегмента Канал
  • У элемента hold1 установите флажок Изначально заблокирован.
  • Перетащите объект delay, поместите сверху (см. рис. 4.16). В поле Имя: введите основной_канал.
  • Установите флажок Отображать имя.
  • В поле Класс заявки: Entity замените Message. Задержка задаётся установите Явно.
  • В поле Время задержки введите
    exponential(1/entity.timePered)
  • В поле Вместимость введите 1.
  • Действие при входе entity.timePered=entity.dlina/ skorPeredKan;
  • Установите флажок Включить сбор статистики.
  • Скопируйте объект delay. Вставьте его один раз. При этом изменится имя на основной_канал, а остальные свойства останутся неизменными.
  • Замените имя основной_канал на резерв_канал.
  • В поле Действие при входе замените имеющийся там код следующим:
    if (а==0)
    entity.timePered=entity.dlina/skorPeredKanR;
    if (а==1)
    {entity.timePered=entity.dlina/skorPeredKanR +
    timeBklResK;
    а=0;} 
  • Действие при выходе
    if (hold.isBlocked()== true)
    hold1.setBlocked(false);
  • Соедините объекты hold и delay согласно рис. 4.17.
  • Организация входного и выходного портов

  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 50, Y: 80, Ширина: 60, Высота: 52.
  • Из палитры Основная перетащите два элемента Порт. Разместите их как на рис. 4.17. В полях Имя: предложенные системой имена замените согласно рис. 4.17. Установите флажки Отображать имя.
  • Обратите также внимание на то, чтобы у элементов Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Канал этот флажок должен быть сброшенным.
  • Соедините выходы элементов основной_канал и резерв_канал с портом вых, а порт вх - с входами элементов hold и hold1.
  • Имитатор отказов каналов связи

    Имитатор отказов основного канала связи построен аналогично имитатору отказов вычислительного комплекса.

  • Перетащите элемент Прямоугольник.
  • На странице Дополнительные панели Свойства введите в поля X: 10, Y: 212, Ширина: 380, Высота: 120.
  • Перетащите объект source и два объекта delay. Разместите и соедините их как на рис. 4.17.
  • Выделите source и установите значения его свойств:
  • Отображать имя установите флажок
  • Заявки прибывают согласно Интенсивности
  • Интенсивность прибытия 1
  • Количество заявок, прибывающих за один раз 1
  • Ограниченное количество прибытий установите флажок
  • Максимальное количество прибытий 1
  • Действие при выходе
  • Выделите первый объект delay и установите значения его свойств:
  • Имя: розыг_инт_до_отказа
  • Отображать имя установите флажок
  • Задержка задаётся Явно
  • Время задержки exponential(1/timeOtkKan)
  • Вместимость 1
  • Действие при выходе
    hold.setBlocked(true);
    if (основной_канал.size()!=0) {
    основной_канал.remove((Message)
    основной_канал.get(0));
    всего_потеряно_сообщ ++;}
    hold1.setBlocked(false);
    а=1;
  • Выделите второй объект delay и установите значения его свойств:
  • Имя имитация_восст_осн_кан
  • Отображать имя установите флажок
  • Задержка задаётся Явно
  • Время задержки exponential(1/timeVosstkKan)
  • Вместимость 1
  • Действие при выходе
    hold.setBlocked(false);
    hold1.setBlocked(true);
  • Построение модели сети связи

    Все необходимое для построения модели сети из объектов классов активных объектов Абонент, Канал и Маршрутизатор нами создано. Приступим к построению модели сети.

  • Перейдите к области просмотра облСеть.
  • Из окна Проекты перетащите объект Абонент1 и поместите как на рис. 4.18.
  • Объект Абонент1 имитирует абонента 1. В свойствах Абонент1 записан код для расчёта коэффициентов пропускной способности абонентов 2…6 с абонентом 1. Следовательно, Абонент2 должен иметь код для расчёта коэффициентов пропускной способности абонентов 1, 3…6 с абонентом 2 и т.д.
  • Создайте активные объекты Абонент2 … Абонент6.
  • Откройте Абонент1. Скопируйте все объекты.
  • Вставьте скопированные объекты на объекты Абонент2 … Абонент6.
  • Внесите правки в коды согласно табл. 4.9.
  • Из окна Проекты перетащите объекты абонент2 … абонент6.
  • Из окна Проекты перетащите объект Канал и поместите вверху (см. рис. 4.18). В поле Имя: добавьте к предложенному имени 1.
  • Скопируйте объект Канал1. Вставьте пять объектов. Разместите их как на рис. 4.18.
  • Выходы объектов абонент1…абонент6 соедините с соответствующими входами объектов канал1…канал6.
  • Из окна Проекты перетащите объект Маршрутизатор. В поле Имя: сделайте маршрут1.
  • Соедините выходы первого и второго абонентов с вх1, выходы третьего и четвёртого - с вх2, пятого - с вх3, шестого - с вх4 объекта маршрут1.
  • (рис 4.18) Элементы модели функционирования сети связи
    Абонент2
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    numAbonent2
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Действие при выходе 0отпрАб1++;
    get_Main().отпр21=отпрАб1;
    Условие 1entity.numAbPol==2
    Условие 2entity.numAbPol==3
    Действие при выходе 2отпрАб3++;
    get_Main().отпр23=отпрАб3;
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Действие при выходе 0отпрАб4++;
    get_Main().отпр24=отпрАб4;
    Условие 1entity.numAbPol==5
    Действие при выходе 1отпрАб5++;
    get_Main().отпр25=отпрАб5;
    Условие 2entity.numAbPol==6
    Действие при выходе 2отпрАб6++;
    get_Main().отпр26=отпрАб6;
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Действие при выходе 0отАб1++;
    get_Main().кПрСп12=отАб1/get_Main().
    отпр12;
    get_Main().КПрСп12.setText(get_Main().кПрСп12, true);
    Условие 1entity.numAbOtpr==2
    Условие 2entity.numAbOtpr==3
    Действие при выходе 2отАб3++;
    get_Main().кПрСп32=отАб3/get_Main().
    отпр32;
    get_Main().КПрСп32.setText(get_Main().кПрСп32, true);
    Условие 3entity.numAbOtpr==4
    Действие при выходе 3отАб4++;
    get_Main().кПрСп42=отАб4/get_Main().
    отпр42;
    get_Main().КПрСп42.setText(get_Main().кПрСп42, true);
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Действие при выходе 0отАб5++;
    get_Main().кПрСп52=отАб5/get_Main().
    отпр52;
    get_Main().КПрСп52.setText(get_Main().кПрСп52, true);
    Условие 1entity.numAbOtpr==6
    Действие при выходе 1отАб6++;
    get_Main().кПрСп62=отАб6/get_Main().
    отпр62;
    get_Main().КПрСп62.setText(get_Main().кПрСп62, true);
    Абонент3
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    numAbonent3
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Действие при выходе 0отпрАб1++;
    get_Main().отпр31=отпрАб1;
    Условие 1entity.numAbPol==2
    Действие при выходе 2отпрАб2++;
    get_Main().отпр32=отпрАб2;
    Условие 2entity.numAbPol==3
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Действие при выходе 0отпрАб4++;
    get_Main().отпр34=отпрАб4;
    Условие 1entity.numAbPol==5
    Действие при выходе 1отпрАб5++;
    get_Main().отпр35=отпрАб5;
    Условие 2entity.numAbPol==6
    Действие при выходе 2отпрАб6++;
    get_Main().отпр36=отпрАб6;
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Действие при выходе 0отАб1++;
    get_Main().кПрСп13=отАб1/get_Main().
    отпр13;
    get_Main().КПрСп13.setText(get_Main().кПрСп13, true);
    Условие 1entity.numAbOtpr==2
    Действие при выходе 1отАб2++;
    get_Main().кПрСп23=отАб2/get_Main().
    отпр23;
    get_Main().КПрСп23.setText(get_Main().кПрСп23, true);
    Условие 2entity.numAbOtpr==3
    Условие 3entity.numAbOtpr==4
    Действие при выходе 3отАб4++;
    get_Main().кПрСп43=отАб4/get_Main().
    отпр43;
    get_Main().КПрСп43.setText(get_Main().кПрСп43, true);
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Действие при выходе 0отАб5++;
    get_Main().кПрСп53=отАб5/get_Main().
    отпр53;
    get_Main().КПрСп53.setText(get_Main().кПрСп53, true);
    Условие 1entity.numAbOtpr==6
    Действие при выходе 1отАб6++;
    get_Main().кПрСп63=отАб6/get_Main().
    отпр63;
    get_Main().КПрСп63.setText(get_Main().кПрСп63, true);
    Абонент4
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    numAbonent4
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Действие при выходе 0отпрАб1++;
    get_Main().отпр41=отпрАб1;
    Условие 1entity.numAbPol==2
    Действие при выходе 2отпрАб2++;
    get_Main().отпр42=отпрАб2;
    Условие 2entity.numAbPol==3
    Действие при выходе 2отпрАб3++;
    get_Main().отпр43=отпрАб3;
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Условие 1entity.numAbPol==5
    Действие при выходе 1отпрАб5++;
    get_Main().отпр45=отпрАб5;
    Условие 2entity.numAbPol==6
    Действие при выходе 2отпрАб6++;
    get_Main().отпр46=отпрАб6;
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Действие при выходе 0отАб1++;
    get_Main().кПрСп14=отАб1/get_Main().
    отпр14;
    get_Main().КПрСп14.setText(get_Main().кПрСп14, true);
    Условие 1entity.numAbOtpr==2
    Действие при выходе 1отАб2++;
    get_Main().кПрСп24=отАб2/get_Main().
    отпр24;
    get_Main().КПрСп24.setText(get_Main().кПрСп24, true);
    Условие 2entity.numAbOtpr==3
    Действие при выходе 2отАб3++;
    get_Main().кПрСп34=отАб3/get_Main().
    отпр34;
    get_Main().КПрСп34.setText(get_Main().кПрСп34, true);
    Условие 3entity.numAbOtpr==4
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Действие при выходе 0отАб5++;
    get_Main().кПрСп54=отАб5/get_Main().
    отпр54;
    get_Main().КПрСп54.setText(get_Main().кПрСп54, true);
    Условие 1entity.numAbOtpr==6
    Действие при выходе 1отАб6++;
    get_Main().кПрСп64=отАб6/get_Main().отпр64;
    get_Main().КПрСп64.setText(get_Main().кПрСп64, true);
    Абонент5
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    numAbonent5
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Действие при выходе 0отпрАб1++;
    get_Main().отпр51=отпрАб1;
    Условие 1entity.numAbPol==2
    Действие при выходе 2отпрАб2++;
    get_Main().отпр52=отпрАб2;
    Условие 2entity.numAbPol==3
    Действие при выходе 2отпрАб3++;
    get_Main().отпр53=отпрАб3;
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Действие при выходе 0отпрАб4++;
    get_Main().отпр54=отпрАб4;
    Условие 1entity.numAbPol==5
    Условие 2entity.numAbPol==6
    Действие при выходе 2отпрАб6++;
    get_Main().отпр56=отпрАб6;
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Действие при выходе 0отАб1++;
    get_Main().кПрСп15=отАб1/get_Main().
    отпр15;
    get_Main().КПрСп15.setText(get_Main().кПрСп15, true);
    Условие 1entity.numAbOtpr==2
    Действие при выходе 1отАб2++;
    get_Main().кПрСп25=отАб2/get_Main().
    отпр25;
    get_Main().КПрСп25.setText(get_Main().кПрСп25, true);
    Условие 2entity.numAbOtpr==3
    Действие при выходе 2отАб3++;
    get_Main().кПрСп35=отАб3/get_Main().
    отпр35;
    get_Main().КПрСп35.setText(get_Main().кПрСп35, true);
    Условие 3entity.numAbOtpr==4
    Действие при выходе 3отАб4++;
    get_Main().кПрСп45=отАб4/get_Main().
    отпр45;
    get_Main().КПрСп45.setText(get_Main().кПрСп45, true);
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Условие 1entity.numAbOtpr==6
    Действие при выходе 1отАб6++;
    get_Main().кПрСп65=отАб6/get_Main().
    отпр65;
    get_Main().КПрСп65.setText(get_Main().кПрСп65, true);
    Абонент6
    СвойствоselectOutput
    Класс заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbOtpr==entity.numAbPol
    numAbonent6
    СвойствоselectOutput1
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==1
    Действие при выходе 0отпрАб1++;
    get_Main().отпр61=отпрАб1;
    Условие 1entity.numAbPol==2
    Действие при выходе 2отпрАб2++;
    get_Main().отпр62=отпрАб2;
    Условие 2entity.numAbPol==3
    Действие при выходе 2отпрАб3++;
    get_Main().отпр63=отпрАб3;
    Условие 3entity.numAbOtpr==entity.numAbPol
    СвойствоselectOutput2
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbPol==4
    Действие при выходе 0отпрАб4++;
    get_Main().отпр64=отпрАб4;
    Условие 1entity.numAbPol==5
    Действие при выходе 1отпрАб5++;
    get_Main().отпр65=отпрАб5;
    Условие 2entity.numAbPol==6
    СвойствоselectOutput5
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==1
    Действие при выходе 0отАб1++;
    get_Main().кПрСп16=отАб1/get_Main().отпр16;
    get_Main().КПрСп16.setText(get_Main().кПрСп16, true);
    Условие 1entity.numAbOtpr==2
    Действие при выходе 1отАб2++;
    get_Main().кПрСп26=отАб2/get_Main().отпр26;
    get_Main().КПрСп26.setText(get_Main().кПрСп26, true);
    Условие 2entity.numAbOtpr==3
    Действие при выходе 2отАб3++;
    get_Main().кПрСп35=отАб3/get_Main().
    отпр35;
    get_Main().КПрСп35.setText(get_Main().кПрСп35, true);
    Условие 3entity.numAbOtpr==4
    Действие при выходе 3отАб3++;
    get_Main().кПрСп36=отАб3/get_Main().
    отпр36;
    get_Main().КПрСп36.setText(get_Main().кПрСп36, true);
    СвойствоselectOutput6
    Класс заявки:Message
    Использовать:Условия
    Условие 0entity.numAbOtpr==5
    Действие при выходе 0отАб5++;
    get_Main().кПрСп56=отАб5/get_Main().
    отпр56;
    get_Main().КПрСп56.setText(get_Main().кПрСп56, true);
    Условие 1entity.numAbOtpr==6

    Для того чтобы связь была между всеми абонентами и они могли бы обмениваться сообщениями, нам потребуется ещё один маршрутизатор. Однако мы не можем использовать второй элемент этого же класса, так как программно он настроен именно на наш вариант организации связи.

  • Создайте ещё класс активного объекта Маршрутизатор1.
  • Откройте объект Маршрутизатор.
  • Выделите все объекты и скопируйте их.
  • Перейдите на Маршрутизатор1 и вставьте скопированные объекты.
  • Выделите элемент exit и в поле Действие при выходе замените имеющийся там код следующим кодом:
    int i;
      i=entity.numAbPol;
       {
          switch (i) {
            case 1:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) 
    {enter1.take(entity);
                  break;}
                else {enter.take(entity);
                  break;}  
            case 2:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
                  enter2.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}  
            case 3:if (emkBuferNapr3-tekEmkNapr3>=entity.dlina) {
                  enter3.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}  
            case 4:if (emkBuferNapr4-tekEmkNapr4>=entity.dlina) {
                  enter4.take(entity);
                  break;}
                else {enter.take(entity);
                    break;}
            }
        }
  • Теперь Маршрутизатор1 настроен так, что сообщения от абонентов 1…4 будут направляться на его выходы 1…4 соответственно.
  • Из окна Проекты перетащите элемент Маршрутизатор1. В поле Имя: установите маршрут2.
  • Соедините вых1 маршрут1 с вх1 маршрут2, а вых2 - с вх2.
  • Скопируйте элемент Канал1. Вставьте шесть элементов. Разместите их как на рис. 4.18.
  • Соедините вых3 маршрут1 с вх канал11, вых4 - с вх канал12.
  • Соедините вых1…вых4 маршрут2 с вх канал7…канал10 соответственно.
  • Соедините вых канал7…канал12 с входами абонент1…абонент6 соответственно.
  • Построение модели сети связи завершено. Но надо ещё организовать переключение между областями просмотра.

    Переключение между областями просмотра

    Переключение между областями просмотра организуем так, чтобы можно было из сети переходить к любому абоненту, каналу, маршрутизатору и обратно. В каждом активном объекте - к данным и обратно или в сеть.

    Для переключения используем элемент button из палитры Элементы управления.

  • Перетащите элемент button (см. рис. 4.18).
  • На странице Основные панели Свойства укажите:
  • Метка: Абонент1
  • Действие: абонент1.облАбонент1.navigateTo()
  • Скопируйте кнопку Абонент1. Вставьте пять раз. Последовательно откройте и внесите соответствующие правки в полях Метка: и Действие:.
  • Перетащите элемент button. Укажите свойства:
  • Метка: Результаты
  • Действие: viewData.navigateTo()
  • Перетащите элемент button. Укажите свойства:
  • Метка: маршрут1
  • Действие: маршрут1.облМарш.navigateTo()
  • Скопируйте кнопку маршрут1. Скорректируйте свойства:
  • Метка: маршрут2
  • Действие: маршрут2.облМарш.navigateTo()
  • (рис 4.19) Область просмотра облКан

    Так как каналов 12, то давайте создадим ещё одну область просмотра облКан, и на ней разместим 12 кнопок (рис. 4.19).

  • Перетащите из палитры Презентация элемент Область просмотра. На странице Основные в поле Имя: введите облКан.
  • Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 0, Y: 1780, Ширина: 450, Высота: 200.
  • Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Канал1
  • Действие: канал1.облКан.navigateTo()
  • Скопируйте кнопку Канал1. Вставьте одиннадцать раз. Последовательно откройте и внесите соответствующие правки в полях Метка: и Действие:. Например:
  • Метка: Канал2
  • Действие: Канал2.облКан.navigateTo()
  • Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Сеть
  • Действие: облСеть.navigateTo()
  • Перейдите на область просмотра облСеть. Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Каналы
  • Действие: облКан.navigateTo()
  • Нам осталось добавить элементы для переключения между областями просмотра на классах активных объектов и возвращения на корневой объект Main на область просмотра облСеть.

    Последовательно переходите от объекта к объекту, добавляя на них нужное число элементов button и устанавливая значения свойств согласно табл. 4.10. Размещение этих элементов было уже показано на рис. 4.3… 4.6, 4.8, 4.10, 4.11, 4.16… 4.18.

    ОбъектОбласть просмотраСвойстваЗначение
    АбонентоблАбонентМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    облАбонентМетка:Исходные данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    viewDataМетка:Абонент
    Действие:облАбонент.navigateTo()
    КаналоблКанМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    облКанМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Канал
    Действие:облКан.navigateTo()
    МаршрутизатороблМаршМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    облМаршМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    viewDataМетка:Маршрутизатор
    Действие:облМарш.navigateTo()
    Маршрутизатор1облМаршМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    облМаршМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:get_Main().облСеть.navigateTo()
    viewDataМетка:Маршрутизатор
    Действие:облМарш.navigateTo()

    Запуск и отладка модели

    Прежде чем запустить модель:

  • В окне Проекты выделите Сеть_связи.
  • На странице Основные в поле Единицы модельного времени: установите секунды.
  • В окне Проекты выделите Simulation: Main.
  • На странице Основные установите Фиксированное начальное число (воспроизводимые "прогоны").
  • В поле Начальное число: введите 897.
  • Перейдите на страницу Модельное время. В поле Остановить: выберите В заданное время.
  • В поле Конечное время: введите 3600000.0. Время моделирования увеличено в 1000 раз по числу прогонов модели.
  • Запустите модель. Если появятся ошибки, исправьте их.
  • При правильном построении модели вы получите результаты, показанные на рис. 4.20.

    Среди них показатели качества обслуживания сети связи: коэффициент пропускной способности 0,815 и среднее время передачи одного сообщения 6,050. Коэффициент пропускной способности, например, абонент 2- абонент 3 равен 0,816. Обратите внимание на существенную разницу между минимальным и максимальным временами передачи сообщения. Она объясняется принятым экспоненциальным законом распределения времени передачи сообщений: максимальное значение может отличаться от среднего значения в восемь раз.

    Количество отправленных и полученных сообщений всего и по категориям рассчитано за один прогон модели, то есть за 3600 сек. Для расчёта, как вы помните, был введён параметр kolProg=1000 и в 1000 раз было увеличено модельное время. Всего отправлено сообщений 600,559, а получено всего абонентами - 490,035. Если разделить количество полученных сообщений на количество отправленных, то и будет получен коэффициент пропускной способности сети.

    Точно такие же результаты моделирования, коэффициенты пропускной способности, выводятся и по каждому абоненту сети.

    Перейдите в область просмотра Сеть, щёлкнув кнопку Сеть. Затем, щёлкните, например, кнопку Абонент2. Вы увидите результаты моделирования, показанные на рис. 4.21.

    (рис 4.20) Результаты моделирования (рис 4.21) Результаты моделирования по абоненту 2

    Модель в GPSS World

    Состав GPSS-модели

    Модель в GPSS World разработана согласно постановке и включает следующие элементы:

  • задание исходных данных:
  • определение матриц;
  • описание функций, задающих исходные данные;
  • арифметические выражения;
  • сегмент имитации поступления сообщений от источников:
  • розыгрыш абонентов-получателей сообщений;
  • розыгрыш категории сообщения и счёта сообщений;
  • розыгрыш характеристик сообщений;
  • сегмент имитации работы основных каналов 1-6;
  • сегмент имитации работы маршрутизатора 1;
  • сегмент имитации работы маршрутизатора 2;
  • сегмент имитации работы основных каналов 7-10;
  • сегмент имитации работы основных каналов 11-12;
  • сегмент имитации получения сообщений;
  • сегмент имитации работы резервных каналов 13-18;
  • сегмент имитации работы резервных каналов 19-24;
  • сегмент имитации работы резервных каналов 19-24;
  • сегмент имитации отказов ВК1;
  • сегмент имитации отказов ВК2;
  • сегмент имитации отказов каналов связи 1-6;
  • сегмент имитации отказов каналов связи 7-12;
  • сегмент счёта переданных и потерянных сообщений и расчёт вероятностей передачи сообщений;
  • задание времени моделирования и расчёт результатов.
  • GPSS-программа

    Ввод данных в виде массивов организован таким образом, во-первых, чтобы в программе было меньшее количество строк, во-вторых, чтобы удобнее было использовать эти данные при написании программы модели и, в-третьих, чтобы при изменении числа элементов массива требовалась бы незначительная коррекция. Для организации такого ввода использованы функции. Например, функцией S_ задаются средние вычислительные сложности (длины) сообщений. Выборка соответствующей средней длины в зависимости от категории осуществляется по аргументу, представляющему собой параметр транзакта Р1. В этот параметр заранее посредством розыгрыша заносится код категории.

    Сообщения имитируются транзактами с параметрами, необходимыми согласно логике работы модели. Каналы связи и ВК имитируются одноканальными устройствами (ОКУ): основные каналы связи - ОКУ1…ОКУ12, резервные каналы - ОКУ13…ОКУ24, ВК1 - ОКУ25, ВК2 - ОКУ26.

    Для одновременной проверки выполнения каких-либо условий используются булевы переменные. Например, булева переменная Prov2 проверяет исправность ВК1 и наличие свободной ёмкости входного буфера, достаточной для размещения поступившего сообщения. Эти проверки можно выполнить и по отдельности, но использование булевой переменной более эффективно. Булева переменная Prov1 используется для выделения сообщений, адресованных абонентам 5 и 6.

    Количество отправленных сообщений каждым абонентом каждому абоненту сети накапливается в матрице Otpr, а количество полученных сообщений каждым абонентом от каждого абонента сети - в матрице Pol. По эти статистическим данным рассчитываются коэффициенты пропускной способности абонент-абонент и записываются в матрицу KPS.

    Коэффициент пропускной способности сети (КПС) связи в целом сохраняется в ячейке VPerS. А среднее время передачи одного сообщения - в ячейке TimeS.

    GPSS-программа приведена ниже.

    ; Модель функционирования сети связи
     Определение матриц
    Otpr  MATRIX  ,6,6  ; Матрица для записи отправленных сообщений
    Pol  MATRIX  ,6,6 ; Матрица для записи полученных сообщений
    KPS  MATRIX  ,6,6 ; Матрица для записи коэффициентов пропускной способности
    ; Задание исходных данных
    VrMod EQU    3600  ; Время моделирования,1 ед. мод. вр.=1с
    KolAb EQU    6    ; Количество абонентов сообщений
    Q_     EQU    40000  ; Производительность ВК, оп/c
    V_     EQU  40000  ; Скорость передачи, бит/с
    MaxKat  EQU  4  ; Количество категорий сообщений
    NKan    EQU  12  ; Количество каналов передачи данных
    KolNapr  EQU  4  ; Количество направлений в маршрутизаторе
    KolBK  EQU  2  ; Количество ВК
    T5    EQU  0.1  ; Время включения резервного канала
    EmkBK1  EQU  5000000  ; Ёмкость входного буфера ВК1
    EmkBK2  EQU  5000000  ; Ёмкость входного буфера ВК2
    ; Описание функций, задающих исходные данные
    NaprM1  FUNCTION  P$NumPol,D6 ; Таблица адресов в маршрутизаторе 1
    1,1/2,1/3,2/4,2/5,3/6,4
    NaprM2  FUNCTION  P$NumPol,D4 ; Таблица адресов в маршрутизаторе 2
    1,1/2,2/3,3/4,4
    TOtkBK  FUNCTION  P4,D2  ; Среднее время между отказами ВК
    1,3600/2,3600
    TVosstBK  FUNCTION P4,D2; Среднее время восстановления ВК
    1,3.7/2,3.7
    TOtkKan   FUNCTION  P4,D12 ; Среднее время между отказами каналов
    1,3600/2,3600/3,3600/4,3600/5,3600/6,3600/7,3600/
    8,3600/9,3600/10,3600/11,3600/12,3600
    TVosstKan  FUNCTION  P4,D12 ; Среднее время восстановления каналов
    1,3.2/2,3.2/3,3.2/4,3.2/5,3.2/6,3.2/7,3.2/8,3.2/
    9,3.2/10,3.2/11,3.2/12,3.2
    TimeAb  FUNCTION  P$NumOtpr,D6 ; Среднее время передачи сообщений от абонентов
    1,30/2,30/3,30/4,30/5,30/6,30
    Kat  FUNCTION  RN897,D4 ; Вероятности видов категорий
    .3,1/.5,2/.7,3/1,4
    S_  FUNCTION  P1,D4  ; Средние вычислительные сложности сообщений (длины), оп (байт) по категориям
    1,53000/2,86000/3,66000/4,50000
    So_  FUNCTION  P1,D4  ; Среднеквадратические отклонения вычислительных сложностей (длин) сообщений, оп (байт) по категориям
    1,6100/2,5000/3,7000/4,500
    EmkNaprM1  FUNCTION  P$NumNapr,D4 ; Ёмкости накопителей направлений, байт
    1,250000/2,250000/3,250000/4,250000
    EmkNaprM2  FUNCTION  P$NumNapr,D4 ; Ёмкости накопителей направлений, байт
    5,250000/6,250000/7,250000/8,250000
    BufAb  FUNCTION  P$NumPol,D6  ; Ёмкости входных буферов абонентов
    1,80000/2,80000/3,80000/4,80000/5,80000/6,80000
    Prov1  BVARIABLE  (P$NumPol'E'5)'OR'(P$NumPol'E'6)
    Prov2 BVARIABLE  (FV*NumBK1)'AND'(P2'LE'(EmkBK1-Q*NumBK1))
    Prov3   BVARIABLE  (FV*NumBK2)'AND'(P2'LE'(EmkBK2-Q*NumBK2))
     Арифметические выражения вычисления
    DL  VARIABLE  INT(NORMAL(897,FN$S_,FN$So_))  ; Длин (вычислительных сложностей) сообщений
    VrPer  VARIABLE  (P2/V_) ; Времени передачи сообщения
    VrObr  VARIABLE  P2/Q_  ; Времени обработки сообщения
    ; Сегмент имитации поступления сообщений от источников
      GENERATE  ,,,KolAb    ; Число транзактов по числу абонентов
      SAVEVALUE  Num+,1;Нумерация абонента-отправителя
      ASSIGN  NumOtpr,X$Num ; Номер абонента-отправителя в NumOtpr
    Soob  ADVANCE  (Exponential(897,0,FN$TimeAb))  ; Время отправления сообщений
      SPLIT  1,Soob  ; Создание двойника сообщения
     Розыгрыш абонентов-получателей сообщений
    Met1  SAVEVALUE  VerAb,(RN897/1000); Получение РРСЧ
    Met2  ASSIGN  NumPol+,1 ; В Р$NumPol номер абонента-получателя сообщения
      TEST LE  X$VerAb,(P$NumPol#(1/KolAb)),Met2
      TEST NE  P$NumOtpr,P$NumPol,Met6  ; Отправитель не себе ли отправляет?
     Розыгрыш категории сообщения и счёта сообщений
    Met4  ASSIGN  1,FN$Kat  ; В Р1 код категории и счет сообщений всех категорий
      ASSIGN  TimeVxod,AC1 ; Запись времени входа сообщения в сеть
      ASSIGN  10,(200+P1) ; В Р10 номера Х для счета отправленных сообщений по категориям
      ASSIGN  11,(P10+MaxKat) ; В Р11 номера Х для счета полученных сообщений по категориям
      ASSIGN  12,(P11+MaxKat) ; В Р12 номера Х для счета потерянных сообщений по категориям
      ASSIGN  13,(P12+MaxKat) ; В Р13 номера Х для записи КПС полученных сообщений по категориям
      ASSIGN  14,(P13+MaxKat) ; В Р14 номера Х для записи КПС потерянных сообщений по категориям
      SAVEVALUE  *10+,1 ; Cчет отправленных сообщений по категориям
      MSAVEVALUE Otpr+,P$NumOtpr,P$NumPol,1 ; Запись в матрицу количества отправляемых сообщений абонентам
     Розыгрыш характеристик сообщений
    Met02  ASSIGN  2,V$DL ; Занесение в Р2 длины (вычислительной сложности) сообщения
      ASSIGN  3,V$VrPer ; Занесение в Р3 времени передачи сообщения
      ASSIGN  8,V$VrObr ; Занесение в Р8 времени обработки сообщения
    ; Сегмент имитации работы основных каналов 1-6
    OsnK1  GATE FV  P$NumOtpr,ResK1 ; Исправен ли канал?
      ASSIGN  Vsp1,P$NumOtpr  ; Запись в параметр Vsp1 номера абонента отправителя
      GATE NU  P$Vsp1;Свободен канал с номером в P$Vsp1?
      SEIZE  P$Vsp1; Занять канал с номером в P$Vsp1
      ADVANCE  P3      ; Имитация передачи сообщения
      RELEASE   P$Vsp1 ; Освободить канал с номером в P$Vsp1
    ; Сегмент имитации работы маршрутизатора 1
    Met11  ASSIGN  NumBK1,(2#NKan+1); Запись в параметр номера маршрутизатора как ОКУ
      TEST E  BV$Prov2,1,Met5 ; Исправен ли ВК1 и есть ли место в его буфере?
      QUEUE  P$NumBK1,P2   ; Если есть, поместить в буфер ВК1
    Met14  SEIZE  P$NumBK1     ; Занять ВК1
      DEPART  P$NumBK1,P2    ; Освободить буфер ВК1
      ADVANCE  P8      ; Имитация обработки сообщения
      ASSIGN  NumNapr,FN$NaprM1 ; Определение номера направления маршрутизатора 1  
      RELEASE  P$NumBK1  ; Освобождение ВК1
      TEST LE P2,(FN$EmkNaprM1-Q*NumNapr),Met5; Есть ли место в буфере направления
      QUEUE  P$NumNapr,P2 ; Поместить в буфер направления
      TEST NE P$NumPol,5,Met21 ; Выделение сообщения для абонента 5
      TEST NE P$NumPol,6,Met21 ; Выделение сообщения для абонента 6
      TRANSFER  ,Met15 ; Отправить на маршрутизатор 2 сообщения  для абонентов 1-4 
    Met21  DEPART  P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 1
      TRANSFER  ,Met16 ; Отправить на каналы сообщения для абонентов 5 и 6
    Met15  DEPART  P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 1
    ; Сегмент имитации работы маршрутизатора 2
      ASSIGN  NumBK2,(2#NKan+2)
      TEST E  BV$Prov3,1,Met5 ; Если маршрутизатор 2 исправен и есть место в его буфере, то
      QUEUE  P$NumBK2,P2 ; поместить в буфер маршрутизатора 2
      SEIZE  P$NumBK2  ; Занять BK2
      DEPART  P$NumBK2,P2 ; Покинуть буфер маршрутизатора 2
      ADVANCE  P8  ; Имитация обработки сообщения
      RELEASE  P$NumBK2  ; Освобождение BK2
      TEST E  P$NumPol,1,Met24
    ; Определить номер направления маршрутизатора 2
      ASSIGN  NumNapr,(KolNapr+1) 
      TEST LE  P2,(FN$EmkNaprM2-Q*NumNapr),Met5
      TRANSFER  ,Met25
    Met24  TEST E  P$NumPol,2,Met26
      ASSIGN  NumNapr,(KolNapr+2) ; Определить номер направления маршрутизатора 2
      TEST LE  P2,(FN$EmkNaprM2-Q*NumNapr),Met5
      TRANSFER  ,Met25
    Met26  TEST E  P$NumPol,3,Met27
      ASSIGN  NumNapr,(KolNapr+3) ; Определить номер направления маршрутизатора 2
      TEST LE  P2,(FN$EmkNaprM2-Q*NumNapr),Met5
      TRANSFER  ,Met25
    Met27  TEST E  P$NumPol,4,Met24
      ASSIGN  NumNapr,(KolNapr+4) ; Определить номер направления маршрутизатора 2
      TEST LE  P2,(FN$EmkNaprM2-Q*NumNapr),Met5
    Met25  QUEUE  P$NumNapr,P2 ; Поместить в буфер направления маршрутизатора 2
    ; Сегмент имитации работы основных каналов 7-10  
      ASSIGN  Vsp1,(KolAb+P$NumPol); Определение каналов 7-10
      DEPART  P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 2
      GATE FV  P$Vsp1,ResK2 ; Если исправен основной канал, 
      GATE NU  P$Vsp1  ; и свободен, то
      SEIZE  P$Vsp1  ; занять его
      ADVANCE  P3  ; Передача сообщения
      RELEASE  P$Vsp1  ; Освободить канал
      TRANSFER  ,Met17 ; Отправить для имитации получения сообщения
    ; Сегмент имитации работы основных каналов 11-12  
    Met16  ASSIGN  Vsp1,(KolAb+P$NumPol); Определение каналов 11-12
      GATE FV  P$Vsp1,ResK2 ; Если исправен основной канал, 
      GATE NU  P$Vsp1       ; и свободен, то
      SEIZE  P$Vsp1       ; занять его
    Met20  ADVANCE  P3         ; Передача сообщения
      RELEASE P$Vsp1       ; Освободить канал
    ; Сегмент имитации получения сообщений
    Met17  ASSIGN  Vsp3,(2#KolNapr+P$NumPol); Запись в Vsp3 номера буфера абонента-получателя
      TEST LE P2,(FN$BufAb-Q*Vsp3),Met5 ; Есть ли место в буфере абонента получателя?
      QUEUE  P$Vsp3,P2 ; Поместить сообщение в буфер
      DEPART  P$Vsp3,P2 ; Освободить буфер
      TRANSFER  ,Met10  ; Отправить для счёта полученных сообщений
    ; Сегмент имитации работы резервных каналов 13-18
    ResK1  ASSIGN  Vsp1,(NKan+P$NumOtpr)
      GATE NU  P$Vsp1  ; Свободен ли резервный канал?
      TEST E  X*Vsp1,1,Met7 ; Включить резервный канал
      ADVANCE  T5  ; Включение резервного канала
      SAVEVALUE  P$Vsp1,0 ; Признак того, что резервный канал включён
    Met7  SEIZE  P$Vsp1   ; Занять резервный канал
      ADVANCE  P3  ; Передача
      RELEASE  P$Vsp1   ; Освободить резервный канал
      TRANSFER  ,Met11 ; Отправить на маршрутизатор 1
    ; Сегмент имитации работы резервных каналов 19-24
    ResK2  ASSIGN  Vsp1,(NKan+KolAb+P$NumPol)
      TEST NE  P$NumPol,5,Met22 ; Выделение сообщения для абонента 5
      TEST NE  P$NumPol,6,Met22 ; Выделение сообщения для абонента 6
    Met22  GATE NU  P$Vsp1 ; Свободен ли резервный канал?
      TEST E  X*Vsp1,1,Met8 ; Включить резервный канал
      ADVANCE  T5  ; Включение резервного канала
      SAVEVALUE  P$Vsp1,0 ; Признак включения ResK
    Met8  SEIZE  P$Vsp1  ; Занять резервный канал
      ADVANCE  P3       ; Передача
      RELEASE  P$Vsp1  ; Освободить резервный канал
      TRANSFER  ,Met17 ; Отправить для имитации получения сообщения
    ; Сегмент имитации отказов ВК1
      GENERATE  ,,,1
      ASSIGN  4,(2#NKan+1) ; Номер BK в P4
    Met50  ADVANCE  (Exponential(897,0,FN$TOtkBK)) ; Розыгрыш времени до очередного отказа
      GATE FV  P4,Met50
      FUNAVAIL  P4,RE,Met117 ; Перевод ВК в неисправное состояние
      ADVANCE  (Exponential(897,0,FN$TVosstBK))  ; Имитация восстановления
      FAVAIL  P4  ; Перевод ВК в исправное состояние
      TRANSFER  ,Met50   ; Отправить для розыгрыша очередного отказа
    Met117  RELEASE  P$NumBK1 ; Освобождение ВК прерванным сообщением
      TRANSFER  ,Met5  ; Отправить для счета потерь
    ; Сегмент имитации отказов ВК2
      GENERATE  ,,,1
      ASSIGN  4,(2#NKan+2) ; Номер BK в P4
    Met49  ADVANCE  (Exponential(897,0,FN$TOtkBK)) ; Розыгрыш времени до очередного отказа
      GATE FV  P4,Met49
      FUNAVAIL  P4,RE,Met115 ; Перевод ВК в неисправное состояние
      ADVANCE  (Exponential(897,0,FN$TVosstBK))  ; Имитация восстановления
      FAVAIL  P4  ; Перевод ВК в исправное состояние
      TRANSFER  ,Met49   ; Отправить для розыгрыша очередного отказа
    Met115  RELEASE  P$NumBK2 ; Освобождение ВК прерванным сообщением
      TRANSFER  ,Met5  ; Отправить для счета потерь
    ; Сегмент имитации отказов каналов связи 1-6
      GENERATE  ,,,KolAb ; Число транзактов - по числу каналов связи
      SAVEVALUE  NumKan+,1 ; Записать в X$NumCan последовательно 1, 2, ..., KolAb
      ASSIGN  4,X$NumKan  ; Записать в Р4 последовательно 1, 2, ..., KolAb
    Met19  ADVANCE  (Exponential(897,0,FN$TOtkKan)) ; Розыгрыш времени до очередного отказа
      GATE FV  P4,Met19
      FUNAVAIL  P4,RE,Met112 ; Перевод канала в неисправное состояние
      ASSIGN  NumKan,(NKan+P4)
      SAVEVALUE  P$NumKan,1 ; Признак включения резервного канала
      ADVANCE  (Exponential(47,0,FN$TVosstKan)) ; Имитация восстановления канала
      FAVAIL  P4  ; Перевод в исправное состояние
      TRANSFER  ,Met19   ; Отправить для розыгрыша очередного отказа
    Met112  RELEASE  P$Vsp1   ; Освобождение канала с номером в Р$Vsp1
      TRANSFER  ,Met5  ; Отправить для счета потерь
    ; Сегмент имитации отказов каналов связи 7-12
      GENERATE  ,,,KolAb  ; Число транзактов - по числу каналов связи
      SAVEVALUE  NumKan+,1 ; Записать в X$NumCan последовательно 1, 2, ..., KolAb
      ASSIGN  4,(X$NumKan+KolAb) ; Записать в Р4 последовательно KolAb+1, ...,KolAb+KolAb 
    Met23  ADVANCE  (Exponential(897,0,FN$TOtkKan)) ; Розыгрыш времени до очередного отказа
      GATE FV   P4,Met23
      FUNAVAIL  P4,RE,Met113 ; Перевод канала в неисправное состояние
      ASSIGN  NumKan,(NKan+P4)
      SAVEVALUE  P$NumKan,1 ; Признак включения резервного канала
      ADVANCE  (Exponential(47,0,FN$TVosstKan)) ; Имитация восстановления канала
      FAVAIL  P4  ; Перевод в исправное состояние
      TRANSFER  ,Met23   ; Отправить для розыгрыша очередного отказа
    Met113  RELEASE  P$Vsp1   ; Освобождение канала с номером в Р$Vsp1
      TRANSFER  ,Met5  ; Отправить для счета потерь
    Met6  TERMINATE  ; Уничтожение сообщений, отправленных самим себе
    ; Сегмент счета переданных и потерянных сообщений и расчет вероятностей передачи сообщений
    Met10  SAVEVALUE  *11+,1 ; Cчет в ячейке с номером в Р11 полученных сообщений всего и по категориям
      SAVEVALUE  *13,(X*11/X*10) ; Расчет и сохранение в ячейке с номером в Р13 КПС сети по категориям
      MSAVEVALUE Pol+,P$NumPol,P$NumOtpr,1 ; Счёт и запись в матрицу полученных сообщений
      MSAVEVALUE KPS,P$NumOtpr,P$NumPol, (MX$Pol(P$NumPol,P$NumOtpr)/MX$Otpr(P$NumOtpr,P$NumPol))
      TERMINATE  
    Met5  SAVEVALUE  *12+,1 ; Cчет в ячейке с номером в Р12 потерянных сообщений всего и по категориям
      TERMINATE
    ; Задание времени моделирования и расчёт результатов
      GENERATE  VrMod  ; Задание времени моделирования
      TEST L  X$Prog,TG1,Met30 ; Если X$Prog<TG1,
      SAVEVALUE  Prog,TG1      ; то X$Prog=TG1
    Met30  TEST E  TG1,1,Met32 ; Если TG1=1, расчёт и сохранение результатов
      SAVEVALUE  TimeS,(X$TimeSum/N$Met10) ; Расчёт и сохранение в TimeS среднего времени передачи одного сообщения
      SAVEVALUE  VPerS,(N$Met10/N$Met4)  ; Расчет и сохранение в ячейке VPerS КПС сети
      SAVEVALUE  VPotS,(N$Met5/N$Met4)  ; Расчет и сохранение в ячейке VPotS КПС сети
    Met32 TERMINATE  1
      START  1000

    Интерпретация результатов моделирования

    Всего выполнено 6 экспериментов. Изменение параметров сети связи проводилось так же, как и в предыдущих моделях. То есть в каждом следующем эксперименте параметры, изменённые в предыдущем эксперименте, остаются такими же, если не указано их изменение. В шестом эксперименте кроме указанных параметров были также изменены средние интервалы поступления сообщений от всех абонентов с 30 до 20.

    В Anylogic в поле Конечное время: было введено 3600000.0. Время моделирования увеличено в 1000 раз по числу прогонов модели. В GPSS указывается модельное время 3600 и 1000 прогонов модели.

    Результаты экспериментов сведены в табл. 4.11. Видно, что результаты моделирования отличаются незначительно. Коэффициенты пропускной способности ($$\Delta_{11} … \Delta_{61}$$) отличаются на 0…0,001, а среднее время передачи одного сообщения ($$\Delta_{12} … \Delta_{62}$$) - на 0,075…1,085 с. Коэффициенты загрузки вычислительных комплексов также отличаются на 0…0,020, а коэффициенты загрузки основных каналов - на 0,000…0,001.

    В четвёртом и пятом экспериментах в связи с уменьшением ёмкостей входных буферов ВК1 и ВК2 сообщения второй категории не передаются, так как их средняя длина из всех категорий максимальная.

    Сравнительная оценка позволяет сделать вывод об адекватности результатов моделирования, полученных при использовании для построения моделей одной и той же системы инструментальных средств GPSS World и AnyLogic.

    Машинное время выполнения модели в GPSS World составляет 22 … 24 с, а в AnyLogic примерно 5 мин.

    Показатели функционирования сети связи
    ПоказателиGPSS WorldAnyLogic
    1) Согласно постановке задачи
    Коэффициент пропускной способности сети связи0,8160,815
    $$\Delta_{11}=\mid 0,816-0,815\mid=0,001$$
    Среднее время передачи одного сообщения6,1276,052
    $$\Delta_{12}=\mid6,127-6,052\mid=0,075$$
    Коэффициент загрузки ВК10,2550,255
    Коэффициент загрузки ВК20,170,17
    Средний коэффициент загрузки основных каналов 0,0420,042
    Среднее количество полученных / отправленных сообщений489,930/600,263490,195/601,092
    2) emkBuferVx =…= emkBuferVx = 70000
    Коэффициент пропускной способности сети связи0,7410,741
    $$\Delta_{21}=\mid0,741-0,741\mid=0,000$$
    Среднее время передачи одного сообщения6,1275,867
    $$\Delta_{22}=\mid6,127-5,867\mid=0,260$$
    Коэффициент загрузки ВК10,2550,255
    Коэффициент загрузки ВК20,170,17
    Средний коэффициент загрузки основных каналов 0,0430,043
    Среднее количество полученных / отправленных сообщений444,728/600,263444,863/600,347
    3) emkBuferVx =…= emkBuferVx = 60000
    Коэффициент пропускной способности сети связи0,5990,599
    $$\Delta_{31}=\mid0,599-0,599\mid=0,000$$
    Среднее время передачи одного сообщения6,1325,66
    $$\Delta_{32}=\mid6,132-5,660\mid=0,472$$
    Коэффициент загрузки ВК10,2550,256
    Коэффициент загрузки ВК20,170,17
    Средний коэффициент загрузки основных каналов 0,0430,043
    Среднее количество полученных / отправленных сообщений359,640/600,584360,251/601,104
    4) emkBufer1 = 4 000 000
    Коэффициент пропускной способности сети связи0,5990,6
    $$\Delta_{41}=\mid0,599-0,600\mid=0,001$$
    Среднее время передачи одного сообщения6,1325,65
    $$\Delta_{42}=\mid6,132-5,650\mid=0,482$$
    Коэффициент загрузки ВК10,2550,251
    Коэффициент загрузки ВК20,170,169
    Средний коэффициент загрузки основных каналов 0,0430,042
    Среднее количество полученных / отправленных сообщений359,640/600,584359,651/599,302
    5) emkBufer1 = 3 000 000
    Коэффициент пропускной способности сети связи0,5990,598
    $$\Delta_{51}=\mid0,599-0,598\mid=0,001$$
    Среднее время передачи одного сообщения6,1325,648
    $$\Delta_{52}=\mid6,132-5,648\mid\mid=0,484$$
    Коэффициент загрузки ВК10,2550,256
    Коэффициент загрузки ВК20,170,17
    Средний коэффициент загрузки основных каналов 0,0430,044
    Среднее количество полученных / отправленных сообщений359,640/600,584360,114/601,495
    6) emkBuferVx =…= emkBuferVx = 100000, emkBufer1 = 6 000 000
    Коэффициент пропускной способности сети связи0,9960,996
    $$\Delta_{61}=\mid0,996-0,996\mid=0,000$$
    Среднее время передачи одного сообщения6,1557,237
    $$\Delta_{62}=\mid6,155-7,237\mid=1,082$$
    Коэффициент загрузки ВК10,3620,382
    Коэффициент загрузки ВК20,2380,254
    Средний коэффициент загрузки основных каналов 0,0640,064
    Среднее количество полученных / отправленных сообщений848,296/851,388896,072/899,333
    Вернуться к учебному плану