С выходом AnyLogic 8.3 пользователям стала доступна Библиотека производственных систем. Чтобы научить вас работать с ней, мы запустили серию тематических статей в блоге. В них рассказываем об основных функциях библиотеки и её составляющих – блоках и элементах разметки пространства – на примерах из реального производства.
Мы уже писали про моделирование производственных конвейеров. Но продукцию часто транспортируют не только конвейеры, но и погрузчики, а также роботизированные и механические тележки.
В AnyLogic за моделирование этих действий также отвечает Библиотека производственных систем: блоки TransporterFleet, MoveByTransporter, SeizeTransporter и ReleaseTransporter, а также элементы разметки пространства. Сегодня мы покажем, как использовать этот функционал, на примерах моделей. Их можно найти через главный экран AnyLogic в разделе «Обучающие модели».
Чтобы вам были доступны обновлённые версии моделей, рекомендуем пользоваться последней версией AnyLogic – 8.3.3. Ну что, поехали!
Модель MoveByTransporter
В модели MoveByTransporter роботизированные тележки-транспортеры – AGV (от англ. automated guided vehicles) – развозят прибывающие с трёх конвейеров коробки на принимающие конвейеры. При этом цвет коробки соответствует цвету контейнера, на который она попадёт.
Движение тележек по территории предприятия может быть организовано по дорожкам – сети специальных магнитных лент. Такая маршрутная сеть моделируется в AnyLogic с помощью элементов разметки пространства. Для этого используется элемент разметки Путь на палитре Библиотека производственных систем в разделе Разметка пространства , с помощью которого рисуется сеть нужного размера на холсте Main. Обратите внимание: если присоединить одну дорожку к другой в любой точке, кроме конечных, образуется элемент Точечный узел. В AnyLogic 8.3 он эволюционировал в настоящий перекрёсток. AnyLogic автоматически рисует траектории поворотов, необходимые для связей всех путей. Если радиус элемента увеличить, пути в рамках перекрёстка изменятся. От радиуса элемента также зависит размер площади, которую занимает перекрёсток.
Кроме визуализации траекторий перекрёсток выполняет другую важную задачу – регулирует разъезд транспортеров, не позволяя им наезжать друг на друга. Если вас пугают такие новшества, перекрёсток может быть сжат в привычный точечный узел ☺.

