AnyLogic
Развернуть
Размер шрифта

Склад

Storage in 2DСклад в графическом редакторе Storage in 3DСклад на 3D-анимации во время выполнения модели

Склад — это элемент разметки пространства, с помощью которого вы можете графически задать пространство склада, где агенты (материальные объекты) размещаются на стеллажах.

Один элемент Склад может содержать несколько стеллажей. На данный момент мы поддерживаем два способа размещения стеллажей на складе:

  • По отдельности — все стеллажи развернуты в одну сторону и с каждого проезда есть доступ только к одному стеллажу.

    Размещение стеллажей по отдельности

  • Спина к спине — стеллажи расположены попарно спиной друг к другу. Таким образом с каждого проезда есть доступ к двум стеллажам.

    Размещение стеллажей спина к спине

Свойство Размещение стеллажей не поддерживается складами типа FIFO.

Каждый стеллаж состоит из ячеек. В одной ячейке хранится один агент (материальный объект). Ячейки внутри стеллажа образуют группы, которые определяют особенности заполнения стеллажа. Давайте рассмотрим разновидности группировки:

На примерах ниже изображен один стеллаж, который состоит из 2 секций и 5 полок. Глубина стеллажа — 5 ячеек.
Стеллаж с заполненным слотом Слот — один горизонтальный ряд ячеек, задающий глубину стеллажа. По умолчанию глубина слота в каждом стеллаже Склада — 1 ячейка.
Стеллаж с заполненной секцией Секция — один вертикальный ряд ячеек. Ширина стеллажа зависит от количества секций. По умолчанию каждый стеллаж Склада состоит из 5 секций.
Стеллаж с заполненной полкой Полка — несколько слотов, располагающихся друг за другом на одной высоте. Общая высота стеллажа зависит от количества полок. По умолчанию каждый стеллаж Склада содержит 1 полку.

В настоящий момент элемент Склад поддерживает следующие типы стеллажей:

  • Селективный — такой стеллаж наполняется секция за секцией. В каждой секции первым заполняется нижний слот, начиная с ячейки, находящейся на наибольшей глубине. Затем заполняется следующий слот по вертикали и так далее, пока секция не заполнится снизу доверху. Для этого типа стеллажей поддерживается метод LIFO: последний размещенный объект будет первым извлеченным.
  • Набивной — у такого стеллажа первыми наполняются самые глубокие ячейки на нижней полке в каждой секции, затем следующие по степени глубины, и так далее. Наполнение идет снизу вверх. Для этого типа стеллажей поддерживается метод LIFO: последний размещенный объект будет первым извлеченным.
  • FIFO — первый агент, размещенный в слоте, будет первым извлеченным из слота. Агент размещается с определенной «загрузочной» стороны, после чего перемещается в сторону «разгрузочной» стороны. Это обеспечивается за счет конструкции стеллажа (например, наличия роликов) либо попросту гравитации: для этого полки стеллажа размещаются под определенным углом.
    С помощью этого типа склада можно моделировать гравитационные стеллажи для коробок или поддонов.
  • LIFO — последний агент, размещенный в слоте, будет первым извлеченным из слота.
    Конструкция склада такого типа подразумевает, что размещать и извлекать материальные объекты можно только с одной стороны стеллажа. После помещения агента на стеллаж, уже хранящиеся на нем агенты подвигаются в направлении стенки. Это обеспечивается за счет конструкции стеллажа (например, наличия механизма пуш-бэк) либо попросту гравитации: для этого полки стеллажа размещаются под определенным углом.
    С помощью этого типа склада можно моделировать гравитационные стеллажи для коробок или поддонов.
Демо-модель: Slotting Policies in Drive-in Storage Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

Склад может являться препятствием на пути пешеходов и транспортеров, перемещающихся в режиме произвольной навигации.

Создание склада

Есть два подхода к созданию склада: вы можете задать размеры составных элементов склада (стеллажей и секций) или задать количество стеллажей и секций.

Чтобы нарисовать склад на основании размеров

  1. Перетащите элемент Склад с палитры Разметка пространства в графический редактор.
  2. Задайте размеры составных элементов склада:
    • Задайте значение опций Кол-во стеллажей и Кол-во секций: вычисляется на основании размеров склада.
    • Задайте значения для свойств Глубина стеллажа, Ширина проезда и Ширина секции.
    • Задайте Кол-во ячеек в слоте.
    • Задайте значения для свойств Количество полок и Высота полки.
  3. Завершив настройку размеров отдельных элементов, задайте размеры самого склада, перетащив метку-манипулятор, находящуюся в нижнем правом углу элемента Склад в графическом редакторе. Количество стеллажей и секций будет увеличиваться/уменьшаться автоматически в соответствии с указанными размерами.

    Рисование склада на основании размеров

  4. В секции свойств Внешний вид вы можете изменить то, как выглядит ваш склад. Кроме того, вы можете настроить анимацию агентов (материальных объектов) внутри склада на запущенной модели, изменив значение свойства Анимация заполненных ячеек. При выборе значения подсветка (быстрый способ), ячейки, в которых размещены материальные объекты, будут просто подсвечиваться при запуске модели. Используйте этот вариант, если моделируете масштабные склады и нуждаетесь в хорошей производительности модели. Если производительность не является для вас ключевым фактором, выберите значение анимация агента: тогда выбранные фигуры анимации материальных объектов будут демонстрироваться внутри склада.
  5. Задайте ширину Области доступа в секции свойств Местоположение и размер. Область доступа — это пространство перед первым стеллажом склада. Любые относящиеся к сетям пути, проходящие через область доступа, могут использоваться транспортерами и ресурсами для движения к стеллажу.
  6. Завершив рисование склада, щелкните по кнопке Создать складскую сеть, чтобы при необходимости нарисовать пути внутри проездов склада.
    Не рекомендуется создавать складскую сеть до окончания рисования, так как сеть не будет автоматически подстраиваться под дальнейшие изменения в планировке и размерности склада. В случае модификации планировки, вам потребуется удалить имеющуюся сеть и создать новую с нуля.

