Области с ограничениями. Учимся пользоваться Библиотекой производственных систем (Часть 6)

Как моделировать производство

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

В этой статье разбираем эту демо-модель и рассказываем, как работают ограничения для областей (другие обучающие материалы по библиотеке >>). Чтобы следовать за рассказом, вам понадобится последняя версия AnyLogic (бесплатная или коммерческая).

Установили? Если готовы, поехали!


На складах и предприятиях, где работают роботы-транспортеры, погрузчики и другое транспортное оборудование, пространство часто делят на зоны, в которых действуют ограничения по количеству техники или скорости ее движения. Зонирование позволяет проще управлять оборудованием и снизить вероятность аварий на производстве.

В AnyLogic 8.6 в производственных моделях можно создавать такие зоны. Например, перекресток в цехе, на который нельзя будет въехать, если он будет занят: роботы-транспортеры или погрузчики просто будут ждать снятия ограничений или поедут в объезд.

Чтобы настроить области с ограничениями, на Main нужно добавить элемент разметки Прямоугольный узел или Многоугольный узел и в группе свойств Ограничение скорости и доступа задать ограничение по этим параметрам или дополнительным ограничениям (их мы рассмотрим ниже):

  • по количеству транспортеров (вместимости);
  • по вызову функции close();
  • по условию;
  • по расписанию;
  • по пропускной способности.

Обратите внимание: ограничения будут распространяться только на тип транспортеров, указанный в свойстве Применить ограничения для, агенты-транспортеры других типов будут игнорировать заданные ограничения. Чтобы ограничения применялись к транспортерам любых типов, в свойстве нужно указать общий, родительский класс Агент. Для комбинации различных ограничений в одной точке пространства можно совместить несколько перекрывающихся областей с ограничениями.

Далее на примере демо-модели Areas with Limited Access for Transporters я познакомлю вас с самыми распространенными режимами работы областей с ограничениями, их особенностями и возможным практическим применением. В рассказе я буду переходить от одной части модели к другой, поэтому, чтобы вы не запутались, я добавила в текст анимированные скриншоты этих частей. Если все же возникнут вопросы, пишите в комментариях!




Область с ограничением на количество транспортеров


В верхней части модели расположен сложный перекресток.


Перекрёсток в модели

Перекрёсток в модели

В отличие от стандартного перекрестка, образующегося при соединении путей и представляющего собой один точечный узел, этот перекресток состоит из множества пересекающихся путей и точечных узлов с нулевым радиусом. Поэтому стандартное управление въездом на него с помощью блока TransporterControl и свойства Может войти в узел затруднено.

Для решения проблемы разъезда через перекресток поверх него начерчен многоугольный узел complexIntersection с выбранной опцией Ограничение доступа. Чтобы через перекресток одновременно мог двигаться только один транспортер, в качестве ограничения выбрана вместимость (свойство Доступ ограничен по, опция вместимости), а в появившемся свойстве Вместимость указано допустимое количество транспортеров – 1. Так при подъезде к области транспортер будет проверять наличие внутри нее другого транспортера. В том случае, если область занята, транспортер остановится на границе и будет ожидать, пока она освободится.

Эту же настройку можно задать при моделировании рабочих зон с ограниченным количеством транспортеров. Однако в этом случае нужно обратить внимание, что при выборе данной опции транспортер все равно всегда будет строить путь через область, если она лежит на кратчайшем пути. И даже если начальная и конечная точки пути лежат за пределами области, то транспортер вынужден будет ожидать у края области, пока для него освободится место (то есть пока количество транспортеров внутри области не станет меньше установленного ограничения).

Чтобы изменить допустимую вместимость области во время работы модели, используется функция node.restrictByCapacity(), где node – имя нужного узла (здесь и в других функциях). В нашем примере функция вызывается каждый раз при работе со слайдером, расположенным над областью.


Область с ограничением доступа по вызову функции close()


Чтобы полностью запретить доступ в область для транспортеров, пользователь может выбрать ограничение по вызову функции close(). Эта опция позволяет:

  • временно блокировать участки пути, например, моделировать работу дверей;
  • временно перекрывать целые области пространства, например, если там работает оборудование.

В нашей модели такие области используются для имитации ворот на въезде в соседний цех (прямоугольные узлы doorNode1 и doorNode2) и для моделирования рабочей области крана (прямоугольный узел craneOperationArea). Чтобы сделать область снова доступной для транспортеров, нужно вызвать функцию node.open().

