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

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

< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Источники сообщений

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

  1. В Палитре выделите Библиотека моделирования процессов.
  2. Перетащите два объекта source на диаграмму типа агента Main и разместите в прямоугольнике с именем Источники сообщений.
  3. Для записи и хранения параметров сообщений в дополнительные поля заявок нужно создать новый тип заявки. Создайте тип заявки Message.
  4. В панели Проект щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать Java класс.
  5. Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса Message.
  6. В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните кнопку Далее.
  7. Появится вторая страница Мастера создания Java класса. Добавьте следующее поле Java класса, которое потребуется в дальнейшем для разделения переданного направлением потока сообщений на поток 1 и поток 2:
    int  numPotok
  8. Оставьте выбранными флажки Создать конструктор и Создать метод toString().
  9. Щёлкните кнопку Готово. Появится редактор кода и автоматически созданный код вашего Java класса. Закройте код.
  10. Теперь нужно преобразовать Java класс в тип агента. Для этого щёлкните правой кнопкой мыши в панели Проект только что созданный Java класс и в контекстном меню выберите Преобразовать Java класс в тип агента.
  11. Появится окно c автоматически созданными параметрами нового типа заявок Detail.
  12. Выделите последовательно первый и второй объекты sourсe. На странице Основные панели Свойства установите их свойства согласно Табл. 3.3.
Буфер, основной и резервный каналы

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

  1. В Палитре выделите Библиотеку моделирования процессов.
  2. Перетащите на диаграмму Main и разместите в прямоугольнике с именем Буфер, основной и резервный каналы объекты, показанные на Рис. 3.4. Соедините их между собой, а также с объектами сегмента Источники сообщений.
    Таблица 3.3. Свойства объектов source
    Имя Свойства Значения
    Поток_1 Отображать имя Установите флажок
    Тип заявки Message
    Прибывают согласно Времени между прибытиями
    Время между прибытиями exponential(1/интер_сообщ_потока1)
    Новая заявка Message
    Действия при выходе: entity.numPotok = 1;
    поступило_сообщ_потока1 ++;
    всего_сообщ_поступило ++;
    Поток_2 Отображать имя Установите флажок
    Тип заявки Message
    Прибывают согласно Времени между прибытиями
    Время между прибытиями exponential(1/интер_сообщ_потока2)
    Новая заявка Message
    Действия при выходе: entity.numPotok = 2;
    поступило_сообщ_потока2 ++;
    всего_сообщ_поступило ++;
  3. Объект source вам известен. Объект hold из Библиотеки моделирования процессов нет. Он блокирует/разблокировывает поток заявок на определенном участке блок-схемы. Если объект находится в заблокированном состоянии, то заявки не будут поступать на его входной порт, и будут ждать, пока объект не будет разблокирован.
  4. Состоянием объекта можно управлять программно с помощью метода setBlocked(). Метод блокирует входной порт, если в качестве значения аргумента передано true, и разблокировывает его при передаче аргумента false.
  5. Метод isBlocked() возвращает true, если входной порт заблокирован. Если порт не заблокирован - возвращает false. Мы в дальнейшем воспользуемся этими методами.
    Объекты двух сегментов модели

    увеличить изображение
    Рис. 3.4. Объекты двух сегментов модели
  6. Последовательно выделите объекты и установите им свойства согласно Табл. 3.4.