Чтобы нарисовать склад на основании заданного количества стеллажей и секций

  1. Перетащите элемент Склад с палитры Разметка пространства в графический редактор.
  2. Задайте необходимые значения в полях Кол-во стеллажей и Кол-во секций.
  3. Задайте Кол-во ячеек в слоте.
  4. Задайте значения для свойств Количество полок и Высота полки.
  5. Задайте размеры самого склада, перетащив метку-манипулятор, находящуюся в нижнем правом углу элемента Склад в графическом редакторе. Размеры секций и проездов будут изменяться автоматически в соответствии с размером склада.

    Рисование склада на основании заданного вручную количества элементов

  6. Измените ширину проезда, если считаете нужным.
  7. Измените глубину стеллажа, если считаете нужным.
  8. В секции свойств Внешний вид вы можете изменить то, как выглядит ваш склад. Кроме того, вы можете настроить анимацию агентов (материальных объектов) внутри склада на запущенной модели, изменив значение свойства Анимация заполненных ячеек. При выборе значения подсветка (быстрый способ), ячейки, в которых размещены материальные объекты, будут просто подсвечиваться при запуске модели. Используйте этот вариант, если моделируете масштабные склады и нуждаетесь в хорошей производительности модели. Если производительность не является для вас ключевым фактором, выберите значение анимация агента: тогда выбранные фигуры анимации материальных объектов будут демонстрироваться внутри склада.
  9. Задайте ширину Области доступа в секции свойств Местоположение и размер. Область доступа — это пространство перед первым стеллажом склада. Любые относящиеся к сетям пути, проходящие через область доступа, могут использоваться транспортерами и ресурсами для движения к стеллажу.
  10. Завершив рисование склада, щелкните по кнопке Создать складскую сеть, чтобы при необходимости нарисовать пути внутри проездов склада.
    Не рекомендуется создавать складскую сеть до окончания рисования, так как сеть не будет автоматически подстраиваться под дальнейшие изменения в планировке и размерности склада. В случае модификации планировки, вам потребуется удалить имеющуюся сеть и создать новую с нуля.

Ячейка

Координаты каждой ячейки Склада — это набор индексов. Каждый из индексов соответствует одному из элементов склада: стеллажу, секции, полке, позиции самой ячейки. Для примера рассмотрим функцию getCell().

Предположим, у нас имеется Склад с именем storage, состоящий из 4 стеллажей. У каждого из этих стеллажей — по 5 секций и полок, а слоты состоят из 10 ячеек. Нам нужна ячейка, находящаяся на наибольшей глубине 3-й секции 4-го стеллажа. Поскольку подсчет индексов начинается с 0, нужно вызвать функцию storage.getCell(3, 2, 4, 9), в которой:

  • 3 — это индекс 4-го стеллажа
  • 2 — это индекс 3-й секции
  • 4 — индекс самой высокой (5-й из 5) полки
  • 9 — индекс самой глубокой (10-й из 10) ячейки

Блокирование ячеек

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

В программируемом интерфейсе (API) такие ячейки имеют состояние DISABLED. Ячейки в таком состоянии недоступны для функций, запрашивающих свободные ячейки: например, getFreeCells().

Через созданные таким образом пустоты, тем не менее, можно перемещать агентов (материальные объекты).

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

Перемещение агентов в контексте склада

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

На складах типа FIFO у каждого стеллажа имеется два проезда: один находится с «загрузочной» стороны, перед первым стеллажом склада. С него агенты (материальные объекты) помещаются на стеллаж. Другой помещается после последнего стеллажа склада, на «разгрузочной» стороне, которую транспортеры и ресурсы используют для извлечения агентов (материальных объектов).

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

Если вы создаете модель высокого уровня абстракции и не хотите описывать детально смоделированные процессы размещения и извлечения, то агенты (материальные объекты) могут прибывать на склад и перемещаться по нему самостоятельно.

