мод сис / V.Boev-GPSSvsAnyLogic
.pdfТаблица 4.4
Свойство |
selectOutput |
|
|
Класс заявки: |
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); |
|
|
Условие 0 |
a<=verKat.get(1) |
|
|
Действие при |
entity.numKat=1; |
выходе 0 |
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); |
|
|
Условие 1 |
a<=ver verKat.get(2) |
|
|
Действие при |
entity.numKat=2; |
выходе 1 |
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); |
|
|
151
|
Продолжение табл. 4.4 |
|
|
Свойство |
selectOutput |
|
|
Условие 2 |
a<=verKat.get(3) |
|
|
Действие при |
entity.numKat=3; |
выходе 2 |
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); |
|
|
Условие 3 |
a<=verKat.get(4) |
|
|
Действие при |
entity.numKat=4; |
выходе 3 |
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 |
Использовать: |
Условия |
|
|
Условие 0 |
(entity.numAbOtpr!= |
|
entity.numAbPol)&&(entity.numAbPol==1) |
|
|
Условие 1 |
(entity.numAbOtpr!= |
|
entity.numAbPol)&&(entity.numAbPol==2) |
|
|
Действие при |
отпрАб2++; |
выходе 1 |
get_Main().отпр12=отпрАб2; |
|
|
152
|
Окончание табл. 4.4 |
|
|
Свойство |
selectOutput1 |
|
|
Условие 2 |
(entity.numAbOtpr!= |
|
entity.numAbPol)&&(entity.numAbPol==3) |
|
|
Действие при |
отпрАб3++; |
выходе 2 |
get_Main().отпр13=отпрАб3; |
|
|
Условие 3 |
entity.numAbOtpr==entity.numAbPol |
|
|
Свойство |
selectOutput2 |
|
|
Класс заявки: |
Message |
Использовать: |
Условия |
|
|
Условие 0 |
entity.numAbPol==4 |
|
|
Действие при |
отпрАб4++; |
выходе 0 |
get_Main().отпр14=отпрАб4; |
|
|
Условие 1 |
entity.numAbPol==5 |
|
|
Действие при |
отпрАб5++; |
выходе 1 |
get_Main().отпр15=отпрАб5; |
|
|
Условие 2 |
entity.numAbPol==6 |
|
|
Действие при |
отпрАб6++; |
выходе 2 |
get_Main().отпр16=отпрАб6; |
|
|
5.Перетащите объект queue. Укажите его свойства: Имя:
Буфер. Класс заявки: Message. Вместимость 100. Соедините выходы 0…3 selectOutput1 с входом элемента Буфер (см. рис. 4.8).
6.Соедините выход по умолчанию selectOutput1 с входом selectOutput2. Через этот выход будут проходить на selectOutput2 сообщения, адресованные абонентам 4, 5 и 6.
7.Выделите selectOutput2 и установите значения свойств, указанных также в табл. 4.4. Соедините все выходы selectOutput2 с входом элемента Буфер.
Отправляемое сообщение поступило в буфер. Дальше оно должно попасть в канал связи. Создайте порты для отправления и приѐма сообщений.
1.Из палитры Презентация перетащите элемент Скруглѐн-
ный прямоугольник.
2.Перейдите на страницу Дополнительные панели Свойст-
ва. Введите в поля X: 210, Y: 100, Ширина: 65, Высота: 60.
153
3. Из палитры Основная перетащите два элемента порт. Разместите их как на рис. 4.8. В поле Имя: замените предложенное системой на вх и вых.
4. Обратите внимание на то, чтобы у элементов Скруг-
лѐнный прямоугольник и порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Абонент1 этот флажок должен быть сброшенным.
Итак, отправляемое сообщение поступило в канал связи, подключѐнный к порту вых.
Через порт вх сообщения поступают из канала связи. Продолжим построение блока Абонент1.
1.Перетащите объект selectOutput (имя selectOutput3). Он предназначен для контроля текущей ѐмкости входного буфера. В случае заполнения буфера, сообщения теряются.
2.Соедините порт вх с входом объекта selectOutput3.
3.Перетащите объект sink (имя sink1). Его вход соедините с выходом F объекта selectOutput3.
4.Выделите объект selectOutput3 и установите его свойства:
Класс заявки: Message
Выход true выбирается При выполнении условия
Условие emkBuferVx-tekEmkBuferVx>=entity.dlina
5.Перетащите объект queue. Укажите его свойства:
Имя: БуферВх
Класс заявки: Message Вместимость emkBuferVx
Действие при входе tekEmkBuferVx+=entity.dlina; Действие при выходе tekEmkBuferVx-=entity.dlina;
Соедините его вход с выходом Т объекта selectOutput3.
6.Перетащите объект selectOutput5 (имя selectOutput4). Он предназначен для разделения потока полученных сообщений по категориям. На странице Основные панели Свойства установите свойства согласно табл. 4.5. Эти свойства также являются кодом. Код предназначен для счѐта полученных сообщений за сеть связи
вцелом и по категориям сообщений, определения количества полученных сообщений за один прогон, вывода расчѐтов за каждого абонента, а также за сеть связи в целом.
7.Соедините выход элемента БуферВх с выходом объекта selectOutput4.
154
Таблица 4.5
Свойство |
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); |
|
|
Условие 0 |
entity.numKat==1 |
|
|
Действие при |
k1++; |
выходе 0 |
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); |
|
|
Условие 1 |
entity.numKat==2 |
|
|
Действие при |
k2++; |
выходе 1 |
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); |
|
|
Условие 2 |
entity.numKat==3 |
|
|
Действие при |
k3++; |
выходе 2 |
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); |
|
|
155
Продолжение табл. 4.5
Условие 3 |
entity.numKat==4 |
|
|
Действие при |
k4++; |
выходе 3 |
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 |
Использовать: |
Условия |
|
|
Условие 0 |
entity.numAbOtpr==1 |
|
|
Условие 1 |
entity.numAbOtpr==2 |
|
|
Действие при |
отАб2++; |
выходе 1 |
get_Main().кПрСп21=отАб2/get_Main(). |
|
отпр21; |
|
get_Main().КПрСп21.setText(get_Main(). |
|
кПрСп21, true); |
|
|
Условие 2 |
entity.numAbOtpr==3 |
|
|
Действие при |
отАб3++; |
выходе 2 |
get_Main().кПрСп31=отАб3/get_Main(). |
|
отпр31; |
|
get_Main().КПрСп31.setText(get_Main(). |
|
кПрСп31, true); |
|
|
Условие 3 |
entity.numAbOtpr==4 |
|
|
Действие при |
отАб4++; |
выходе 3 |
get_Main().кПрСп41=отАб4/get_Main(). |
|
отпр41; |
|
get_Main().КПрСп41.setText(get_Main(). |
|
кПрСп41, true); |
|
|
Свойство |
selectOutput6 |
|
|
Класс заявки: |
Message |
Использовать: |
Условия |
|
|
Условие 0 |
entity.numAbOtpr==5 |
|
|
Действие при |
отАб5++; |
выходе 0 |
get_Main().кПрСп51=отАб5/get_Main(). |
|
|
156
Окончание табл. 4.5
|
отпр51; |
|
get_Main().КПрСп51.setText(get_Main(). |
|
кПрСп51, true); |
|
|
Условие 1 |
entity.numAbOtpr==6 |
|
|
Действие при |
отАб6++; |
выходе 1 |
get_Main().кПрСп61=отАб6/get_Main(). |
|
отпр61; |
|
get_Main().КПрСп61.setText(get_Main(). |
|
кПрСп61, true); |
|
|
8.Перетащите два объекта selectOutput5 (имена selectOutput5
иselectOutput6). Объекты предназначены для разделения и счѐта получаемых сообщений по абонентам. Значения свойств установите также согласно табл. 4.5. Выход по умолчанию объекта selectOutput5 соедините с входом объекта selectOutput6.
9.Перетащите объект sink2. Его вход соедините с выходами
0…3 объекта selectOutput5 и выходами объекта selectOutput6.
10.Установите свойства объекта sink2 согласно табл. 4.6. Код рассчитывает коэффициент пропускной способности сети связи и время передачи одного сообщения.
|
Таблица 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); |
|
|
157
4.1.8.Сегмент Маршрутизатор
4.1.8.1.Исходные данные
1.Откройте объект Маршрутизатор.
2.Перейдите на область просмотра viewData.
3.Перетащите из палитры Презентация элемент Скруглен-
ный прямоугольник. На странице Основные в поле Имя: ос-
тавьте имя, предложенное системой.
4.Перейдите на страницу Дополнительные панели Свойст-
ва. Введите в поля X: 10, Y: 600, Ширина: 314, Высота: 190.
5.Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Исходные данные (рис. 4.9.).
6.Перетащите элементы Параметр и Простая переменная.
Разместите их и дайте имена согласно рис. 4.10.
7.Значения по умолчанию элементов Параметр установите согласно табл. 4.7.
8.Тип timeOtkBK, timeVosstBK, proizvod установите double,
остальных параметров и простых переменных — int.
Рис. 4.10. Исходные данные сегмента Маршрутизатор
158
|
|
|
Таблица 4.7 |
|
|
|
|
|
|
Имя |
Значение по |
Имя |
Значение по |
|
умолчанию |
умолчанию |
|||
|
|
|||
emkBufer1 |
5000000 |
emkBuferNapr1 |
250000 |
|
timeOtkBK |
3600 |
emkBuferNapr2 |
250000 |
|
timeVosstBK |
3.7 |
emkBuferNapr3 |
250000 |
|
proizvod |
40000 |
emkBuferNapr4 |
250000 |
4.1.8.2. Событийная часть сегмента Маршрутизатор
Элементы событийной части сегмента Маршрутизатор показаны на рис. 4.11. Сегмент включает Вычислительный комплекс,
Буфер 2, порты входа-выхода, Имитатор отказов вычислительного комплекса.
В свою очередь вычислительный комплекс содержит Блок контроля 1, Буфер 1, Блок обработки сообщений.
Приступим к построению событийной части сегмента Мар-
шрутизатор.
4.1.8.2.1. Блок контроля 1
Блок предназначен для контроля текущей емкости буфера 1 маршрутизатора. Он анализирует наличие в буфере 1 свободной памяти, достаточной для хранения поступившего сообщения, и
взависимости от результата анализа сообщение либо помещается
вбуфер 1, либо уничтожается.
Алгоритм работы Блока контроля 1 представлен на рис. 4.12. В AnyLogic этот алгоритм реализуется блоками selectOutput,
hold и sink.
1.В Палитре выделите Презентация. Перетащите элемент
Прямоугольник.
2.Перейдите на страницу Дополнительные панели Свойст-
ва. Введите в поля X: 26, Y: 50, Ширина: 154, Высота: 150.
3. Перетащите объекты selectOutput, hold и sink на диаграмму класса Маршрутизатор, разместите и соедините так, как показано на рис. 4.11.
4. Перетащите элемент text и на странице Основные панели
Свойства в поле Текст: введите Блок контроля 1.
5.Выделите объект selectOutput.
6.В поле Имя: вместо selectOutput введите blokKontrol_1.
7.В поле Класс заявки: Entity замените Message.
159
160