В ходе выполнения лабораторной работы нужно построить модель сортировочной горки. Данная работа состоит из 4-х шагов, которые будут описаны ниже.
Шаг 1. Создание железнодорожного узла
С помощью нашей модели мы воспроизведем отправление вагонов на путь, который называют стрелочной горловиной. Оттуда вагоны отправляются через серию стрелок, называемую стрелочной улицей, на пути сортировки.
Мы начнем с топологии железнодорожной сети, как на рисунке 1.
Рисунок 1 - Топология железнодорожной сети
Создадим новую модель. Назовём ее Hump Yard и укажем минуты в качестве единиц модельного времени.
Зададим топологию путей. Сначала нарисуем ж/д пути.
Начнем с прямого пути. На этом пути будут появляться поезда, поэтому мы назовем его trackEntry. Мы будем давать осмысленные имена только тем путям, на которые будут ссылаться блоки диаграммы процесса. Остальные пути могут остаться названными по умолчанию.
Нарисуем прямой ж/д путь (рисунок 2)
Сначала выделим двойным щелчком элемент Ж/д путь в секции Разметка пространства палитры Железнодорожная библиотека.
Щёлкнем в любой точке графического редактора, чтобы начать рисовать путь.
Чтобы нарисовать прямой сегмент пути, добавим щелчком мыши конечную точку сегмента.
Завершите рисование двойным щелчком.
Назовём этот ж/д путь trackEntry.
Рисунок 2 - Прямой ж/д путь
Если это первый ж/д путь в модели, мы увидим сообщение с предложением сменить масштаб модели на: 2,0 пикселя в 1 метре. После этого мы увидим нарисованный прямой ж/д путь, по которому будет двигаться состав. Теперь давайте нарисуем объездной путь, по которому локомотив будет подъезжать к составу сзади для его перемещения на сортировочную горку. Этот путь будет не прямой, а дуговой формы, и сценарий его рисования будет несколько отличаться.
Нарисуем ж/д путь дуговой формы
Совершим двойной щелчок по элементу Ж/д путь в палитре Железнодорожная библиотека. Затем щелкнем по ранее нарисованному пути чтобы начать рисовать новый ж/д путь. Круг, обозначающий стрелку, появится автоматически.
Последовательно щелкая мышью, нарисуем несколько сегментов пути, чтобы получился путь, как на рисунке 2.
Рисунок 3 - Сегменты пути
Перетащим конечную точку (2) на ранее нарисованный путь (trackEntry), чтобы создать стрелку.
Рисунок 4 - trackEntry
Отредактируем ж/д путь дуговой формы
Выделим путь, который хотите отредактировать, щелкнув по нему.
Щелкнем правой кнопкой мыши по выделенному пути и выберем Редактировать направляющие из контекстного меню.
Чтобы переместить крайнюю точку сегмента, перетащим квадратную метку-манипулятор.
Чтобы изменить радиус кривизны, переместим круглую метку-манипулятор на конце пунктирной направляющей линии.
Рисунок 5 - Ж/д путь другой платформы
Железнодорожные стрелки
Железнодорожная сеть состоит из путей и стрелок. Железнодорожные стрелки появляются автоматически в виде круга в точках соединения ж/д веток с существующими путями. В существующую точку соединения нельзя добавить дополнительные ж/д пути.
Два из трех образованных стрелкой углов должны быть тупыми. Это необходимо для определения возможных путей движения на данной стрелке (см. рисунок 6).
Рисунок 6 - Тупой угол
Модифицируйте железнодорожный узел
Каждый раз при создании железнодорожных стрелок, ж/д путь разбивается на отдельные пути. В нашем случае мы создали две железнодорожные стрелки, соединив объездной путь с существующим путем в двух точках. В результате существующий путь разделился на три пути, каждый со своим именем и свойствами.
Сейчас мы дадим осмысленное имя сегменту ж/д пути между железнодорожными стрелками и добавим элементы Точка ж/д пути в наш железнодорожный узел (рисунок 7).
Назовите этот путь trackArrival, так как он обозначает место прибытия поезда.
Перетащите элемент Точка ж/д пути из палитры Железнодорожная библиотека и расположите его, как показано на рисунке ниже. Назовите его stopLineEntry. Он будет определять место появления поездов.
Добавьте элемент Точка ж/д пути: stopLineArrival. В этой точке поезд остановится, чтобы отцепить все вагоны, что позволит локомотиву продолжить путь уже без вагонов.
Добавьте элемент Точка ж/д пути: stopLineHump. Здесь будет производиться сортировка вагонов.
Рисунок 7 - Имя сегмента ж/д пути
Точка ж/д пути
Точка ж/д пути является элементом разметки пространства, который используется, чтобы задать точную позицию на ж/д пути. Это может понадобиться, когда вы задаете:
позицию на пути, где появляется поезд;
позицию на пути, где поезд должен остановиться.
В этой части учебного пособия мы создали железнодорожный узел, который будет далее использоваться в нашей модели.
Шаг 2. Задаем логику
Задайте логику процесса с помощью блоков Железнодорожной библиотеки
Добавьте следующие блоки на диаграмму процесса: TrainSource, TrainMoveTo, TrainDecouple, TrainCouple, TrainDispose. С помощью этих блоков мы зададим логику, согласно которой будет передвигаться наш поезд.
Начните диаграмму с блока TrainSource, который создает поезда, затем добавьте блок TrainMoveTo, расположив его рядом с первым блоком таким образом, чтобы они могли автоматически соединиться. Добавьте оставшиеся блоки на диаграмму процесса, как показано на рисунке 8.
Рисунок 8 - Добавление блоков
В свойствах блоков TrainSource и trainMoveTo укажите следующее:
Сначала мы укажем, чтобы поезда появлялись у ж/д точки stopLineEntry каждые 15 минут.
TrainSource: Время между прибытиями: 15 минут
Кол-во вагонов (включая локомотив): 11
Точка ж/д пути: stopLineEntry
После создания, каждый поезд будет направляться к ж/д точке stopLineArrival, у которой он будет замедляться, после чего окончательно остановится.
TrainMoveTo:
Маршрут: Вычисляется автоматически от текущего пути до пути назначения
Цель движения: Заданная точка пути
Точка ж/д пути: stopLineArrival
При окончании движения: Затормозить и остановиться
Мы также добавили блок TrainDecouple, задача которого отцеплять заданное количество вагонов от поступающего поезда. В свойствах блока можно увидеть, что по умолчанию он отцепляет один вагон от поезда, а именно первый (в нашем случае - это локомотив). Локомотив будет покидать блок через нижний порт outDecoupled (мы добавим это соединение на следующем шаге).
Блок TrainCouple нужен для сцепления локомотива и вагонов в один состав. Ниже приведены описания блоков Железнодорожной библиотеки, которые мы используем.
Продолжим рисование диаграммы процесса
Добавьте три блока TrainMoveTo и соедините их, как показано на рисунке, следуя описанным ниже шагам. С помощью этих блоков мы зададим поведение поезда на железнодорожном узле, которое будет включать в себя: отцепление, ход назад, сцепление с вагонами с последующим выталкиванием их на горку.
Начните с присоединения блока TrainMoveTo к порту outDecoupled (который находится внизу) блока TrainDecouple, так как мы будем задавать логику для отсоединенного локомотива.
Добавьте еще один блок TrainMoveTo на диаграмму процесса (trainMoveTo1). Задайте параметры нового блока, согласно которым локомотив направится к stopLineHump и остановится там.
Маршрут: Вычисляется автоматически от текущего пути до пути назначения
Цель движения: Заданная точка пути
Точка ж/д пути: stopLineHump
При окончании движения: Затормозить и остановиться
Создайте еще два блока TrainMoveTo (trainMoveTo2, trainMoveTo3) путем Ctrl+перетаскивания (Mac OS: Cmd+перетаскивания) блока, который вы только что редактировали.
Измените свойства блока trainMoveTo2. В данный момент локомотив отцеплен и нам нужно, чтобы он затолкал вагоны на горку, т.е. ему нужно вернуться к stopLineEntry и произвести сцепку с концом поезда. Так как мы не можем его развернуть на рельсах, локомотив поедет назад мимо пути trackArrival, на котором стоят вагоны:
Направление движения: Назад
Маршрут не должен содержать: trackArrival
Точка ж/д пути: stopLineEntry
Обратите внимание на количество соединений, ведущих от блока trainMoveTo3 к блоку trainCouple. Нижний порт блока TrainMoveTo, в отличие от порта out, который находится справа, используется поездами, которые сталкиваются с другими поездами. В нашем случае, сталкивание является сцеплением локомотива, прибывающего к точке ж/д пути stopLineArrival, с вагонами, которые мы предварительно отцепили от этого локомотива.
Теперь внесите изменения в свойства блока trainMoveTo3, чтобы этот блок направлял поезд из его текущего местоположения к точке stopLineArrival:
Точка ж/д пути: stopLineArrival
Теперь, когда мы смоделировали передвижение локомотив к концу состава, нужно добавить еще один блок TrainMoveTo путем Ctrl+перетаскивания (Mac OS: Cmd+перетаскивания) блока trainMoveTo1. Он будет моделировать процесс толкания вагонов локомотивом к горке, представленной в нашей модели элементом Точка ж/д пути stopLineHump.
Измените свойства блока trainMoveTo4:
Точка ж/д пути: stopLineHump
Крейсерская скорость: 5 м/с
Добавьте блок Delay из Библиотеки моделирования процессов, чтобы смоделировать задержку. Измените свойства блока, задав время этой задержки:
Время задержки: 15 секунд
Мы завершили Шаг 2. Можете запустить модель и посмотреть, как по ж/д путям передвигаются товарные составы. Если вы увидите ошибку "The car being created must fully be on one track", значит на пути недостаточно места для помещения поезда перед элементом Точка ж/д пути stopLineEntry. В этом случае вам нужно будет увеличить длину пути trackEntry и отодвинуть дальше элемент Точка ж/д пути stopLineEntry от начальной точки ж/д пути.
Локомотив подъезжает к составу, состоящему из вагонов, чтобы сцепиться с ним.
Мы также видим, как локомотив толкает вагоны на горку, после чего останавливается, вагоны отцепляются и сортируются.
Шаг 3. Создаем типы вагонов
Как вы, должно быть, уже видели в окне работающей модели, созданной на предыдущем шаге, вагоны в нашей модели отличались исключительно цветом. Шаг 3 будет посвящен созданию различных типов вагонов.
AnyLogic предоставляет удобный Мастер создания типа вагона. Просто укажите имя нового типа вагона и выберите фигуру анимации из списка готовых 3D объектов.
Задайте типы вагонов
Создайте новый Тип вагона, перетащив элемент Тип вагона из палитры Железнодорожная библиотека на графическую диаграмму Main.
Откроется окно Мастера Создание агентов. Укажите Имя нового типа как Locomotive, оставьте опцию Создать новый тип агента "с нуля" выбранной. Нажмите Далее.
Выберите Locomotive 14.1m в качестве его фигуры анимации в 3D режиме.
Добавьте еще 5 типов вагонов таким же образом. Назовите их BoxCar, OpenCar, GondolaCar, TankCar и HopperCar. Выберите соответствующие 3D фигуры анимации для каждого типа вагона: Крытый вагон, Открытый вагон, Полувагон, Цистерна, Хоппер.
Таким же образом создайте тип поезда (перетащив элемент Тип поезда из палитры Железнодорожной библиотеки). Назовите его Train.
Измените свойства блока TrainSource
Давайте укажем блоку trainSource, чтобы он создавал поезда нашего типа Train:
В поле Новый поезд выберите Train
В Поле Новый вагон введите carSetup(carindex)
Переключитесь к полю для введения кода, щелкнув по иконке , которая сменится на, позволив написать Java выражение. Введите следующее выражение:
Здесь мы используем условный оператор Java для того, чтобы создавать вагоны различных типов. Когда блок TrainSource создает новый поезд, он последовательно вызывает выражение, заданное в поле Новый вагон, для каждого создаваемого вагона поезда. Локальная переменная carindex хранит индекс только что созданного вагона. Наше выражение проверяет выполнение условия carindex==0. Если индекс равен нулю (то есть, мы имеем дело с первым вагоном состава), то будет выполнено выражение, написанное после знака ?
Это выражение new Locomotive() создаст вагон типа Locomotive.
Если заданное логическое условие вернет false, это будет значить, что сейчас создается не первый вагон состава. В этом случае мы воспользуемся функцией randomlyCreate, чтобы случайным образом выбрать один из типов грузовых вагонов, заданных нами на прошлом шаге. Список типов вагонов мы передаем функции в качестве ее аргументов.
В результате, у нас будет поезд с локомотивом в качестве первого вагона, за которым следуют десять вагонов созданных нами типов.
Наблюдайте за моделью в 3D режиме
Добавьте 3D окно из палитры Презентация и поместите его под диаграммой процесса и анимацией.
Запустите модель.
При создании 3D окна, AnyLogic добавляет область просмотра, которая позволяет легко переключаться к сцене 3D анимации во время выполнения модели. Чтобы переключиться к 3D анимации в запущенной модели, откройте панель отладки, щелкнув по кнопке Показать/скрыть панель разработчика в правом углу панели управления. В открывшейся панели отладки, раскройте список Выбрать область и показать и выберите опцию [window3d].
Теперь вы видите поезд, который начинается с локомотива, за которым следуют десять вагонов других типов.
Шаг 4. Моделируем сортировку вагонов
Теперь давайте промоделируем процесс сортировки вагонов и их распределения на разные пути согласно их типу.
Нарисуйте дополнительные ж/д пути
Нарисуйте дополнительно несколько ж/д путей, как показано на рисунке ниже. На этих путях будет происходить накопление вагонов, на каждом пути будут собираться вагоны определенного типа. Чтобы нарисовать подобную топологию ж/д путей, необходимо вначале нарисовать несколько длинных путей, ведущих до самого конца сортировочного парка, и уже затем от некоторых из них рисовать ответвления.
Присвойте путям осмысленные имена: trackN1 ... trackN6.
Добавьте элемент Точка ж/д пути на каждый путь назначения (всего шесть штук). Назовите их stopLineN1, ... stopLineN6. Таким образом, мы задаем линию остановки для каждого пути. Вагоны, которые катятся вниз под действием силы земного притяжения, будут останавливаться у этих точек.
Задайте логику диаграммы процесса
Поезд, прибывающий на сортировочную станцию, может содержать несколько вагонов одного и того же типа, расположенных друг за другом. Такие вагоны могут быть отправлены на свой путь все вместе.
Добавьте Функцию, которая будет подсчитывать количество следующих одним за другим вагонов одного типа в поезде, который находится на горке. Назовите ее carsOfSameType и измените ее свойства следующим образом:
Создайте еще одну Функцию и назовите ее departurePointOnTrack.
Она будет определять путь назначения для вагонов в сортировочном парке (представляющем собой пути, где сортируются вагоны определенного типа).
Эта функция использует поезд как аргумент, затем проверяет тип первого вагона поезда (так как обычно поезд и состоит всего лишь из одного вагона).
Мы находим тип вагона с помощью оператора Java instanceof. Он возвращает true, если объект является единицей заданного класса.
В итоге, функция возвращает элемент Точка ж/д пути, который зависит от типа вагона.
Внесите в свойства следующие изменения:
Перетащите элемент Переменная в графическую диаграмму из палитры Агент. Эта переменная будет содержать ссылку на путь, где требуемое количество вагонов одного типа готово покинуть станцию как новый поезд.
Настройте Переменную:
Назовите ее trackReadyToDepart.
Выберите Другой в выпадающем списке Тип. В появившемся справа поле выберите RailwayTrack.