Особенности порядка извлечения

  • В стеллажах типа FIFO первый агент, помещенный в слот, будет первым извлеченным из слота. Извлекать агентов с таких стеллажей можно только с назначенной «разгрузочной» стороны.
  • В стеллажах типа LIFO последний агент, помещенный в слот, будет первым извлеченным из слота. «Разгрузочная» сторона у этих стеллажей — та же, что и «загрузочная».
  • Со стеллажей можно извлекать только тех агентов, что находятся в ближайшей к проезду ячейке (в случае со стеллажами FIFO — с «разгрузочной» стороны). При попытке извлечь агента из другой ячейки появляется ошибка.
  • В определенный момент времени с рабочей («разгрузочной» или «загрузочной») стороной секции стеллажа может взаимодействовать только один агент. Таким образом, у каждой такой стороны есть своя собственная очередь. Все агенты, взаимодействующие с секцией для операций размещения-извлечения через блоки диаграммы процесса, помещаются внутрь таких очередей.
  • У операции извлечения больший приоритет, чем у операции размещения.
  • У агентов, находящихся ближе всего к «разгрузочной» стороне, самый высокий приоритет извлечения.
  • При расчете порядка извлечения агенты, находящиеся в заблокированных ячейках, не учитываются.
  • Извлечение агента может быть задержано, если другой агент, находящийся на стеллаже, блокирует его перемещение, но ресурс (например, транспортер) уже движется, чтобы извлечь блокирующего агента и убрать препятствие.
    Если такое происходит, появится сообщение с предупреждением.
    В таком случае формируется очередь извлечения согласно порядку, в котором агенты стали готовы к извлечению. Для агентов, нуждающихся в ресурсе (транспортере) для извлечения, при определении позиции в очереди учитывается значение модельного времени, в которое за ними подъезжают ресурсы (транспортеры). Если же ресурсы агенту не требуется, то учитывается время, которое агент провел в блоке Retrieve.

Редактирование склада в графическом редакторе

Поскольку склад имеет сложное представление в графическом редакторе, вот несколько сценариев, которые помогут вам модифицировать склад во время разработки модели.

Чтобы изменить ширину проездов

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

    Изменение ширины проездов в графическом редакторе

Чтобы изменить глубину стеллажей

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

    Изменение глубины стеллажей в графическом редакторе

Чтобы изменить площадь области доступа

  1. Передвиньте ромбическую метку-манипулятор на границе области доступа, чтобы изменить площадь этой области.

    Изменение площади области доступа в графическом редакторе

Свойства

Основные

Имя — Имя склада. Имя используется для идентификации и доступа к складу из кода и библиотечных блоков.

Исключить — Если опция выбрана, то склад будет исключен из модели.

Отображается на верхнем агенте — Если опция выбрана, то склад будет виден на презентации типа агента, в который будет вложен данный агент.

Блокировать — Если опция выбрана, то фигура будет считаться заблокированной и не будет реагировать на щелчки мыши. Таким образом, вы не сможете выбрать заблокированную фигуру в графическом редакторе до тех пор, пока вы не снимете с нее блокировку. Обычно это требуется, когда у вас есть какой-то фоновый рисунок, используемый как подложка для анимации, и вы хотите исключить возможность случайного редактирования этого фонового рисунка при рисовании фигур поверх него.

Видимость — Здесь указывается, будет ли фигура отображаться на анимации во время исполнения модели. Выберите да или нет, используя элемент управления. Если вам нужно, чтобы видимость динамически изменялась или зависела от каких-либо условий, вы можете указать здесь выражение, задающее видимость фигуры. Это выражение будет динамически вычисляться во время исполнения модели. Оно должно возвращать логическое (булево) значение. Фигура отображается в том случае, когда указанное выражение возвращает истинное значение, в противном случае фигура не видна.

Является препятствием — Если опция выбрана, этот склад будет служить препятствием для пешеходов и транспортеров, перемещающихся в режиме произвольной навигации.

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

  • Селективный — такой стеллаж наполняется секция за секцией, с нижней полки и выше. Стартовой позицией считается ячейка, находящаяся на наибольшей глубине. Для этого типа стеллажей поддерживается метод LIFO: последний размещенный объект будет первым извлеченным. Захваченный ресурс или транспортер ожидает в проезде, пока не будет закончена процедура размещения объекта.
  • Набивной — у такого стеллажа первыми наполняются самые глубокие ячейки в каждой секции, затем следующие по степени глубины, и так далее, с нижней полки и выше. Для этого типа стеллажей поддерживается метод LIFO: последний размещенный объект будет первым извлеченным. Захваченный ресурс или транспортер подъезжает к ячейке, чтобы разместить объект.
  • FIFO — первый агент, помещенный в слот, будет первым извлеченным из слота. У такого склада есть два проезда: один с «загрузочной» стороны, с которой на стеллаж помещается агент (материальный объект), другой — с «разгрузочной», с которой агент (материальный объект) извлекается.
    Направление перемещения агентов по стеллажу показывается в графическом редакторе с помощью стрелок.
  • LIFO — последний агент, помещенный в слот, будет первым извлеченным из слота.
    На складах такого типа помещать и извлекать агентов (материальные объекты) можно только с одной стороны. После помещения нового агента те, что уже хранятся на стеллаже, подвигаются в сторону стенки.

Размещение стеллажей — Здесь вы можете выбрать, как именно будут расположены стеллажи на складе:

По отдельности — все стеллажи развернуты в одном направлении
Спина к спине — стеллажи расположены попарно спиной друг к другу
Размещение стеллажей невозможно настроить для складов со стеллажами типа FIFO. Такие склады всегда используют размещение типа По отдельности.

