Опубликован: 07.11.2014 | Доступ: свободный | Студентов: 442 / 37 | Длительность: 15:17:00
ISBN: 978-5-9556-0161-8
Тема: САПР
Лекция 5:

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

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Событийная часть сегмента Маршрутизатор

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

В свою очередь вычислительный комплекс содержит Блок контроля 1, Буфер 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 и на странице Текст панели Свойства вместо text введите Блок контроля 1.
  5. Выделите объект selectOutput.
  6. В поле Имя: вместо selectOutput введите blokKontrol_1.
  7. В поле Тип заявки: Agent замените Message.
    Событийная часть сегмента Маршрутизатор

    увеличить изображение
    Рис. 4.11. Событийная часть сегмента Маршрутизатор
    Алгоритм работы Блока контроля 1

    увеличить изображение
    Рис. 4.12. Алгоритм работы Блока контроля 1
  8. Установите Выход true выбирается При выполнении условия.
  9. В поле Условие введите условие:
    (emkostBufer1-tekEmkostBufer1>=entity.dlina)&&
    (hold.isBlocked()==false)

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

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

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

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

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

  1. В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  2. На странице Местоположение и размер панели Свойства введите в поля X: 190, Y: 50, Ширина: 126, Высота: 100.
  3. На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не ставьте флажок Отображать имя.
  4. Перетащите элемент text и на странице Текст панели

    Свойства вместо text введите Буфер 1.

    Алгоритм работы блока Буфер 1

    увеличить изображение
    Рис. 4.13. Алгоритм работы блока Буфер 1
  5. Выделите объект queue.
  6. В поле Имя: вместо queue введите bufer1.
  7. В поле Тип заявки: Agent замените Message.
  8. В поле Вместимость введите emkBufer1.
  9. При помещении сообщения в буфер его текущая емкость увеличивается, поэтому в поле Действия При входе введите:
    tekEmkBufer1 += entity.dlina;
  10. При выходе сообщения из буфера его текущая емкость уменьшается, поэтому в поле Действия При выходе введите:
    tekEmkBufer1 -= entity.dlina;
    entity.timeObr=entity.dlina/proizvod;
  11. Поставьте флажок Включить сбор статистики.
Блок обработки сообщений

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

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

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

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

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

  1. В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  2. На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Также не устанавливайте флажок Отображать имя.
  3. На странице Местоположение и размер панели Свойства введите в поля X: 336, Y: 50, Ширина: 194, Высота: 100.
  4. Перетащите элемент text и на странице Текст панели Свойства вместо text введите название Блок обработки сообщений.
  5. Перетащите объект delay, разместите и соедините с bufer_1 так, как на Рис. 4.11.
  6. Выделите объект delay. На странице Основные панели Свойства в поле Имя: вместо delay введите сomputer.
  7. В поле Тип заявки: Agent замените Message.
  8. Задержка задаётся установите Определённое время.
  9. В поле Время задержки введите:
    exponential(1/entity.timeObr)
  10. Оставьте Вместимость 1.
  11. Действие при выходе
    коэфЗагрВК1=computer.statsUtilization.mean();
  12. Установите флажок Включить сбор статистики.
  13. В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  14. На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не ставьте флажок Отображать имя.
  15. На странице Местоположение и размер панели Свойства введите в поля X: 20, Y: 40, Ширина: 520, Высота: 170.
  16. Перетащите элемент text и на странице Текст панели Свойства вместо слова text введите название Вычислительный комплекс.
Блок контроля 2

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

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

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

