Мы продолжаем публиковать обучающие посты про новую Библиотеку производственных систем. Первые два тематических поста в этой серии были посвящены базовому функционалу библиотеки: моделированию работы конвейеров и транспортёров.
Кроме прочего, библиотека позволяет имитировать обработку объектов на станциях конвейерной сети. Так можно воспроизвести реальные процессы на производстве и учесть время ручной или механической обработки объектов, время работы людей или спланировать режимы станций.
Для этих целей в AnyLogic создан элемент разметки пространства Station. Он упрощает моделирование обработки объектов, если она может быть представлена задержкой или переходом агента в новое состояние.
Мы покажем, как моделировать операции на производстве с помощью библиотеки и элемента Station, на примере модели Solar Panel Production Line. В ней показаны процессы подготовки фотоэлементов для солнечных панелей и изготовления солнечных модулей. Статистика модели позволяет оценить общую загрузку конвейерной сети и оборудования, а также длительность производственного цикла и темпы производства. Эту модель вы найдёте в списке примеров на начальной странице AnyLogic, в разделе Производство. Её также можно запустить на этой странице, прямо из AnyLogic Cloud☺
Приготовьтесь: этот пост для тех, кто хочет разобраться в тонкостях моделирования конвейерных сетей. Если вы ещё не знакомы с новой библиотекой, рекомендуем сначала прочитать предыдущие посты в этой серии. Если уже работали с ней, запускайте AnyLogic и следуйте за описанием. Поехали!
Подготовка фотоэлементов
Готовые фотоэлементы проходят процесс подготовки к сборке. Он состоит из:
- тестирования на симуляторе солнечного света (станция обработки Cell sun simulation and test);
- спайки фотоэлементов в секции (станция String soldering).
Для моделирования конвейерной линии, транспортирующей фотоэлементы между станциями (малый конвейер слева вверху), используем элемент разметки Конвейер (тип solarCellConveyor). В модели используется ленточный тип конвейера (опция Ленточный в свойстве Тип). Ширина конвейера – 0,5 метра, расстояние между фотоэлементами (зазор) – 0,04 метра, а скорость – 0,2 м/с.
На конвейере расположены две станции – Cell sun simulation and test с задержкой в 1 секунду и String soldering, время задержки на которой задано параметром solderingTime. Длина станций – 0,2 метра – складывается из длины фотоэлемента и расстояния до идущего следом элемента. Обе станции обрабатывают только по одному фотоэлементу за раз (свойство Quantity = 1) и работают в режиме одновременной загрузки и выгрузки агентов, осуществляемой с помощью конвейера (свойство Загрузка, значение Идет одновременно с выгрузкой).
В реальности на станции String soldering новый фотоэлемент припаивается к выходящему из станции блоку фотоэлементов. В модели для спаянных объектов нужно было бы создавать агента нового типа, но это невозможно, так как в рамках одной конвейерной линии может существовать агент только одного типа (в нашем случае – SolarCell).
Максимально точно отобразить этот процесс помогает ленточный тип конвейера и задержка на станции String soldering. Конвейер останавливается, пока объект обрабатывается на станции, а затем включается, чтобы станция приняла следующий объект. При таком режиме работы фотоэлементы близко расположены друг к другу при выходе со станции, будто это – спаянная группа элементов.
Когда блок из 10 фотоэлементов достигает конца конвейера, он переворачивается и помещается в буфер. Этот процесс моделируется при помощи элемента flippingStation (тип Станция обработки) в конце малого конвейера.
Диаграмма процесса подготовки фотоэлементов
После размещения объектов на малом конвейере нужно задать действия, которые они будут совершать, на диаграмме процесса (верхняя из двух диаграмм в модели). Фотоэлементы выходят из блока sourceCells (тип Source), после чего размещаются в буфере у начала конвейера с помощью блока buffer (тип Queue). Чтобы элементы могли расположиться на небольшом конвейере, их размеры переопределяются в блоке sourceCells (опция Изменить размеры, свойства Длина и Ширина – 0,16 м).
Как только на конвейере освобождается место, блок toLayup (тип Convey) затягивает в себя следующего агента, отправляя фотоэлемент через всю конвейерную линию к flippingStation, которая является пунктом назначения (у свойства Перемещать на/в – значение Станцию обработки и у свойства Конечная станция обработки – значение flippingStation).
После действий на станции flippingStation агенты снимаются с конвейера, а затем, с помощью блока assembleString (тип Batch), преобразуются в связанную группу фотоэлементов (тип агента SolarCellRow), которая движется дальше по диаграмме процесса. Секция из фотоэлементов занимает буфер (ресурс layupCellBuffer) на выходе с конвейера в блоке seizeCellBuffer (тип Seize), после чего захватывает робота (ресурс layupRobot) в блоке seizeLayupRobot (тип Seize).
После того, как робот переместился к группе фотоэлементов, буфер освобождается, и теперь туда можно поместить новую секцию фотоэлементов. В блоке toScanner (тип MoveTo) робот перемещает секцию фотоэлементов к сканеру, где проверяется качество спайки секции.
Затем в блоке glassAtStation (тип SelectOutput) условие layup.isProcessing()проверяет, началось ли размещение секций фотоэлементов на стеклянной подложке на станции Layup (на ней спаянные между собой фотоэлементы переносятся на стекло). Если процесс не был начат, секция переходит в блок waitForGlassDelivery (тип Delay) с включённой опцией До вызова функции stopDelay(), где она будет ожидать доставки стеклянной подложки. Если же стекло уже стоит на станции, секция при помощи робота в блоке toGlassPanel (тип MoveTo) передвигается в место размещения на подложке. После этого робот высвобождается в блоке releaseLayupRobot (тип Release) и возвращается в точку ожидания возле сканера в блоке toInitialPos (тип MoveTo). Код в блоке releaseLayupRobot (см. скриншот) обновляет число секций, расположенных на собираемой солнечной панели. Как только количество секций достигнет значения, заданного параметром nCellsInColumn (таким образом задаётся количество секций в фотоэлементе), процесс на станции размещения блоков фотоэлементов для панели будет прерван, и панель продолжит движение по конвейеру.
Производство солнечной панели
Процесс производства солнечной панели из уже готовых групп фотоэлементов на большом конвейере состоит из нескольких этапов. В скобках мы указали названия станций в модели, по которым движется заготовка солнечной панели.
- очистка стеклянной подложки (Glass cleaning);
- покрытие стекла этиленвинилацетатной (EVA) пленкой (Feeding EVA Front sheet);
- перенос спаянных между собой фотоэлементов на стекло (Layup);
- подсоединение контактов (Manual bussing);
- предварительное тестирование (Electroluminescence test I);
- покрытие стекла вторым слоем пленки EVA и защитным покрытием (Feeding EVA second layer and backsheet);
- ламинирование (Lamination);
- обрезка краев (Trimming);
- спайка краев (Edge Sealing);
- сборка алюминиевой рамы (Automatic framing);
- монтаж соединительной коробки (Junction box applying);
- тестирование на симуляторе солнечного света (Solar simulation);
- финальное тестирование (Electroluminescence test II);
- маркировка (Labeling).
Так как панели могут свободно передвигаться от станции к станции при наличии свободного места на конвейерной сети, в качестве его типа на этом этапе мы указали роликовый. Далее в свойствах элементов задаётся скорость конвейера и расстояние между панелями. Время обработки на каждой из станций задано соответствующим параметром. Например, на станции Glass cleaning оно определяется параметром glassCleaningTime (свойство Задержка). Наиболее простые процессы на станциях отражены задержками, однако функционал элемента разметки Station намного шире. Чтобы убедиться в этом, рассмотрим детально работу станций Layup, Bussing и Laminator.
Обработка на станции Layup
На станции Layup блоки фотоэлементов размещаются на стеклянной подложке, движущейся по главному конвейеру. Поскольку время пребывания стекла на этой станции зависит от того, были ли фотоэлементы подготовлены в срок, и от скорости работы перемещающего их робота, мы не можем заранее указать время обработки на станции. Поэтому для станции Layup в качестве значения свойства Тип задержки выбираем значение До вызова функции stopProcess(). Это задержит агента на станции, пока процесс для него не будет прерван явным образом. Прерывание процесса происходит в блоке releaseLayupRobot (тип Release), когда последняя секция фотоэлементов размещена на стекле.
Стекло, в свою очередь, может прибыть на станцию в то время, когда секция фотоэлементов уже подготовлена и ожидает в блоке waitForGlassDelivery (тип Delay). Прерывание ожидания происходит при старте процесса на станции Layup после того, как агент целиком заехал на станцию. Код agent.receive(“atLayup”), также вызываемый при этом событии, отвечает за перемещение агента – собираемой панели – по диаграмме состояний, где состояния отражают ключевые этапы сборки.
Обработка на станции Manual bussing
В нашей модели некоторые операции, например присоединение контактов, обрезка краёв или монтаж соединительной коробки, выполняются операторами вручную. Станция Manual bussing демонстрирует возможность подсоединения к станции ресурсов.
Для этого создаётся блок bussingOperator (тип ResourcePool) с количеством ресурсов равным двум. Для расположения ресурсов вокруг станции Bussing чертится прямоугольная область, а с двух сторон от конвейера помещаются аттракторы, в которых при запуске модели появятся операторы. Для того, чтобы связать станцию с блоком, в свойствах станции в секции Ресурсы выбирается опция Использовать ресурсы, и в появившихся полях указываются используемые ресурсы и их число. Эта секция во многом напоминает основные свойства блока Seize, не правда ли? Работающие посменно и с перерывами, переключающиеся между разными задачами ресурсы позволяют реалистично моделировать остановки на производстве.
Обработка на станции Lamination
В производственную линию встроены три конвейера с ламинирующим оборудованием. Поскольку ламинирование длится дольше остальных операций, распараллеливание позволяет увеличить пропускную способность конвейерной системы в целом.
В отличие от других процессов, на станции ламинирования производится обработка сразу нескольких агентов. Число ламинируемых панелей задаётся значением параметра laminatorCapacity. В нашей модели оно равно 4, поэтому станция начнёт работать тогда, когда накопит указанное число агентов. Пока в ламинаторе находится меньшее число панелей, станция находится в режиме ожидания, накапливая поступающие заготовки. Обратите внимание: заявки внутри станции могут располагаться только друг за другом, поэтому длина станции должна позволять вместить указанное число агентов. Запуск модели с разными значениями количества одновременно ламинируемых панелей позволяет увидеть, как влияет этот параметр на загруженность производственной линии.
Кроме того, время обработки на станции зависит от используемого типа плёнки и может меняться динамически в процессе работы модели согласно значению, возвращаемому функцией getLaminatorCycleTime() в свойстве Задержка.
Код, выполняемый при старте и окончании обработки на станции, отвечает за переход панели и самого ламинатора в определённые состояния согласно диаграммам состояний этих агентов.
Диаграмма процесса сборки солнечных панелей
Рассмотрим диаграмму процесса сборки солнечных панелей (нижняя диаграмма из двух диаграмм в модели). Несмотря на большое число станций обработки, она довольно проста. Это достигается с помощью блока Convey. Один блок может направлять заготовки через всю конвейерную сеть: в его свойствах можно задать начальный и конечный конвейер, а также включить или исключить конвейеры из маршрута агентов. При этом агент пройдёт через все станции на своём пути.
В нашей модели стеклянные подложки – основа солнечных панелей – создаются в блоке sourcePanels. Когда со станции очистки выходит очередная подложка (событие При выходе заднего торца на станции Glass cleaning), вызывается функция inject(), и новая подложка переходит на конвейер. Такой способ подходит для моделирования беспрерывного производственного процесса в начале конвейерной линии, когда мы уверены, что заготовки (в данном случае стеклянная подложка) всегда поставляются на линию вовремя. Поступив на конвейер, в блоке preLaminationLine панель движется от начала конвейера к точке входа в зону ламинирования (laminationPhotoEye), находящуюся на конце конвейера panelEntryConveyor. О том, как задавать логику движения объектов по конвейеру, читайте в нашем обучающем посте.
Каждая из панелей при движении к концу конвейера в блоке toEndOfLine проходит через одну из станций ламинирования. Для того, чтобы заявка свободно перемещалась в заданную точку конвейера и при этом проходила через ту или иную конвейерную линию, нужно указать название линии в свойствах блока Convey в поле Пройти через конвейеры. В нашем случае линия, через которую должна пройти панель, может меняться в зависимости от количества солнечных модулей, вошедших в зону ламинирования, и загрузки станций, поэтому линия выбирается с помощью кода chooseLaminatingStation(agent) .getConveyor(). Функция chooseLaminationStation() возвращает станцию ламинирования, через которую проедет панель, а код в целом – конвейер, на котором эта станция расположена.
Достигнув конца производственной линии, собранная панель остается лежать на конце конвейера, так как свойство Покинуть конвейер при выходе не включено. При этом панель захватывает робота, производящего разгрузку с конвейера (блок seizeUnloadRobot). Как только робот перемещается к панели, панель покидает конвейер в блоке leaveConveyor и переносится к стопке готовых панелей. Когда в стопке панелей набирается 10 единиц, они объединяются в партию (блоки batch, batch1 или batch2), которая будет отправлена с помощью погрузчика на склад в блоке moveToStorage (тип MoveByTransporter).
Теперь вы знаете, как моделировать технологические операции на конвейерах. Вот что мы рекомендуем запомнить:
- Если обработка может быть представлена задержкой или переходом агента в новое состояние, её можно смоделировать в AnyLogic с помощью элемента разметки пространства Station.
- Если станция может обработать несколько заявок одновременно, то процесс обработки начнётся только при наличии этого числа заявок на станции.
- Чтобы смоделировать зависимость конкретного процесса обработки от работы других станций или процессов, для свойства Тип задержки можно использовать значение До вызова функции stopProcess(). Это задержит агента на станции, пока процесс для него не будет прерван явным образом.
- Заявки внутри станции могут располагаться только друг за другом. Поэтому станция должна быть такой длины, чтобы она смогла вместить указанное число агентов.
- К станции можно присоединить ресурсы, например, транспортные средства или людей. Так можно точнее смоделировать рабочие процессы: переключение ресурсов между задачами и технологические перерывы.
- Один блок может направлять заготовки через всю конвейерную сеть: в его свойствах можно задать начальный и конечный конвейер, а также включить или исключить конвейеры из маршрута агентов. При этом агент пройдёт через все станции на своём пути.
- В рамках одной конвейерной линии может существовать агент только одного типа
Если у вас остались вопросы, задавайте их в комментариях – мы ответим.
Мы продолжим серию обучающих постов про работу с Библиотекой производственных процессов. О чём бы вы хотели узнать? Пишите в комментариях, а мы возьмём на заметку ☺
Если вы уже построили модель с помощью новой библиотеки, загрузите её в AnyLogiс Cloud и оставьте ссылку в комментариях. Мы оценим, выберем лучшую и пришлём её автору футболку AnyLogic ☺.