Мы продолжаем рассказывать о Библиотеке производственных систем – специализированном инструменте для моделирования работы предприятий, складов и других объектов, где перемещаются, обрабатываются и сортируются грузы.
Мы уже научили читателей блога моделировать работу конвейеров, автоматизированных погрузчиков, станций обработки и промышленных кранов. Сегодня на примере покажем, как соединять отдельные конвейеры и станции обработки на них в единые конвейерные сети с помощью элемента Сетевой порт.
Это статья для опытных пользователей AnyLogic. Если вы только начинаете работать с производственной библиотекой, рекомендуем сначала разобрать предыдущие тематические посты, а также пошаговое онлайн-руководство, и потренироваться на базовых функциях библиотеки.
Готовы к чтению? Тогда поехали!
Содержание
- Введение
- Модель Order Picking Line
- Объединение разметки пространства разных агентов с помощью элемента Сетевой порт
- Объединение одинаковых станций обработки с помощью элемента Сетевой порт
- Моделирование логики отдельной станции (агента PickingZone)
- Соединение процессов работы станций с перемещением заявки по конвейеру
- Выводы
Видели ли вы конвейерные сети со множеством повторяющихся участков? Например, в центрах обработки и выполнения заказов можно встретить линии сборки заказов – десятки станций, расположенных параллельно или последовательно и объединенных общей конвейерной сетью. Часто эти станции идентичны: имеют одинаковое количество мест хранения, одинаковые процессы, одинаковое количество операторов…
В AnyLogic 8.5 для упрощения создания таких линий появился новый элемент – Сетевой порт. С помощью него удобнее соединять друг с другом отдельные конвейерные сети со станциями, а также сети транспортеров. Он будет работать, даже если соединяющиеся элементы находятся в разных агентах, на разных уровнях в многоуровневых моделях или далеко друг от друга.
Вот как такой подход помогает ускорить моделирование:
- Чтобы создать группу одинаковых станций, теперь можно нарисовать и настроить только одну из них. AnyLogic на старте модели сам сгенерирует и соединит нужное количество идентичных станций. Перерисовывать конвейерную сеть при этом не нужно.
- Типичные модели конвейерных станций и сетей транспортеров теперь можно объединять в собственные библиотеки и, используя Сетевой порт, строить из их элементов, как из кубиков конструктора, модели непрерывных конвейерных и транспортных сетей на складе и производстве.
Эту статью будет проще понять, если вы умеете создавать пользовательские блоки в AnyLogic и реплицировать объекты. Если вы никогда не создавали пользовательские блоки, посмотрите это короткое обучающее видео (на англ.).
Модель Order Picking Line
Давайте откроем модель Order Picking Line в разделе обучающих моделей в AnyLogic. В ней укомплектовываются заказы на станциях, расположенных последовательно вдоль конвейерной линии.
Агент PickingZone содержит конвейерную сеть. Она состоит из части основного, или магистрального, конвейера, проходящего через все станции сборки заказов, и присоединенной к нему вспомогательной линии pickingConveyor, принадлежащей данной станции. Часть магистрального конвейера разбита на сегменты conveyor1, conveyor2 и takeawayConveyor трансферами, передающими коробки для заказа с основного конвейера на вспомогательный и обратно. На вспомогательном конвейере сканер, через который проезжает коробка-контейнер для заказа, отмечен точкой на конвейере scanner.
Рядом с конвейером расположен стеллаж с товарами palletRack. Этот элемент разметки обязательно должен находиться внутри сети; для этого через его проход прочерчен путь. Рабочее место оператора задано точечным узлом pickerWorkplace. Этот же узел является базовым местоположением ресурса picker (блок ResourcePool).
Объединение разметки пространства в разных агентах с помощью элемента Сетевой порт
Конечный конвейер будет состоять из нескольких одинаковых агентов. Чтобы конвейер заработал, нужно соединить части конвейера в разных агентах в одну сеть.
Сначала рассмотрим простой случай, когда требуется связать части конвейера, расположенные в двух агентах. Для этого к концу конвейера infeedingConveyor, расположенному на Main, мы добавили сетевой порт (в модели – infeedingConveyorPort). Еще один сетевой порт (в модели – inputPort) добавляется в агента PickingZone к началу конвейера conveyor1. Для связи портов и объедения конвейеров достаточно в одном из них указать ссылку на второй порт в свойстве Связан с портом. При этом, если части конвейера расположены в рамках одного агента, достаточно просто указать в этом свойстве название второго порта. Если же части конвейера расположены в разных агентах (как это сделано в нашем примере), то сначала нужно сослаться на агента, в котором находится второй порт – ссылка будет выглядеть следующим образом: <название агента>.<название порта>.
Чтобы анимация отображалась корректно, мы наложили презентацию зоны сборки (pickingZone_presentation, агент PickingZone) на конвейер на Main так, чтобы сетевые порты совпали. Теперь, хотя конвейеры и расположены в разных агентах (Main и PickingZone), коробка без проблем доедет до конечной точки.
После того, как части конвейера связаны, блок Convey может работать с объединенным конвейером как с единой сетью.
Объединение одинаковых станций обработки с помощью элемента Сетевой порт
Более сложный вариант – когда необходимо соединить больше двух агентов (в нашем примере – одинаковые станции в цепочку). На Main агент PickingZone представлен в виде популяции агентов (активное свойство Популяция агентов). В нём параметром nZones задается необходимое число станций, которые модель сгенерирует на старте (свойство Популяция, опция Содержит заданное количество агентов, значение Начальное количество агентов).
При старте модели по умолчанию все станции-агенты PickingZone будут нарисованы в одной точке. Чтобы станции встали в одну линию, нужно настроить презентацию агента (объект pickingZones_presentation). Для этого используется динамическое значение для координат X и Y и выбирается свойство Рисовать агента со сдвигом от данной точки; так мы задаем смещение отображаемых агентов во время выполнения модели относительно расположения анимации, которая видна при редактировании. Положение станций по вертикали не меняется, поэтому Y=0, по горизонтали станции примыкают друг к другу, поэтому их расположение задается формулой 180*index (180 – ширина отображения станции в пикселях, index – номер станции внутри популяции).
Теперь логически свяжем между собой части конвейеров, расположенные в разных агентах. Обратите внимание: в популяции агенты инициализируются поочередно, поэтому при создании первой станции вторая еще не существует, и связаться с ней через сетевой порт невозможно. Поэтому мы связываем входящий порт inputPort каждой последующей станции с исходящим портом outputPort предыдущей станции (второй с первой, третьей со второй и т. д.). Для первой станции в качестве парного порта inputPort указываем порт на Main – infeedingConveyorPort. Эта логика описана в функции getInfeedingPort. Код возвращает нужный порт в виде параметра, который используется в агенте pickingZone в свойствах inputPort.
Теперь все части конвейеров, расположенные в разных станциях, связаны. Меняя значение параметра, определяющего количество станций (в модели это параметр nZones, либо Начальное количество агентов в популяции pickingZones), можно уменьшать и увеличивать количество создаваемых станций. При этом перерисовывать конвейерную сеть не нужно.
Моделирование логики отдельной станции (агента PickingZone)
Коробка (агент Box) передается на станцию через блок enter и переходит в блок pickup, где ожидает заказанный товар. В последнем блоке с помощью опции Точное количество (если нет – ждать) свойства Подбирать мы заставляем коробку ждать, пока в ней не будет того количества агентов, которое указано в свойстве Количество (в нашем случае – 1).
Все доступные на станции товары (тип агента Item) создаются в блоке source с помощью команды source.inject(100). Она выполняется на старте модели в агенте PickingZone в действии При запуске. В блоке rackStore товары помещаются в стеллаж palletRack и в блоке wait ожидают команды на переход дальше по диаграмме процесса. В нашей модели процесс сборки заказа на станции – товара в коробке – выглядит так:
Когда коробка на конвейере пересекает передним краем линию сканера scanner (элемент разметки Точка на конвейере), функция wait.free( palletRack.randomAgent() ); в свойстве При входе переднего торца высвобождает случайного агента из блока wait и передает его в блок rackPick, отвечающий за снятие агента со стеллажа. В нём задается:
- Ресурс (в нашем случае – picker), с помощью которого товар будет снят со стеллажа: задается в свойстве Наборы ресурсов, которое появляется при выборе опции Перемещать с помощью ресурсов в секции Ресурсы.
- Длительность выемки товара (в нашем случае – от 2,5 до 5 сек.): задается в свойстве Время задержки.
- Место, куда товар будет перенесен (в модели это место сборки заказа – точечный узел pickerWorkplace): выбирается в свойстве Узел, которое появляется при выборе опции Узел сети в свойстве Место назначения.
Блок service моделирует операции, выполняемые оператором при помещении товара в коробку (например, считывание штрих-кода). После этого агент помещается в коробку, перейдя в блок pickup.
Как только агент попадает внутрь коробки, та покидает станцию сборки через порт outPort. Вся логика движения коробки по конвейеру вынесена на Main, за рамки агента PickingZone.
Соединение процессов работы станций с перемещением заявки по конвейеру
Чтобы станции и конвейер работали совместно, нужно соединить их в модели.
В блоке Source на Main создаются коробки (агенты типа Box), которые будут перемещаться по конвейерной сети. В момент создания случайным образом определяется станция, на которую поедет коробка, и её цвет; эти значения запоминаются в агенте Box (параметры pickingZoneNumber и boxColor).
После создания коробка переходит в блок conveyToPickingZone (тип блока Convey), отвечающий за ее перемещение по конвейерной сети. В качестве начальной точки указан конвейер на Main (свойство Начальный конвейер, значение infeedingConveyor), а в качестве пункта назначения (свойство Конечный конвейер) выбирается вспомогательный конвейер на станции, целевой для коробки – pickingZones.get( agent.pickingZoneNumber ).pickingConveyor. Как только коробка достигает пункта назначения, она переходит в блок exit, где с помощью функции pickingZones.get( agent.pickingZoneNumber ).enter.take(agent); отправляется на вход диаграммы процесса, описанного в агенте PickingZone.
Пройдя процесс на станции (подробнее сбор заказа описан выше), коробка, выйдя из исходящего порта outputPort диаграммы процесса, возвращается на уровень Main и переходит в блок conveyFromPickingLine (тип Convey). Она продолжает движение с текущего положения (свойство Перемещать с, опция Текущей позиции) до конца магистральной линии. Последний конвейер, как и остальные, создается динамически во время старта модели, поэтому конец магистральной линии задается кодом pickingZones.get( nZones - 1 ).takeawayConveyor в свойстве Конечный конвейер. Поскольку все части конвейера связаны между собой портами, блок Convey на Main может переместить заявку через всю сеть, не требуя никаких дополнительных блоков.
На этом все, спасибо, что дочитали до конца.
Выводы
Вот что мы рекомендуем запомнить из этой статьи:
- Сетевой порт может связывать конвейерные сети или сети, по которым ездят транспортеры. При этом сети могут находиться в разных агентах или на разных уровнях многоуровневых моделей.
- Если нужно связать части сети в рамках одного агента, достаточно указать в свойствах одного из портов название другого. Если же части конвейера расположены в разных агентах, то сначала нужно сослаться на агента, в котором находится второй порт; ссылка будет выглядеть следующим образом: <название агента>.<название порта>.
- При связи реплицируемых объектов нужно помнить, что когда создается первый объект, второго еще не существует. Поэтому каждый из агентов нужно связывать с предыдущим.
Подробнее изучить использование реплицируемой разметки пространства можно на примере модели Fulfillment Center Conveyor System; она есть в примерах AnyLogic и в AnyLogic Cloud. Модель создана с помощью профильной Библиотеки производственных систем AnyLogic. О её работе мы рассказываем в наших материалах:
- Видео вебинара (на англ.): Создаём цифровых двойников производства на основе автоматически настраиваемых имитационных моделей.
- Видео вебинара (на англ.): Библиотека производственных систем для начинающих
- Учебное пособие по библиотеке на русском языке.
- Другие тематические статьи в блоге.
О чём ещё вы бы хотели узнать из наших обучающих статей? Пишите в комментариях, а чтобы не пропустить новые статьи, подписывайтесь на нашу ежемесячную рассылку.