увеличить изображение
Рис. 4.15. Алгоритм работы блока Блок контроля 2

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

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

  1. Перетащите объект exit, вход которого соедините с выходом computer (Рис. 4.10).
  2. В поле Тип заявки: Agent замените Message.
  3. В поле Действия При выходе введите код:
    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.

  1. В Палитре выделите Презентация. Перетащите элемент Прямоугольник (см. Рис. 4.11).
  2. На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
  3. На странице Местоположение и размер панели Свойства введите в поля X: 550, Y: 20, Ширина: 140, Высота: 290.
  4. Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Буфер 2.
  5. Перетащите пять объектов enter, четыре объекта queue и один объект sink, разместите, дайте имена и соедините так, как на Рис. 4.11.
  6. Выделите элемент buferNapr1, вход которого соединён с выходом enter1 и установите значения свойств.
  7. В поле Тип заявки: Agent замените Message.
  8. Вместимость emkBuferNapr1
  9. В поле Действия При входе введите:
    tekEmkNapr1 += entity.dlina;
  10. В поле Действия При выходе введите:
    tekEmkNapr1 -= entity.dlina;
  11. Установите флажок Включить сбор статистики.
  12. Выделите элемент buferNapr2, вход которого соединен с выходом enter2 и установите значения свойств.
  13. В поле Тип заявки: Agent замените Message.
  14. Вместимость emkBuferNapr2
  15. В поле Действия При входе введите:
    tekEmkNapr2 += entity.dlina;
  16. В поле Действия При выходе введите:
    tekEmkNapr2 -= entity.dlina;
  17. Установите флажок Включить сбор статистики.
  18. Выделите элемент buferNapr3, вход которого соединен с выходом enter3 и установите значения свойств.
  19. В поле Тип заявки: Agent замените Message.
  20. Вместимость emkBuferNapr3
  21. В поле Действия При входе введите:
    tekEmkNapr3 += entity.dlina;
  22. В поле Действия При выходе введите:
    tekEmkNapr3 -= entity.dlina;
  23. Установите флажок Включить сбор статистики.
  24. Выделите элемент buferNapr4, вход которого соединен с выходом enter4 и установите значения свойств.
  25. В поле Тип заявки: Agent замените Message.
  26. Вместимость emkBuferNapr4
  27. В поле Действия При входе введите:
    tekEmkNapr4 += entity.dlina;
  28. В поле Действия При выходе введите:
    tekEmkNapr4 -= entity.dlina;
  29. Установите флажок Включить сбор статистики.
Организация входных и выходных портов

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

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

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

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

Сегмент Канал

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

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

Исходные данные
  1. Откройте объект Канал. Перейдите на область просмотра viewData.
  2. Перетащите элемент Скруглённый прямоугольник.
  3. На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 752, Ширина: 377, Высота: 118.
  4. Перетащите элементы Параметр и Переменная, разместите и дайте им имена согласно Рис. 4.16.
  5. Типы и значения по умолчанию установите согласно Табл. 4.8.
Таблица 4.8.
Имя Тип Значение по умолчанию
skorPeredKan double 5000
skorPeredKanR double 5000
timeOtkKan double 360
timeVosstKan double 3,2
timeBklResK double 0,1
всего_потеряно_сообщ int 0
Событийная часть сегмента Каналы
  1. Перейдите на область просмотра облКаналы.
  2. Перетащите элемент Прямоугольник.
  3. На странице Местоположение и размер панели Свойства введите в поля X: 186, Y: 50, Ширина: 200, Высота: 135.
  4. Перетащите объект selectOutput, разместите как на Рис. 4.17.
  5. Оставьте предложенные системой имена и флажок Отображать имя.
  6. В поле Тип заявки: Agent замените Message.
    Исходные данные сегмента Канал

    увеличить изображение
    Рис. 4.16. Исходные данные сегмента Канал
    Объекты событийной части сегмента Канал

    увеличить изображение
    Рис. 4.17. Объекты событийной части сегмента Канал
  7. Выход true выбирается: При выполнении условия.
  8. Условие: основной_канал_работает.
  9. При выходе (true):
    entity.timePered=entity.dlina/skorPeredKan;
  10. В поле Вместимость введите 1.
  11. При выходе (false):
    if (а==0)
    entity.timePered=entity.dlina/skorPeredKanR;
    if (а==1)
    {entity.timePered=entity.dlina/skorPeredKanR +
    timeBklResK;
    а=0;}
    а=1;
  12. Установите флажок Включить сбор статистики.
  13. Скопируйте объект delay. Вставьте его один раз. При этом изменится имя на основной_канал, а остальные свойства останутся неизменными.
  14. Замените имя основной_канал на резерв_канал.
  15. Действия При выходе
    коэфЗагрРезК=резерв_канал.statsUtilization.mean();
    коэфЗагрКан=коэфЗагрОснК+коэфЗагрРезК;
  16. Соедините согласно Рис. 4.17 объекты selectOutput и delay.
Организация входного и выходного портов
  1. Перетащите элемент Скруглённый прямоугольник.
  2. На странице Местоположение и размер панели Свойства введите в поля X: 50, Y: 80, Ширина: 60, Высота: 52.
  3. Из палитры Основная перетащите два элемента Порт. Разместите их как на Рис. 4.17. В полях Имя: предложенные системой имена замените согласно Рис. 4.17. Установите флажки Отображать имя.
  4. Обратите также внимание на то, чтобы у элементов Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Канал этот флажок должен быть сброшенным.
  5. Соедините выходы элементов основной_канал и резерв_канал с портом вых, а порт вх - с входом элемента selectOutput.
Имитатор отказов каналов связи

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

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

Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю?

Еще раз спасибо за прекрасный курс!

Артём Нагайцев
Артём Нагайцев

Выдает ошибку "entity cannot be resolved to a variable" при попытке запуска. В чем может быть причина? Ошибка в строках

entity.time_vxod=time(); 

time_obrabotki.add(time()-entity.time_vxod);