Загрузка в обратном направлении — [Параметр виден, если Тип стеллажа: FIFO; для других типов стеллажей — если Размещение стеллажей: По отдельности] Определяет направление загрузки стеллажей внутри склада. При включении параметра размещение стеллажей изменяется визуально в графическом редакторе; также изменяется направление загрузки.
Эта опция влияет на логическую нумерацию стеллажей — горизонтальных элементов, составляющих склад. На нумерацию секций (вертикальных элементов) она не влияет.
У складов со стеллажами типа FIFO выбранное направление загрузки показывается стрелками в графическом редакторе.

AnyLogic: Storage: Загрузка в обратном направленииСелективный стеллаж с размещением типа «по отдельности»: обычный и обратный порядок загрузки

Глубина стеллажа — Здесь вы можете задать глубину отдельного стеллажа.

Кол-во стеллажей — Здесь вы можете указать, как задается количество стеллажей на вашем складе. Доступные опции:

задано явно — вы указываете Кол-во стеллажей в соответствующем поле свойств склада.
вычисляется на основании размеров склада — вы указываете размеры стеллажей, проездов и самого склада; после этого AnyLogic автоматически рассчитывает количество стеллажей внутри склада.

Ширина проезда — [Параметр виден, если Кол-во стеллажей: вычисляется на основании размеров склада] Здесь вы можете задать ширину отдельного проезда.

Кол-во стеллажей — [Параметр виден, если Кол-во стеллажей: Задано явно] Здесь вы можете задать, сколько всего стеллажей есть на складе.

Кол-во секций — Здесь вы можете указать, как задается количество секций на вашем складе. Доступные опции:

вычисляется на основании размеров склада — вы указываете размеры секций и склада; после этого AnyLogic автоматически рассчитывает количество секций в каждом стеллаже.
задано явно — вы указываете Кол-во секций в соответствующем поле свойств склада.

Ширина секции — [Параметр виден, если Кол-во секций: задано явно] Здесь вы можете задать ширину отдельной секции. Это значение используется при вычислении количества секций на стеллаж.

Кол-во секций — [Параметр виден, если Кол-во секций: вычисляется на основании размеров склада] Здесь вы можете задать, сколько секций есть у каждого стеллажа.

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

Стеллаж

Количество полок — Количество расположенных вертикально полок на каждом стеллаже.

Кол-во ячеек в слоте — Количество ячеек в глубину в каждом слоте.

Высота полки — Высота каждой полки.

Задать скорость внутри слота — Выберите эту опцию, чтобы задать скорость движения агента внутри слота. Если опция не выбрана, агент перемещается с собственной скоростью или со скоростью захваченного им ресурса (в случае складов со стеллажами Набивного типа).

Скорость внутри слота — [Параметр виден, если выбрана опция Задать скорость внутри слота] Скорость движения агента внутри слота.

Действия
Для складов со стеллажами типа FIFO или LIFO:
Если вам необходимо отслеживать перемещение агента внутри стеллажа, используйте действие При извлечении агента, т.к. все агенты на полке перемещаются при извлечении оконечного агента. У складов со стеллажами типа LIFO размещение нового агента на полке (действие При размещении агента) также заставляет двигаться остальных агентов на этой полке.
Если вам необходимо отслеживать, когда агент уже помещен на полку, но еще не достиг назначенной ему позиции, используйте действия блока Store (например, При освобождении транспортера или При начале размещения).

При размещении агента — Код, который выполняется, когда агент (материальный объект) размещается в ячейке.
В стеллажах типа FIFO или LIFO это действие срабатывает после размещения агента в отдельной ячейке. Если агент перемещается по стеллажу в результате действий с другим агентом (размещение или извлечение), действие не срабатывает.
Локальные переменные:
T agent — агент (материальный объект)
StorageCell cell — ячейка склада

При извлечении агента — Код, который выполняется, когда агент (материальный объект) извлекается из ячейки блоком Retrieve или в результате вызова функции склада retrieve().
Локальные переменные:
T agent — агент (материальный объект)
StorageCell cell — ячейка склада

Внешний вид

Цвет полок — [Параметр виден, если Тип стеллажа: Селективный] цвет полок.

Угол наклона полок, ° — [Параметр виден, если Тип стеллажа: FIFO или LIFO] Угол, под которым стеллажи размещены на складе относительно проезда (в случае складов со стеллажами типа FIFO — «разгрузочной» стороны). Принимает значения от 0 до 90.

Цвет рамы — цвет рамы.

Анимация заполненных ячеек — Здесь вы можете указать, как агенты должны отображаться на складе во время запуска модели.

подсветка (быстрый способ) — анимация агентов не отображается. Ячейка заполняется цветом агента или комбинацией цветов расположенных вертикально агентов. Таким образом многоуровневые стеллажи отображаются более информативно, и анимация складов крупного масштаба функционирует более производительно. Вы можете задать цвет агента с помощью функции agent.setColor().
анимация агента — фигура анимации агента помещается в центр ячейки.

Рисовать стойки в 3D — [Параметр виден, если выбрана опция Отображать в: 2D и 3D или только в 3D] Отключите эту опцию, если не хотите, чтобы вертикальные элементы рамы отрисовывались в 3D-анимации. В этом случае на анимации видны только полки.