Таблица 3.4.
Свойства Значение
Имя Буфер
Отображать имя Установить флажок
Тип заявки Message
Вместимость ёмкость_буфера
Действия При входе: текущая_ёмкость_буфера=буфер.size();
Действия При выходе: текущая_ёмкость_буфера=буфер.size();
Разрешить вытеснение Установить флажок
Имя hold1
Отображать имя Установить флажок
Тип заявки Message
Изначально заблокирован Установить флажок
Имя hold
Тип заявки Message
Имя потер_сообщ_буфер
Отображать имя Установить флажок
Тип заявки Message
Действия При входе: if (entity.numPotok == 1)
потеряно_сообщ_потока1 ++;
if (entity.numPotok == 2)
потеряно_сообщ_потока2 ++;
всего_потеряно_сообщ ++;
Имя основной_канал
Отображать имя Установить флажок
Тип заявки Message
Тип Определённое время
Время задержки exponential(1/время_передачи_осн_кан)
Вместимость 1
Включить сбор статистики Установить флажок
Имя резерв_канал
Отображать имя Установить флажок
Тип заявки Message
Вместимость 1
Тип Определённое время
Время задержки exponential(1/время_передачи_рез_кан)
Действия При входе: if (а==0)
в = время_передачи_рез_кан;
if (а==1)
{в = время_передачи_рез_кан +
время_вкл_рез_кан;
а=0;}
Действия При выходе: if (hold.isBlocked()== true)
Включить сбор hold1.setBlocked(false);
статистики Установить флажок
Имя sink
Отображать имя Установить флажок
Тип заявки Message
Действие при входе if (entity.numPotok == 1)
{передано_сообщ_потока1 ++;
вероятность_передачи_сообщ_потока1 = передано_сообщ_потока1 /поступило_сообщ_потока1;}
if (entity.numPotok == 2)
{передано_сообщ_потока2 ++;
вероятность_передачи_сообщ_потока2 = передано_сообщ_потока2 /поступило_сообщ_потока2;}
всего_передано_сообщ ++;
вероятность_передачи_сообщ =
всего_передано_сообщ
/всего_сообщ_поступило;
вероятность_потери_сообщ = 1-
вероятность_передачи_сообщ;
Имитатор отказов основного канала связи

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

Сегмент построен из объектов и элементов, показанных на Рис. 3.5. Идея его работы заключается в следующем. Генератор вырабатывает одну заявку, и становится неактивным. Заявка поступает на объект задержки, разыгрывающий время до очередного отказа. После этого заявка поступает на второй объект задержки, имитирующий время восстановления основного канала.

C выхода второго объекта задержки заявка поступает опять на вход первого объекта задержки. Процесс имитации отказов повторяется в цикле.

Аналогичным образом построен сегмент имитации отказов основного канала и в GPSS-модели (см. п. 3.2).

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

Постройте сегмент имитации отказов основного канала связи.

  1. Перетащите из Библиотеки моделирования процессов source и два объекта delay, соедините их как на Рис. 3.5.
  2. Последовательно выделите и установите свойства объектов согласно Табл. 3.5.
Сегмент имитации отказов основного канала связи

увеличить изображение
Рис. 3.5. Сегмент имитации отказов основного канала связи
Таблица 3.5.
Свойства Значение
Имя source
Отображать имя Установить флажок
Тип заявки Agent
Прибывают согласно Интенсивности
Интенсивность прибытия 1
Ограниченное количество прибытий Установить флажок
Количество заявок, прибывающих за один раз 1
Имя розыгрыш_инт_до_отказа
Отображать имя Установить флажок
Тип заявки Agent
Тип Определённое время
Время задержки exponential (1/время_нараб_отказ_осн_кан)
Вместимость 1
Действия При выходе: hold.setBlocked(true);
if (основной_канал.size()!=0)
{основной_канал.remove((Message)
основной_канал.get(0));
всего_потеряно_сообщ ++;}
hold1.setBlocked(false);
а=1;
Включить сбор статистики Установить флажок
Имя имитация_восст_осн_кан
Тип заявки Agent
Тип Определённое время
Время задержки exponential (1/время_нараб_отказ_осн_кан)
Вместимость 1
Действия При выходе: hold.setBlocked(false);
hold1.setBlocked(true);
Включить сбор статистики Установить флажок

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

Также организовано и в GPSS-модели, но для этого использована сохраняемая ячейка Kont (см. п. 3.2).

В модели AnyLogic после занятия сообщением резервного канала элемент hold1 блокируется. Может быть так, что в процессе передачи сообщения резервным каналом возобновит работу основной канал, то есть элемент hold будет разблокирован, и сообщения пойдут на основной канал. Чтобы такая ситуация учитывалась и в GPSS-модели, в нее добавлена команда

UNLINK	Nak,Prov3,1

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

< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Игорь Маникин
Игорь Маникин

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

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

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

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

entity.time_vxod=time(); 

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