Обратите внимание, что все пути, используемые транспортерами, должны оканчиваться одним из элементов: Точечный узел, Прямоугольный узел или Многоугольный узел. Только в них транспортер способен развернуться и поехать в обратную сторону. В нашем случае два прямоугольных узла служат базовым местоположением AGV. Элементы разметки Аттрактор указывают положение и направление каждого транспортера, поэтому их число во всех зонах размещения транспортеров должно равняться или быть больше общего числа AGV.
После того, как все пути построены, создаём новый тип агента, моделирующий поведение AGV. Для этого мы используем элемент Тип транспортера, создающий агента, и настраиваем его с помощью встроенного помощника. В данном случае настроена только анимация AGV (объект Автоматическая самоходная тележка в разделе Склады и контейнерные терминалы).
Для создания одного транспортера или группы транспортеров, одинаковых по своим параметрам (габаритам и скорости), используется блок TransporterFleet. В качестве типа агента, выполняющего роль транспортера, выбирается агент Transporter (в свойствах блока в списке Новый транспортер – элемент Transporter). В данной группе будет использоваться 12 транспортеров: соответствующее значение записано в свойстве Количество транспортеров. Их базовым местоположением будут два Прямоугольных узла, включённых в разметку пространства. В качестве базового местоположения для транспортера можно также использовать обычный элемент Точечный узел.
Размеры и параметры скорости задаются в настройках блока:
- Длина транспортера учитывается AnyLogic при расчёте расстояния до препятствия или другого транспортера на его пути.
- Высота определяет положение перевозимого груза: по умолчанию груз в 3D располагается в центре координат агента-транспортера и поднят на указанную высоту. Если груз должен быть смещён от центра, можно воспользоваться пользовательской функцией setCargoPosition, позволяющей точно указать его расположение относительно транспортера. Кстати, габариты транспортера также можно задать в свойствах типа агента, моделирующего AGV (Transporter) в секции Размеры и движение.
Далее мы создали тип агента Item, создающий коробки и перемещающий их в модели с помощью AGV и конвейеров – операции, которые описаны на диаграмме процесса (см. ниже). Цвет коробки задаётся с помощью API-функции, а габариты – цифрами.
Для определения начальных и конечных конвейеров в агенте Item созданы 2 переменные – sourceConveyor и targetConveyor. При выходе из блока Source им задаётся значение начального и конечного конвейера c помощью пользовательских функций getSourceConveyor и getTargetConveyor: будто бы на каждую коробку клеют штрихкод с указанием начального и конечного конвейера.
Наконец, создаётся оставшаяся часть диаграммы процесса, отвечающая за перемещение агентов по системе конвейеров и маршрутов AGV.
Блок Source (с выбранным в качестве Новый агент типом агента Item) генерирует перемещаемые заявки. Блоки convey и convey1 отвечают за перемещение заявок по конвейерам. При этом агент в них перемещается по конвейеру, заданному в переменной. О настройке блока Convey мы подробно рассказали в посте про моделирование конвейеров.
Остановимся подробнее на новом блоке moveByTransporter. В случае, если погрузка и выгрузка груза с AGV может быть смоделирована простой задержкой, все задачи транспортера могут быть выполнены этим блоком. В секции Захват транспортера в поле Автопарк указана группа транспортеров transporterFleet (тип TransporterFleet), перевозящих агентов, которые проходят через блок moveByTransporter. Время погрузки – задержка, равная 5 секундам. В качестве места, откуда транспортер может забрать агента могут быть заданы:
- агент, вызвавший транспортер;
- узел – точка разметки пространства;
- аттрактор;
- любой путь с указанным смещением от его начала или конца;
- конвейер с указанным смещением от его начала или конца;
- точка на конвейере;
- станция обработки;
- координаты точки на холсте.
Когда место погрузки находится вне путей перемещения транспортеров, AnyLogic автоматически определяет ближайшую к нему точку на путях и отправляет транспортер туда. В нашей модели выбрана опция Агент в свойстве Место.
Определив, где AGV должна будет забрать вызвавшего её агента, задаём точку назначения. Этот процесс похож на то, как выбиралось место погрузки. Выберем в качестве пункта назначения начало конвейера, принимающего данный тип грузов. Для этого в свойстве Место назначения выберем значение Конвейер, а в поле Конвейер кодом зададим динамическое значение agent.targetConveyor, позволяющее отправлять каждый груз на конвейер того же цвета. По умолчанию транспортер сможет сам определить кратчайший маршрут в сети и будет стараться не допустить столкновения с другими транспортерами.
В случае если избежать пересечения путей не удалось, спустя 10 секунд транспортеры проезжают сквозь друг друга. Такая задержка служит для имитации сложного разъезда AGV, которым обычно удалённо управляет оператор или автоматическая система. Более детальная настройка маршрутизации AGV появится в следующих версиях программы.
Опишем процесс разгрузки агента с транспортера в секции Освобождение транспортера. В свойстве Время разгрузки укажем время разгрузки – 15 секунд. Освободившийся транспортер способен:
- возвращаться в базовое местоположение каждый раз;
- возвращаться в базовое местоположение при отсутствии других задач;
- оставаться в точке разгрузки.
В нашем случае AGV приступает к погрузке и перемещению агента, как только достигает точки погрузки. Соответственно, высвобождение AGV происходит моментально после того, как агент достиг пункта назначения и был выгружен.
Когда AGV забирают грузы на конвейерах, они подъезжают на максимально близкое расстояние в рамках доступных для них путей. Транспортеры также определяют и максимально близкие точки к принимающим конвейерам несмотря на то, что на пути, проходящем мимо конвейеров, нет выделенных точек.
Модель SeizeTransporter and ReleaseTransporter
В моделях, где задачи погрузки и разгрузки максимально просты, а транспортер только доставляет груз до конечной точки, не делая промежуточных остановок (например, на станциях), вся логика может быть описана блоком MoveByTransporter. Когда процессы погрузки и выгрузки также играют значимую роль, блоки SeizeTransporter и ReleaseTransporter может быть удобнее использовать отдельно.
Рассмотрим модель SeizeTransporter and ReleaseTransporter. В данной модели в качестве транспортера используются специализированные AGV, перевозящие тяжёлые грузы – рулоны мелованной бумаги. Погрузку и выгрузку рулонов осуществляют краны (их логика описана c помощью Библиотеки моделирования систем).
В модели с помощью элементов разметки Путь, Точечный узел и Прямоугольный узел изображена сеть, по которой движутся транспортеры, и их базовое местоположение. С помощью типа агента Тип транспортера создаётся новый тип агента – AGV. Также добавляется блок agvFleet (тип TransporterFleet) и задаются свойства группы транспортеров, перевозящих рулоны. Группа включает три AGV (свойство Количество транспортеров – 3, свойство Новый транспортер – AGV). Габариты AGV настраиваются отметкой свойства Изменить размеры и заполнением поля Длина – 2.5 метра.
Блок Source генерирует заявки (рулоны) и размещает их в области под краном (точечный узел node1). Кран начинает движение за рулоном в тот момент, когда принимающая груз AGV прибывает в точку погрузки. При этом во время движения крана, транспортер должен ожидать на месте. Для моделирования такого поведения в модели использован блок seizeAGV (тип SeizeTransporter). Рассмотрим подробнее его свойства и работу.
В свойстве Автопарк указывается группа AGV, из которых будет выбираться транспортер для перевозки поступающих в блок агентов – agvFleet. В качестве пункта назначения для AGV, подъезжающей к рулону, установлена опция Агент. Это позволяет отправлять транспортер к точке, расположенной на минимальном расстоянии от захватившего его агента, но в то же время на путях следования AGV.
Секция Приоритеты используется для задания очерёдности задач на перевозку грузов, поступающих к группе AGV.
- Параметр Приоритет задачи хранит числовое значение, отражающее значимость заявки.
- Параметр Может вытеснять другие задачи отражает возможность AGV, движущейся к агенту, быть перехваченной другим, более приоритетным агентом.
- Параметр Правило вытеснения задач определяет, что делать с теми задачами, которые были вытеснены более приоритетными – ждать ресурс, который был захвачен в самом начале или отправиться в путь на другом свободном транспортере.
В следующей секции, Специфические, можно выбрать транспортер, на котором должен быть перемещён агент. Параметр Задать выбор транспорта позволяет задать собственную политику выбора AGV в динамическом поле Условие выбора транспортера. Подходящих под заданное пользователем условие транспортеров может быть много (в частности, если условие выбора не задано, мы по-прежнему располагаем полным парком AGV). Поэтому свойство Политика выбора транспортера позволяет указать, какой именно транспортер будет выбран из группы:
- ближайший подходящий под условие;
- на основе попарного сравнения, заданного функцией в динамическом поле;
- с наибольшим значением свойства, заданного функцией в динамическом поле;
- случайный, первый подходящий под условие (опция Не применяется).
В нашей модели все эти свойства заданы по умолчанию.
Обратите внимание на то, что агент находится в блоке seizeAGV до того момента, пока транспортер не подъедет к точке погрузки. Только после этого агент продолжает движение по диаграмме процесса, а захваченный транспортер продолжает ожидать его в указанной точке.
Затем агент-рулон бумаги попадает в блоки:
- seizeLoadCrane (тип Seize), где агент захватывает отвечающий за погрузку кран;
- craneLoading (тип Delay), ответственный за подъем краном
- toAGV (тип MoveTo), перемещающий агента к AGV;
- agvLoading (тип Delay), ответственный за погрузку на ожидающий AGV.
Теперь размещённый на транспортере рулон может быть направлен в другую часть цеха, где он будет снят с AGV другим краном и размещён на конвейере. Для перемещения используется уже знакомый блок moveByAGV (тип MoveByTransporter). В свойствах блока не выбрано свойство Захватывать транспортер, так как используемый AGV уже прибыл к месту погрузки и принял груз. В свойстве Место назначения из списка выбран Конвейер и конвейерная линия, к которой доставляется груз.
Если свойство Освобождать транспортер оставить выбранным, то AGV после небольшой задержки скинет груз, как только доедет до ближайшей к конвейеру позиции. Однако в случае разгрузки с использованием крана это не то поведение, которого мы ожидаем. Поэтому галочка со свойства Освобождать транспортер должна быть снята. По достижению точки назначения AGV остаётся стоять на пути, связанный с перевозимой заявкой.
Перейдя в следующий блок seizeUnloadCrane (тип Seize), агент захватывает кран, отвечающий за погрузку на конвейер, и снимается с AGV в блоке agvUnloading (тип Delay). После этого агент высвобождает AGV в блоке releaseAGV (тип ReleaseTransporter). В блоке задана настройка, возвращающая AGV в базовое местоположение при отсутствии других задач. Иначе при отсутствии новых задач текущий AGV будет препятствовать разгрузке остальных AGV, занимая общее место.
После высвобождения агент переходит в блок toConveyor (тип MoveTo), в котором движется с помощью крана к точке у начала конвейерное линии. Затем агент опускается на конвейер в блоке craneUnloading (тип Delay) и затем высвобождает кран в блоке releaseUnloadCrane (тип Release). Наконец, рулон покидает транспортную систему, проходя в блоке Convey через её последнее звено – конвейер.
Теперь вы знаете, как моделировать перемещение грузов на предприятии с помощью Библиотеки производственных систем. Вот что мы рекомендуем запомнить:
- Если погрузка/выгрузка может быть смоделирована простой задержкой, а транспортер не делает промежуточных остановок по пути к цели, выбирайте блок MoveByTransporter. Когда процессы погрузки и выгрузки играют важную роль, лучше использовать отдельно блоки SeizeTransporter и ReleaseTransporter.
- Если транспортеры пересекаются и не могут разъехаться, они проедут сквозь друг друга через 10 секунд. Такая задержка служит для имитации сложного разъезда AGV, которым обычно удалённо управляет оператор или автоматическая система.
- Заранее решите, что должен делать транспортер, когда освободится. Его действиями можно управлять с помощью настроек блока MoveByTransporter.
- С помощью элемента Точечный узел теперь можно визуально представить перекрёсток со всеми входящими в него дорогами. Для этого нужно увеличить радиус перекрёстка.
В следующих выпусках нашего блога мы перейдём к более сложным моделям и более хитрым подходам к использованию рассмотренных блоков. Не забудьте прочитать пост про моделирование конвейеров: этот материал поможет проще ориентироваться в наших следующих постах.
Если вы уже построили модель с помощью новой библиотеки, загрузите её в AnyLogiс Cloud и оставьте ссылку в комментариях. Мы оценим, выберем лучшую и пришлём её автору футболку AnyLogic ☺.