Кол-во секций между стойками — [Параметр виден, если выбрана опция Отображать в: 2D и 3D или только в 3D] Количество секций между вертикальными элементами рамы при их отрисовке в 3D-анимации. Не влияет на отображение 2D-анимации стеллажа.

Местоположение и размер

Уровень — уровень, на котором располагается склад.

X — X-координата склада (его верхнего левого угла).

Y — Y-координата склада (его верхнего левого угла).

Z — Z-координата склада. Располагается относительно Z-координаты уровня, на котором располагается склад.

Вращение — Угол вращения склада по часовой стрелки в проекции XY.

Длина склада — [Параметр виден, если Кол-во стеллажей: Задано явно] Длина стеллажа склада.

Ширина склада — [Параметр виден, если Кол-во секций: Задано явно] Ширина стеллажа склада.

Область доступа — Ширина прилежащей к стеллажам зоны, к которой могут вести пути сетей, доступные для перемещения агентов или транспортеров, использующих пути для навигации.

Специфические

Отображать в — Если выбрано В 2D и в 3D или Только в 3D, то будет создан трехмерный аналог двумерного склада. Тогда в режиме запуска модели двумерный склад будет отображаться там же, где он и была нарисована в графическом редакторе, а трехмерный будет виден в специальном элементе, предназначенном для просмотра трехмерной анимации — 3D окне.

Отображать имя — Если опция выбрана, то имя фигуры будет отображаться в графическом редакторе.

Функции

Вы можете динамически изменять свойства стеллажа во время «прогона» модели, используя приведенные ниже функции API.

Основные
Функция Описание
Storage() Конструктор, который создает новый склад с параметрами по умолчанию. Вы можете задать значения параметрам с помощью кода перед инициализацией элементов разметки пространства.
Любые операции с ячейками следует выполнять после инициализации элементов разметки пространства.
RackUnitAggregator getStorageSystem() Возвращает систему складов, к которой принадлежит этот склад.
void setRackType(RackType type) Задает тип стеллажей.

type — тип стеллажей. Допустимые значения RACK_TYPE_DRIVE_IN(набивной), RACK_TYPE_SELECTIVE(селективный), RACK_TYPE_FIFO_FLOW (FIFO), RACK_TYPE_LIFO_FLOW (LIFO).
RackPlacement getRackPlacement() Возвращает способ размещения стеллажей на данном складе. Допустимые значения:
RACK_PLACEMENT_BACK_TO_BACK — спина к спине
RACK_PLACEMENT_STAND_ALONE — по отдельности
void setRackPlacement(RackPlacement rackPlacement) Задает способ размещения стеллажей на данном складе.
Размещение стеллажей не поддерживается складами типа FIFO.
rackPlacement — конфигурация стеллажей. Допустимые значения: RACK_PLACEMENT_STAND_ALONE(по отдельности) или RACK_PLACEMENT_BACK_TO_BACK (спина к спине).
boolean isLoadingDirectionReversed() Возвращает направление загрузки, назначенное этому складу. Возвращает true, если используется режим загрузки в обратном направлении; в противном случае возвращает false.
void setReverseLoadingDirection(boolean reversed) Задает направление загрузки для этого склада.

reversed — задайте true, чтобы использовать режим загрузки в обратном направлении, или false — чтобы использовать стандартный режим.
Конфигурация склада
Функция Описание
int getNumberOfRacks() Возвращает количество стеллажей на этом складе.
void setNumberOfRacks(int numberOfRacks) Задает количество стеллажей на этом складе. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

numberOfRacks — новое количество стеллажей
int getNumberOfBays() Возвращает количество секций на один стеллаж.
void setNumberOfBays(int numberOfBays) Задает количество секций на один стеллаж. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

numberOfBays — новое количество секций
int getNumberOfCellsPerSlot() Возвращает количество ячеек на один слот.
void setNumberOfCellsPerSlot(int numberOfCells) Задает количество ячеек на один слот. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

numberOfCells — новое количество ячеек
int getNumberOfShelves() Возвращает количество полок на один стеллаж.
void setNumberOfShelves(int numberOfShelves) Задает количество полок на один стеллаж. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

numberOfShelves — новое количество полок
double getRackDepth(LengthUnits units) Возвращает глубину стеллажа в заданных единицах измерения длины.

units — константа, задающая единицы измерения длины
void setRackDepth(double rackDepth, LengthUnits units) Задает глубину стеллажа в заданных единицах измерения длины. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

rackDepth — новая глубина стеллажа
units — константа, задающая единицы измерения длины
double getShelfHeight(LengthUnits units) Возвращает высоту полки в заданных единицах измерения длины.

units — константа, задающая единицы измерения длины
void setShelfHeight(double shelfHeight, LengthUnits units) Задает высоту полки в заданных единицах измерения длины. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

shelfHeight — новая высота полки
units — константа, задающая единицы измерения длины
double getCellWidth(LengthUnits units) Возвращает ширину ячейки в заданных единицах измерения длины.

units — константа, задающая единицы измерения длины
void setCellWidth(double cellWidth, LengthUnits units) Задает ширину ячейки в заданных единицах измерения длины. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

