Как работает Библиотека моделирования потоков: пример шоколадной фабрики

Привет всем пользователям AnyLogic!

В предыдущей статье на тему Библиотеки моделирования потоков мы рассказали, в каких случаях она используется, и познакомили вас с её основными возможностями.

В этом посте мы покажем работу библиотеки на примере модели шоколадной фабрики. Эта модель доступна на RunTheModel.com и в самой программе AnyLogic на начальной странице на вкладке «Примеры моделей» под названием Chocolate Production.

Итак, поехали.

Из чего состоит модель?

Основные объекты диаграммы процессов модели шоколадной фабрики – это три типа резервуаров: Regular tank (стандартный резервуар), Mix tank (резервуар для смешивания) и Process Tank (резервуар для обработки). Резервуары соединены трубопроводами (Pipeline) и конвейерами (Conveyor), которые перевозят материалы между ними. Объект Source создает партии материалов, а объект Fluid to Agent в конце производства выпускает нового агента диаграммы – шоколадную плитку, продукт производства.


Общий вид модели шоколадной фабрики

Как работает модель?

В начале модели три блока Source создают партии материалов с заданной скоростью. Блоки Sugar(партии сахара) и milkPowder (партии сухого молока) выпускают партии при вызове функции. Партии могут быть заданы в объёме или массе. В нашем случае функции в блоках sugarTank и milkTank создают партии по 10 кг. Новая партия создается каждый раз, когда резервуар заполнен ниже заданного Уровня. Сахар и сухое молоко накапливаются в обычных резервуарах, а затем транспортируются по конвейерам в резервуар для смешивания mixWithSugarAndMilk.


Свойства блоков Source и Tank

Конвейеры и трубопроводы похожи, но есть отличия. Конвейеры просто перемещают партии при заданной скорости. Если принимающие блоки не могут принять партию, конвейер останавливается и не накапливает партии. Конвейер может быть остановлен вручную при помощи функции stop(). Трубопроводы устроены иначе. Чтобы партии перемещались по трубопроводу, исходящий поток из предыдущего блока должен иметь ненулевую скорость, чтобы «проталкивать» находящиеся впереди партии по трубопроводу. Когда объём материала внутри трубопровода достигает его параметра Вместимость, партии начинают покидать его и двигаться дальше по диаграмме процесса.


Свойства блока Pipeline

Конвейеры, по которым проходят партии тёртого какао (chocolateLiquor), разделены блоком Split. Этот блок действует как элемент, задающий движение партий в том или другом направлении по конвейеру, разделяя их в определенной пропорции. В примере выбран режим Приоритет, то есть партия направляется в резервуар mixWithSugarAndMilk, либо, если этот резервуар полон, перемещается в бак press. Блок Split может ограничивать пропускную способность, замедляя движение потока. В примере он не накладывает ограничений, и партии движутся со скоростью конвейера. Вообще, в «жидкой» библиотеке поток движется со скоростью самого медленного участка и только пока есть свободное место в резервуарах и трубопроводах. Эта особенность похожа на pull-протокол в Библиотеке моделирования процессов: там поток агентов движется, пока стоящий впереди блок не заполнен и может «вытягивать» агентов из предыдущего блока.


Свойства блока Split

Посмотрим на следующий блок – резервуар для обработки press. Он аккумулирует партии, наполняясь до ограничения Вместимости (его выходной клапан закрыт). Затем резервуар закрывает входной клапан и обрабатывает материалы. После обработки резервуар открывает выходной клапан, выпускает партию, закрывает выпускной клапан и открывает входной клапан. Цикл повторяется.


Свойства блока Press

Далее партия переходит к блоку Select output (в примере – useOrDivert). Он похож на блок Split и ведёт весь поток в том или другом направлении в зависимости от выбора или входящей партии. В модели, если блок cocoaButterStorageTank не может принять партию, он дает команду блоку useOrDivert, который направляет его по другой трубе. То есть поток переходит в резервуар для хранения, если бак наполнен меньше, чем на 60 кг, либо удаляется с производственной линии (вызов соответствующих функций useOrDivert.select(1) и useOrDivert.select(2)).


Свойства блоков useOrDivert и cocoaButterStorageTank

Далее рассмотрим блоки Mix Tank (резервуар для смешивания – mixWithSugarAndMilk) и Fluid Convert (в примере – rolling). Mix tank похож на расширенный Process tank: он может соединить до пяти компонентов (по абсолютному или относительному значению), обработать их и выпустить новую партию. Блок Convert позволяет изменять тип и объем партии. В нашей модели он просто меняет тип партии в процессе прокатки rolling, которая выполняется со скоростью 0,4 кг в секунду (скорость трубопровода и конвейера). Объем партии сохраняется.


Свойства блока Fluid Convert

После создания шоколадной пасты происходит конширование. Поток направляется в один из трех резервуаров – conching1, conching2и conching3– в соответствии с настройками блоков Select Output (в примере - selectConching1 и selectConching2). Выходной поток направляется блоками Select Input (selectConchingOut1 и selectConchingOut2). Блоки работают одинаково, выбор потока осуществляется вручную. Переключение выполняется функциями При наполнении и При опустошении. Сначала входящие партии накапливает первый резервуар. Когда он заполнен, поток направляется во второй резервуар, затем в третий, и обратно к первому. Функция При опустошении работает так же: сначала используется первый резервуар, затем второй, третий и опять первый (вызов функции selectConching.select (...)). Кстати, такая логика предполагает написание еще 10 строчек java-кода, но эту процедуру можно выполнить и без него. Догадайтесь, чем можно заменить блоки selectConching;)


Схема конширования в модели

Свойства блоков selectConching1 и conching1

После конширования шоколадная паста хранится в буфере для дальнейшего смешивания с наполнителями – изюмом или миндалем – в блоке Merge. Этот блок (в примере - mixWithFilling) – противоположность блока Split: он создает партию из двух входных потоков. В модели он смешивает партии в определенной пропорции (шоколадная паста и наполнители). Вид наполнителя меняется каждый час с помощью циклического события. Так же как блок Split, Merge поддерживает работу по приоритету: второй поток используется, только если скорость приоритетного потока равна нулю.


Свойства блока Merge

Блок Fluid to Agent накапливает партии и создает нового агента. Как уже говорилось в предыдущем посте, блок работает в двух режимах: создание агента на каждую новую партию или при накоплении определенного количества материала (в примере – шоколадной пасты). В нашей модели он работает во втором режиме, создавая большие и вкусные шоколадные плитки весом 0,5 кг. Их цвет определяется наполнителями.


Свойства блока Fluid to Agent

После этого шоколадные плитки проходят через финальные стадии производства (блоки процессной библиотеки), упаковываются и подаются к столу :)

Напомню, что посмотреть готовую модель можно в разделе «Примеры моделей» в программе AnyLogic или на сайте RunTheModel.com.

В следующем посте мы подробно разберем еще одно эффективное применение Библиотеки моделирования потоков – построение схемы работы автозаправочной станции. Вы научитесь создавать интуитивно понятные и простые диаграммы процессов и узнаете о специфике разделения потоков в Библиотеке.


Это был наш первый пост с пошаговым объяснением работы модели. Ваши отзывы о формате помогут нам делать посты интереснее.

Чтобы не пропустить новые посты, читайте наш блог!