Привет пользователям AnyLogic.
Вместе с AnyLogic 8.4 мы выпустили несколько важных обновлений. Одно из них относится к Библиотеке производственных систем. Теперь в AnyLogic есть новый элемент разметки пространства – Кран. Он позволяет моделировать не только заводской кран, но и башенный кран, используемый на стройках, а также робота, выполняющего погрузочно-разгрузочные работы. Этот элемент может перемещать объекты, в том числе между несвязанными конвейерными сетями, с помощью ещё одного нового элемента – блока MoveByCrane.
Сегодня мы научим вас пользоваться новыми элементами на примере моделей MoveByCrane и Jib Cranes at Press Shop. Приготовьтесь: этот пост для тех, кто уже знаком с Библиотекой производственных систем и уверенно пользуется AnyLogic. Если вы ещё не работали с новой библиотекой, рекомендуем сначала прочитать предыдущие обучающие посты на эту тему:
- Как моделировать конвейеры
- Как моделировать обработку объектов на конвейере
- Как моделировать работу погрузчиков и роботизированных тележек
Готовы к чтению этого поста? Тогда убедитесь, что у вас установлена последняя версия AnyLogic, открывайте модели и следуйте за описанием. Поехали!
Модель MoveByCrane
В этой модели рассматривается работа цеха по обработке заготовок. Детали подъезжают на конвейере к крану, он перемещает их сначала в резервуар с жидкостью, а затем – на обрабатывающий станок. Обработанная заготовка попадает на другой конвейер, которые увозит её за пределы цеха. На примере модели мы показываем:
- функциональность блока MoveByCrane;
- работу крана с агентами, связанными с разными элементами разметки.
Чтобы начать работу с краном, с палитры Библиотека производственных систем или Разметка пространства нужно перетащить на холст элемент разметки Crane. Далее задаются физические свойства крана и его составных частей: скорость движения тележки, скорость подъёма объекта, а также скорость вращения крана. Кроме того, пользователь может выбрать, будет ли кран выполнять подъем, поворот и перемещение груза в горизонтальной плоскости последовательно или одновременно (свойство Поворот и подъем выполняются). В нашей модели значения этих свойств заданы по умолчанию. Выбрать анимацию объекта можно в свойстве Стиль секции Внешний вид: в виде промышленного крана со стрелой или башенного крана, с оголовком и без.
В модели в рабочей области крана расположен узел tankNode (тип Прямоугольный узел) и узел machineNode (тип Точечный узел) Последний является базовым расположением для ресурса machineResource (тип Resource Pool). Также к крану подходят два конвейера. Обратите внимание, что все точки, в которых могут оказаться агенты в очереди на перемещение краном, и их пункты назначения должны находиться в рабочей зоне крана.
Блок source генерирует поступающие в систему агенты – заготовки для производственного процесса. Сразу после создания они транспортируются к крану в блоке convey (тип Convey). Обратите внимание, что в блоке Convey опция Покинуть конвейер при выходе остаётся не выбранной. Как только кран начинает перемещать заготовку, она автоматически снимается с конвейера, а следующая заготовка занимает её место на конвейере.
За перемещение заготовки с конвейера в резервуар отвечает блок toTankByCrane (тип moveByCrane). Резервуар в модели является узлом, поэтому в свойстве блока Место назначения в качестве типа выбрано значение Узел, а для свойства Узел – опция tankNode. В свойстве Кран указывается элемент разметки – кран, которым будет осуществляться транспортировка агента. Для простоты мы считаем, что погрузка и выгрузка объекта с крана проходит мгновенно, поэтому свойства Время захвата и Время освобождения оставлены без изменений. Опция Использовать время операции не активна, так как мы не знаем время перемещения заготовки краном: оно рассчитываться автоматически с учётом скоростей, заданных в элементе разметки. Если же время известно, эту опцию можно активировать.
Для нашей модели важен порядок перемещения заготовок между станциями, поэтому в свойстве Правило выбора агентов выбрана опция Другое. Это позволит сортировать заказы на перемещение, поступающие к крану во время его работы. Мы ещё вернёмся к этой опции.
При перемещении заготовки кран может проносить её над различными объектами. Чтобы заготовка при этом не «цеплялась» за них, в свойстве Мин. безопасная высота задана высота, на которую должен быть поднят объект перед его транспортировкой – 3,5 м. Если оставить это значение равным нулю, кран будет перемещать заготовку на её текущем уровне.
После перемещения заготовка некоторое время выдерживается в резервуаре в блоке inLiquid (тип Delay), после чего перемещается с помощью крана на обрабатывающий станок в блоке toMachineByCrane (тип moveByCrane). Станок описывается блоком machineResource (тип resourcePool) и расположен в узле machineNode – базовом расположении ресурса. Чтобы переместить заготовку к станку, в блоке toMachineByCrane в свойстве Место назначения выбрана опция Агент. Функция machineResource.iterator().next() в свойстве блока позволяет выбрать любой ресурс из блока machineResource. Так как ресурс в этом блоке один – станок обработки Machine – он и выбирается, и заготовка перемещается к нему с помощью крана.
Далее заготовка проходит обработку на станции в блоке processing (тип Service). Но прежде, чем кран начнёт перемещать на станцию новую заготовку, он должен снять с неё предыдущую, иначе место окажется занято, а сам кран заблокирован. Для этого в модели используется простое правило – на кране и станции обработки одновременно может находиться только одна заготовка. Чтобы задать это правило, блоки toMachineByCrane и processing на диаграмме процесса заключены в область с ограниченным количеством агентов с помощью блоков raStart (тип restrictedAreaStart) и raEnd (тип restrictedAreaEnd), а в блоке raStart свойство Вместимость (макс. допустимая) определено как 1. Такие настройки позволят освободить станцию ещё до того, как кран начнёт перемещать туда новую заготовку.
Последний блок, отвечающий за работу крана toConveyorByCrane (тип MoveByCrane), перемещает заготовку со станции обработки на конвейер. Он увезёт её за пределы цеха.
Заготовку при перемещении можно положить на конвейер с заданным отступом (блок toConveyorByCrane, опция Место назначения = Конвейер, с указанием смещения в одноименном свойстве) или в конкретную точку на конвейере (опция Место назначения = Точка конвейера). Мы использовали второй вариант. Кран переместит обработанную заготовку на конвейер, после чего в блоке conveyToExit (тип Convey) заготовка перемещается за пределы цеха. Поскольку кран уже разместил заготовку на конвейере, в качестве исходной точки в свойстве Перемещать с/из мы можем указать текущую позицию.
Мы обещали рассказать про порядок перемещения заготовок между станциями. Во всех трёх блоках moveByCrane он задаётся с помощью опции Правило выбора агентов. Поскольку в нашей модели все операции перемещения выполняются одним краном и зоны обработки имеют ограниченную вместимость, необходимо четко определить, в какой последовательности кран будет выполнять одновременные запросы. В нашем примере кран сначала снимает заготовку со станции обработки, после чего перемещает на станцию следующую, а затем переносит ожидающего агента с конвейера в резервуар. Чтобы учесть такую логику, в блоках MoveByCrane заданы приоритеты: от самого высокого в блоке toConveyorByCrane (Правило выбора = 3) к самому низкому в блоке toTankByCrane (Правило выбора = 1).
Модель Jib Cranes at Press Shop
Если вы читали наши предыдущие обучающие посты по библиотеке, то знаете, что транспортер умеет забирать агентов непосредственно с конвейеров. Но что делать, если в процессе разгрузки участвует кран? Давайте разберёмся на примере упрощённой модели цеха штамповки. В ней металлические листы проходят по конвейеру через две станции обработки и штампуются в боковые панели кузова автомобиля. В конце конвейера кран снимает их по одной и переносит на тележки-транспортеры, которые перевозят панели в другой цех.
В модели первый кран – loadingCrane – размещён в начале конвейера, а второй – unloadingCrane – в конце.
Сперва опишем процессы взаимодействия кранов с конвейером. Агенты – металлические листы обработки – создаются в блоке metalSheetSource (тип Source) и складываются в буфер (тип блока Queue) возле конвейера. После этого они по одному перемещаются на конвейер с помощью крана в блоке loadByCrane (тип MoveByCrane). Для этого в блоке определён кран, с помощью которого выполняется погрузка (свойство Кран, значение loadingCrane), и в свойстве Место назначения используем опцию Точка конвейера. В качестве точки на конвейере выберем loadingPoint.
После перемещения заготовка начинает движение по конвейеру в блоке convey (тип Convey) и проходит через две станции обработки – press и cutMachine. Когда обработка закончена, на станциях в событии При окончании процесса вызывается функция agent.receive("processed"), которая переводит агента в следующее состояние согласно его диаграмме состояний. В нашем случае к каждому состоянию привязана определенная анимация агента. Это позволяет на выходе с двух станций получить анимацию заготовки боковой панели кузова автомобиля.
Как только заготовка достигает конца конвейера, она попадает в блок unloadByCrane (тип moveByCrane). Логика передвижения заготовок панелей автомобиля готова, а о том, как панели перемещаются на тележку с помощью крана, расскажем чуть позже.
Опишем логику движения мобильных роботов AGV. Они перевозят готовые панели в тележке в сварочный цех. Таким образом, тележка является агентом, которого транспортирует AGV. Группа AGV описывается блоком agvs (тип TransporterFleet). В нашей модели работают два мобильных робота, поэтому свойство Количество транспортеров = 2. На старте модели они находятся в точечных узлах dropoffTrolleyLocation и pickUpTrolleyLocation.
В модели в наличии всегда есть свободные тележки. Они вызываются с помощью функции sourceTrolley.inject(1) в блоке Pickup, когда предыдущая тележка прибывает в точку погрузки панелей. Первая тележка создается на старте модели. Тележка генерируется блоком sourceTrolley (тип Source) и размещается в узле pickupTrolleyLocation (тип Точечный узел). В блоке toLoadPoint (тип MoveByTransporter) тележка захватывает свободный AGV, после чего робот везёт её к конвейеру. Чтобы AGV доехал до конца конвейера, в свойстве Смещение от блока toLoadPoint выбрана опция Конца конвейера. Свойство Освобождать транспортер не выбрано: это позволяет мобильному роботу оставаться с тележкой и дожидаться окончания процесса погрузки и следующей команды на транспортировку.
Следующий блок toAssemble (тип MoveByTransporter) на диаграмме процесса отвечает за транспортировку тележки с панелями в сварочный цех при помощи того же мобильного робота. Так как AGV уже связана с тележкой, галочка со свойства Захватывать транспортер снята. В качестве пункта назначения задан узел dropoffTrolleyLocation (тип Точечный узел). Доставив тележку к указанной точке, AGV автоматически освободится и приступит к перевозке следующей тележки.
Если вы строите модель с нуля, самое время соединить диаграммы транспортировки тележки и панелей. Это делается с помощью уже знакомого блока pickup (тип Pickup) между блоками toLoadPoint и toAssemble: он отвечает за размещение панелей в контейнере-тележке. Количество погружаемых панелей определяется с помощью параметра numberOfBodyPartsToDeliver в свойстве Количество этого блока. Обратите внимание: в поле Подбирать выбрана опция Точное количество (если нет – ждать). Это позволит удерживать тележку на месте (в блоке pickup), пока на нее не будет погружено указанное число панелей.
Поскольку в модели используется несколько AGV, нужно знать, на какую из них происходит выгрузка панелей в данный момент. Поэтому в действии При входе блока pickup прибывшая тележка «запоминается» в переменной loadedTrolley (код loadedTrolley = container).
В блоке unloadByCrane в качестве точки, куда кран должен перенести агента, указывается нужный AGV: в свойстве Место назначения – опция Агент, и в появившемся поле Агент – переменная AGV, loadedTrolley. Обратите внимание, что кран будет пытаться переместить агента к точке назначения, как только заберет его с конвейера. Чтобы кран не начинал погрузку до того, как тележка для груза не приехала, перед блоком unloadByCrane (тип MoveByCrane) помещается блок waitForAGV (тип Hold). Он пропустит столько панелей, сколько должно быть погружено на одну тележку, а потом остановит поток агентов. За это отвечает опция Блокировать после заданного кол-ва агентов свойства Режим с указанием числа пропуcкаемых агентов в свойстве Кол-во агентов для данного блока. Как только новая тележка будет готова к погрузке в блоке pickup, поток агентов, поступающих на кран, будет разблокирован вызовом функции waitForAGV.unblock(); в действии При входе блока pickup.
Теперь вы знаете, как моделировать работу кранов в AnyLogic, и интегрировать их в процессы на производстве. Вот что необходимо запомнить:
- Все точки, в которых могут оказаться агенты в очереди на перемещение краном, и пункты назначения агентов должны находиться в рабочей зоне крана.
- Если нужно погрузить агента на транспортер с помощью крана, убедитесь, что транспортер находится в рабочей области крана.
- При настройке блока MoveByCrane не забудьте указать минимальную безопасную высоту, на которую кран может поднимать груз. Если оставить это значение равным нулю, кран будет перемещать заготовку на её текущем уровне, и может пройти сквозь предметы на пути.
- Если для крана нужно задать последовательность перемещения агентов, используйте свойство Правило выбора в блоке MoveByCrane.
О чём ещё вы бы хотели узнать из наших обучающих статей? Пишите в комментариях, а чтобы не пропустить новые статьи, подписывайтесь на нашу ежемесячную рассылку.