cellWidth — новая ширина ячейки
units — константа, задающая единицы измерения длины
double getAisleWidth(LengthUnits units) Возвращает ширину проезда в заданных единицах измерения длины.

units — константа, задающая единицы измерения длины
void setAisleWidth(double aisleWidth, LengthUnits units) Задает ширину проезда в заданных единицах измерения длины. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

aisleWidth — новая ширина проезда
units — константа, задающая единицы измерения длины
double getAccessZone(LengthUnits units) Возвращает ширину области доступа в заданных единицах измерения длины.

units — константа, задающая единицы измерения длины
void setAccessZone(double zoneWidth, LengthUnits units) Задает ширину области доступа в заданных единицах измерения длины. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

zoneWidth — новая ширина области доступа
units — константа, задающая единицы измерения длины
Ячейки

Все перечисленные ниже функции можно вызвать только после инициализации элементов разметки пространства.

Все функции, возвращающие свободные ячейки, не учитывают заблокированные ячейки.
Функция Описание
StorageCell getCell(Agent agent) Возвращает ячейку, содержащую указанного агента.

agent — агент (материальный объект)
StorageCell getCell(int rack, int bay, int shelf, int deepPosition) Возвращает указанную ячейку.

rack — индекс стеллажа bay — индекс секции shelf — индекс полки deepPosition — индекс ячейки
List<StorageCell> getCells() Возвращает список ячеек, отсортированный в соответствии с типом хранения.
StorageCell getRandomFreeCell() Возвращает доступную для резервирования ячейку в случайном слоте склада.
Не работает со стеллажами типов FIFO и LIFO.
List<StorageCell> freeCells(int rack) Возвращает список всех доступных ячеек в указанном стеллаже, исключая заблокированные.

rack — индекс стеллажа
List<StorageCell> freeCells(int rack, int bay) Возвращает список всех доступных ячеек в указанной секции, исключая заблокированные.

rack — индекс стеллажа bay — индекс секции
List<StorageCell> freeCells(int rack, int bay, int shelf) Возвращает список всех доступных ячеек на указанной полке, исключая заблокированные.

rack — индекс стеллажа
bay — индекс секции shelf — индекс полки
int nFreeCells() Возвращает общее количество свободных ячеек на складе, исключая заблокированные.
int nFreeCells(int rack) Возвращает общее количество свободных ячеек в указанном стеллаже, исключая заблокированные.

rack — индекс стеллажа
int nFreeCells(int rack, int bay) Возвращает общее количество свободных ячеек в указанной секции, исключая заблокированные.

rack — индекс стеллажа
bay — индекс секции
int nFreeCells(int rack, int bay, int shelf) Возвращает общее количество свободных ячеек на указанной полке, исключая заблокированные.

rack — индекс стеллажа
bay — индекс секции shelf — индекс полки
Слот

Все перечисленные ниже функции можно вызвать только после инициализации элементов разметки пространства.

Функция Описание
StorageSlot getSlot(int rack, int bay, int shelf) Возвращает указанный слот.

rack — индекс стеллажа
bay — индекс секции
shelf — индекс полки
Для работы со слотом можно использовать специальные функции, возвращающие его местоположение на складе.
Скорость внутри слота

Все перечисленные ниже функции можно вызвать только после инициализации элементов разметки пространства.

Функция Описание
boolean isSpecifiedInslotSpeed() Возвращает true, если для перемещения внутри слотов была задана определенная скорость. В противном случае возвращает false.
void setSpecifiedInslotSpeed(boolean enabled) Задает определенную скорость перемещения внутри слотов, если в параметре функции передано true. Если передано false, заданная скорость не используется.

enabled — если true, скорость перемещения внутри слотов будет отличаться от стандартной; если false, то используется стандартная скорость.
double getInslotSpeed(SpeedUnits units) Возвращает скорость перемещения внутри слотов в заданных единицах измерения скорости.

units — a константа, задающая единицы измерения скорости
void setInslotSpeed(double speed, SpeedUnits units) Задает скорость перемещения внутри слотов в заданных единицах измерения скорости.

speed — новая скорость перемещения внутри слотов
units — a константа, задающая единицы измерения скорости
Агенты

Все перечисленные ниже функции можно вызвать только после инициализации элементов разметки пространства.

Функция Описание
int size() Возвращает число агентов, помещенных на склад.
У складов типов FIFO и LIFO эта функция не учитывает агентов, перемещающихся к ячейкам назначения.
List<Agent> getAgents() Возвращает список агентов, помещенных на склад, отсортированный в соответствии с типом хранения.
У складов типов FIFO и LIFO эта функция не учитывает агентов, перемещающихся к ячейкам назначения.
Agent getRandomAgent() Возвращает случайного агента из числа помещенных на склад. Если склад пуст, возвращает null.
boolean contains(Agent agent) Возвращает true, если переданный параметром агент был помещен на склад. В противном случае возвращает false.
У складов типов FIFO и LIFO эта функция не учитывает агентов, перемещающихся к ячейкам назначения.
Agent getAgentInCell(int rack, int bay, int shelf, int deepPosition) Возвращает агента, помещенного в заданную ячейку.