В первом случае кнопка Close gate закрывает их; таким образом участок транспортной сети, находящий в закрытой области, становится недоступным. В этом случае для области выбрана опция Избегать закрытых областей, поэтому, как только область закрывается, транспортеры, чей путь лежал через нее, ищут путь в объезд. Обратите внимание: если транспортер движется по заданному пути и уже въехал на сегмент пути, пересекаемый областью, он не может развернуться, а остается ожидать на границе области. В других случаях (например, когда граница области пересекает перекресток) транспортер способен развернуться и поехать в объезд области. После того как область была разблокирована повторным нажатием на кнопку, транспортеры вновь пересчитывают свой путь и могут проехать по ставшему доступным пути.


Как моделировать работу дверей или ворот на производстве

Как моделировать работу дверей или ворот на производстве

В случае моделирования рабочей области крана участок пространства, над которым кран проносит тяжелый груз, ограничен областью с ограничением craneOperationArea. В момент, когда кран получает груз (действие При захвате элемента зоны bridgeCrane), вызов функции craneOperationArea.close() закрывает область для проезда. Аналогично вызов функции craneOperationArea.open(), вызываемый при отгрузке с крана (действие При освобождении) открывает движение для транспортеров. В данном случае опция Избегать закрытых областей остается отключенной, поэтому транспортеры, подъезжающие к закрытой области, остановятся на ее границе и будут ожидать, пока область не разблокируется.


Как моделировать закрытую область на производстве

Как моделировать закрытую область на производстве

Область с ограничением доступа по условию


Для более гибкой настройки доступа в область используется ограничение по условию. В появляющемся поле Условие указывается любое выражение, возвращающее значение true или false. Например, таким выражением может быть состояние транспортера: груженый или пустой. Если выражение возвращает значение true, транспортер не будет допущен в область. В этом случае опция Избегать закрытых областей еще в начале движения транспортера определяет, будет ли транспортер ехать в объезд во время построения маршрута или нет. Если она выбрана, то транспортер построит путь в объезд закрытой для него области. Если нет – транспортер спланирует маршрут через область и остановится на ее границе.

Объясним, как работают такие ограничения, на нашем примере.

В начале рассмотрим простой кейс, когда указанное условие связано со свойством самого транспортера и не меняется во время его движения. В нашей модели действуют два вида транспортеров: обычные (AGV) и роботы для тяжелых грузов (HeavyLoadAGV). Для AGV въезд в зону погрузки agvTypeArea ограничен. Для этого в свойстве Применить ограничения для указан этот тип транспортеров, а в поле Условие указано значение true. Включенная опция Избегать закрытых областей вынуждает AGV строить свой маршрут так, чтобы не пересекать данную область. При этом транспортеры другого типа – HeavyLoadAGV – могут беспрепятственно проезжать через эту область, поскольку ограничения на них не действуют.


Как моделировать область загрузки на производстве

Как моделировать область загрузки на производстве

Аналогичным образом можно ограничивать движение транспортеров, относящихся к конкретной группе транспортных средств (TransporterFleet). Например, если обходимо ограничить въезд в область для груженых транспортеров, достаточно накрыть ее зоной с ограничением и в поле Condition проверить текущий статус транспортера функцией agent.getState() == TransporterState.DELIVERING.

В сложных случаях, когда ограничение на въезд может изменяться с течением времени, условие проверяется при построении маршрута, а также при достижении границы области. Представим, что агент не пытается объехать область и останавливается у ее границы, а затем условие, из-за которого он остановился, меняется. Чтобы транспортер возобновил движение, необходимо вызывать функцию node.recalculateAccessibility(). При ее срабатывании транспортеры, стоящие на границе области, перепроверяют возможность въезда в нее и при получении положительного ответа въезжают в зону.

Включенная опция Избегать закрытых областей также учитывается только в момент расчета маршрута. Поэтому если транспортер построил маршрут через открытую область, а в момент его движения область закрылась, транспортер продолжит исходный маршрут и остановится у границы области. Однако если пользователю нужно, чтобы при закрытии области движущиеся транспортеры пересчитали маршрут, он может воспользоваться функцией транспортера transporter.recalculateRoute(), либо функцией области node.recalculateAccessibility(), которая вызовет пересчет маршрутов у всех транспортеров, построивших свой путь через нее.