rack — индекс стеллажа
bay — индекс секции
shelf — индекс полки
deepPosition — индекс ячейки
Резервирование

Все перечисленные ниже функции можно вызвать только после инициализации элементов разметки пространства.

Функция Описание
boolean hasSpace(int rack, int bay, int shelf) Возвращает true, если в указанном слоте есть ячейки, доступные для резервирования. В противном случае возвращает false.
Заблокированные ячейки считаются недоступными для резервирования.

rack — индекс стеллажа
bay — индекс секции
shelf — индекс полки
boolean hasSpace() Возвращает true, если в указанном складе есть ячейки, доступные для резервирования. В противном случае возвращает false.
Заблокированные ячейки считаются недоступными для резервирования.
int nReserved() Возвращает количество зарезервированных, но не занятых ячеек.
У стеллажей типов FIFO и LIFO функция также учитывает ячейки, по которым агенты перемещаются в момент вызова функции, равно как и их целевые ячейки.
List<StorageCell> reservedCells(int rack, int bay, int shelf) Возвращает список зарезервированных ячеек, находящихся в указанном слоте.

rack — индекс стеллажа
bay — индекс секции
shelf — индекс полки
List<StorageCell> reservedCells(int rack, int bay) Возвращает список зарезервированных ячеек, находящихся в указанной секции.

rack — индекс стеллажа
bay — индекс секции
void setReservation(Agent agent, int rack, int bay, int shelf) Резервирует ячейку для заданного агента в заданном слоте. Конкретная ячейка определяется в момент размещения агента.

agent — агент (материальный объект)
rack — индекс стеллажа
bay — индекс секции
shelf — индекс полки
void setReservation(Agent agent, int rack, int bay) Резервирует ячейку для заданного агента в заданной секции. Конкретная ячейка определяется в момент размещения агента.

agent — агент (материальный объект)
rack — индекс стеллажа
bay — индекс секции
void cancelReservation(Agent agent) Отменяет резервирования, сделанные для заданного агента.

agent — агент (материальный объект)
Операция размещения

Все перечисленные ниже функции можно вызвать только после инициализации элементов разметки пространства.

У складов со стеллажами типа FIFO эти функции немедленно помещают агента в ячейку, ближайшую к «разгрузочной» стороне стеллаже. Если в момент вызова функции другой агент (материальный объект) движется в направлении этой ячейки, приоритет получает тот, что был помещен с помощью функции.
Функция Описание
void store(Agent agent) Размещает указанного агента на складе. Если нет подходящих для резервирования ячеек, возникает ошибка.

agent — агент (материальный объект)
void store(Agent agent, int rack, int bay, int shelf) Размещает указанного агента в указанном слоте. Если нет подходящих для резервирования ячеек, возникает ошибка.

agent — агент (материальный объект)
rack — индекс стеллажа
bay — индекс секции
shelf — индекс полки
void store(Agent agent, int rack, int bay) Размещает указанного агента в указанной секции. Если нет подходящих для резервирования ячеек, возникает ошибка.

agent — агент (материальный объект)
rack — индекс стеллажа
bay — индекс секции
void store(Agent agent, int rack) Размещает указанного агента на указанном стеллаже. Если нет подходящих для резервирования ячеек, возникает ошибка.

agent — агент (материальный объект)
rack — индекс стеллажа
Операция извлечения

Все перечисленные ниже функции можно вызвать только после инициализации элементов разметки пространства.

Со складов типов FIFO и LIFO извлекать агента можно только из ячеек, находящихся у проезда (в случае складов со стеллажами типа FIFO — только с «разгрузочной» стороны). При попытке извлечь агента из другой ячейки появится ошибка.
Функция Описание
Agent retrieve(Agent agent) Извлекает со склада и возвращает ранее размещенного агента.

agent — агент (материальный объект)
Agent retrieve(int rack, int bay, int shelf) Извлекает со склада и возвращает следующего доступного агента из указанного слота.

rack — индекс стеллажа
bay — индекс секции
shelf — индекс полки
Agent retrieve(int rack, int bay) Извлекает со склада и возвращает следующего доступного агента из указанной секции.

rack — индекс стеллажа
bay — индекс секции
Agent retrieve(int rack) Извлекает со склада и возвращает следующего доступного агента с указанного стеллажа.

rack — индекс стеллажа
Склад как препятствие
Функция Описание
boolean isObstacle() Возвращает true, если стеллажи на этом складе являются препятствием для пешеходов и транспортеров, работающих в режиме произвольной навигации. В противном случае возвращает false.
void setObstacle(boolean isObstacle) Задает, являются ли стеллажи на этом складе препятствием для пешеходов и транспортеров, работающих в режиме произвольной навигации.

isObstacle — передайте true, чтобы сделать стеллажи препятствием; в противном случае передайте false.
Местоположение склада
Функция Описание
double getX() Возвращает значение координаты X для этого склада.
void setX(double x) Задает значение координаты X для этого склада. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

x — новое значение координаты X
double getY() Возвращает значение координаты Y для этого склада.
void setY(double y) Задает значение координаты Y для этого склада. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

y — новое значение координаты Y
double getZ() Возвращает значение координаты Z для этого склада.
void setZ(double z) Задает значение координаты Z для этого склада. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

z — новое значение координаты Z
double getRotation() Возвращает угол поворота склада по часовой стрелке, в радианах.
void setRotation(double rotation) Задает угол поворота склада по часовой стрелке, в радианах. Эту функцию нельзя вызвать после инициализации элементов разметки пространства.

rotation — новый угол поворота по часовой стрелке, в радианах
Внешний вид склада
Функция Описание
Color getShelvesColor() Возвращает цвет полок стеллажей.
void setShelvesColor(Color shelvesColor) Задает цветполок стеллажей. Эта функция не будет выполняться для складов с набивным типом стеллажей.

shelvesColor — новый цвет полок
double getShelvesTiltAngle() Работает со складами типов FIFO и LIFO.
Возвращает угол наклона полок в радианах.
void setShelvesTiltAngle(double tiltAngle) Работает со складами типов FIFO и LIFO.
Задает угол наклона полок.

tiltAngle — новый угол наклона полок в радианах.
Color getFrameColor() Возвращает цвет рамы стеллажей.
void setFrameColor(Color frameColor) Задает цветрамы стеллажей.

frameColor — новый цвет рамы
Уровень
Функция Описание
Level getLevel() Возвращает уровень, на котором расположен данный склад.
Статистика
Функция Описание
int capacity() Возвращает максимальное количество агентов, которое можно разместить на этом складе. Заблокированные ячейки вычитаются из результата.
int nStored() Возвращает общее количество размещенных агентов. Можно сбросить значение, вызвав функцию resetStats().
int nRetrieved() Возвращает общее количество извлеченных агентов. Можно сбросить значение, вызвав функцию resetStats().
double utilization() Возвращает загруженность склада. Загруженность высчитывается в виде значения с плавающей запятой в диапазоне [0, 1], соответствующего отношению занятых ячеек к общей вместимости склада.
void resetStats() Сбрасывает статистику склада: количество размещенных и извлеченных агентов.

Функции слота

В этом разделе перечислены функции класса StorageSlot. Их можно вызывать только после инициализации элементов разметки пространства.

Расположение на складе
Функция Описание
Storage getStorage() Возвращает склад, к которому относится этот слот.
int getRack() Возвращает индекс стеллажа, к которому относится этот слот.
int getShelf() Возвращает индекс полки, к которой относится этот слот.
int getBay() Возвращает индекс секции, к которой относится этот слот.

Функции ячейки

В этом разделе перечислены функции класса StorageCell. Их можно вызывать только после инициализации элементов разметки пространства.

Расположение на складе
Функция Описание
Storage getStorage() Возвращает склад, к которому относится эта ячейка.
int getRack() Возвращает индекс стеллажа, к которому относится эта ячейка.
int getShelf() Возвращает индекс полки, к которой относится эта ячейка.
int getBay() Возвращает индекс секции, к которой относится эта ячейка.
int getDeepPosition() Возвращает индекс этой ячейки в слоте.
Agent getAgent() Возвращает агента, размещенного в этой ячейке. Если ячейка пуста, возвращает null.

agent — агент (материальный объект)
Размещение и извлечение
Функция Описание
boolean isAvailableToStore() Возвращает true, если ячейка доступна и резервирование разрешено. В противном случае возвращает false.
boolean isAvailableToRetrieve() Возвращает true, если ячейка доступна и содержит агента. В противном случае возвращает false.
void store(Agent agent) Размещает указанного агента в этой ячейке. Агент помещается в ячейку незамедлительно и без анимации. Для данного агента не должно быть зарезервировано другой ячейки. Для ячейки, для которой вызывается функция, должно быть разрешено резервирование.

agent — агент (материальный объект)
Agent retrieve() Извлекает со склада и возвращает агента, занимающего ячейку. Ячейка не должна быть пустой. Не следует использовать со складами типов FIFO и LIFO. Используйте аналогичную функцию самого элемента Storage.
Резервирование
Функция Описание
boolean isFree() Возвращает true, если ячейка пуста и не зарезервирована для агента. В противном случае возвращает false.
void setReservation(Agent agent) Резервирует ячейку для указанного агента. В момент вызова функции ячейка не должна быть зарезервирована для другого агента, иначе возникнет ошибка.
Не следует использовать со складами типов FIFO и LIFO.

agent — агент (материальный объект)
Agent cancelReservation() Снимает резервирование для агента, который зарезервировал эту ячейку и возвращает этого агента. Чтобы эта функция сработала, ячейка должна быть зарезервирована агентом.
Не следует использовать со складами типов FIFO и LIFO.
Блокировка ячеек
Функция Описание
boolean isActive() Возвращает true, если ячейка не заблокирована и нормально функционирует. В противном случае возвращает false.
void deactivate() Блокирует ячейку и запрещает любые операции с ней. Агенты (материальные объекты) могут быть транспортированы через пространство, занятое заблокированными ячейки. Эту функцию можно использовать для моделирования складов, на которых время от времени занимаются обычно пустые области.
Если ячейка блокируется во время выполнения модели, разблокировать ее нельзя.
У складов типов FIFO и LIFO можно заблокировать только ячейки, находящиеся у проездов.
Как мы можем улучшить эту статью?