В нашей модели есть три области, для которых ограничения на въезд могут меняться со временем – loadArea1, loadArea2, loadArea3. Они ограничивают движение транспортеров у зон погрузки и на прилегающих к ним перекрестках.


Как моделировать зону загрузки на производстве

Как моделировать зону загрузки на производстве

Для того, чтобы избежать возможных аварий, в нашей модели у зон погрузки приняты следующие правила:

  • В зону погрузки не допускаются транспортеры, если внутри нее уже стоит транспортер или он движется к точке погрузки внутри зоны.
  • Транспортер может проехать к своей зоне погрузки через другую область, если на границе другой области нет остановившегося транспортера.
  • Если рядом на границе области остановился транспортер, ожидающий разрешения на въезд, то остальные транспортеры пытаются проехать в объезд.

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

  • есть ли на границе ожидающие транспортеры;
  • совпадает ли точка погрузки подъехавшего транспортера с точкой погрузки транспортера внутри зоны.

Если один из факторов выполняется, то функция вернет значение true и в доступе в зону будет отказано.

На старте модели область свободна, поэтому все транспортеры строят свой кратчайший маршрут через нее. Предположим, что первый транспортер едет к точке погрузки loadPoint3, который находится внутри узла loadArea3. Поскольку область перед ним свободна, он въезжает внутрь. Однако если следующий транспортер также едет к точке погрузки loadPoint3, то условие въезда, заданное функцией accessDenied(), остановит его на границе области. В этот же момент для остальных транспортеров меняются факторы, влияющие на условие проезда через область. Поэтому в действии При запрете на вход, срабатывающем при отказе на въезд транспортеру, достигшему границы, вызывается функция recalculateAccessibility(), и оставшиеся транспортеры пересчитывают свой путь, чтобы по возможности объехать ставшую недоступной область.

Для остановившегося на границе транспортера выполняется действие При запрете на вход. Если транспортер получает отказ, оно не производится повторно. Когда транспортер, загружавшийся внутри области, выезжает из нее, автоматически срабатывает действие При выходе. Так как оно влияет на возможность области впускать внутрь себя другие транспортеры, в нем снова вызывается функция recalcualteAccessibility().

В режиме работы модели пользователь может отключить опцию Избегать закрытых областей у всех областей с ограничениями, используя элемент управления на холсте, над зонами погрузки. Другие транспортеры начнут собираться в очередь у первого узла, не пытаясь объехать стоящий на границе транспортер.


Есть еще два режима работы области с ограничениями, о которых мы не рассказали; они не используются в демо-модели. Это ограничения по расписанию и по пропускной способности.


Область с ограничением доступа по расписанию


Время работы области можно задать с помощью расписания. Для этого в модели нужно создать соответствующий объект (находится в элементах Библиотеки моделирования процессов) и выбрать его в появляющемся свойстве Расписание. Для корректной работы расписание должно иметь тип да/нет (закрытие и открытие зоны соответственно). В остальном поведение такой зоны и движущихся через нее транспортеров аналогично тому, как если бы при переходе расписания в режим да вызвалась бы функция node.close(), а при переходе в состояние нет – функция node.open().


Область с ограничением доступа по пропускной способности


Этот режим ограничивает количество транспортеров или других объектов, которое может проехать через область за единицу времени. Максимальное количество можно задать в числовом поле, которое появляется при выборе этого режима.


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



На этом все, спасибо, что дочитали до конца! Вот что я рекомендую запомнить:

  • С помощью ограничений можно запретить доступ в область или задать в ней ограничение скорости.
  • Доступ в зону можно ограничивать по количеству транспортеров, по вызову функции call() по условию, расписанию и пропускной способности.
  • Когда область закрывается и открывается с помощью функций и open(), включенная опция Избегать закрытых областей заставит транспортеры изменить маршрут перед ней.
  • Если пользователю нужно, чтобы движущийся через область транспортер пересчитал маршрут при изменении доступности этой области, он может воспользоваться функцией recalculate() для транспортера.
  • Вызов функции recalculateAccessibility() для области с ограничением по условию заставляет транспортеры, чьи пути проходят через эту область, проверять возможность проезда.

В демо-модели из статьи мы не использовали для областей ограничения по расписанию и пропускной способности. Попробуйте построить модели производства с этими ограничениями и в комментариях оставьте ссылки на них в AnyLogic Cloud. Мы выберем самую интересную модель и поделимся ей с читателями нашей ежемесячной рассылки!

Похожие материалы