Стеллаж


Элемент разметки пространства Стеллаж графически задает стеллаж, используемый на складах и в зонах хранения.

Элемент Стеллаж может иметь одну из следующих трех конфигураций:

Один проход, один стеллаж
Два прохода, один стеллаж
Один проход, два стеллажа

Чтобы создать сложную систему стеллажей, используйте несколько фигур стеллажа, затем добавьте блок RackSystem из Библиотеки Моделирования Процессов и настройте его.

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

Параметр Количество ячеек в глубину определяет, сколько узлов сети будет создано на каждой стороне прохода; каждый узел фактически является проекцией набора вертикально расположенных ячеек (их количество задается параметром Количество уровней). Следовательно, такой объект с 60 местами в ряду и 4 уровнями будет иметь 60 * 4 * 2 = 480 ячеек, где коэффициент 2 означает, что по каждую сторону от прохода будет создано по стеллажу. У каждой ячейки есть координаты: ряд (0..1), место (0..npositions-1) и уровень (0..nlevels-1).

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

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

Элемент Стеллаж может проводить с ячейкой следующие операции:

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

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

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

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

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

  1. Нахождение ячейки, в которой хранится агент (и соответствующего узла сети)
  2. Возможно, вызов ресурсов к этому узлу
  3. Извлечение агента из ячейки
  4. Перемещение агента в заданный узел сети

Самым простым способом является использование двух объектов RackStore и RackPick, специально разработанных, чтобы выполнять самые частые операции со стеллажами.

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

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

Вы можете указать, в какую ячейку поместить поддон. Каждая ячейка имеет три координаты: ряд (0..1), позиция (0..n позиций) и уровень (0..n уровней). Таким образом, вы можете управлять всеми уровнями и позициями.

Чтобы добавить стеллаж

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

  3. Задайте свойства стеллажа: выберите Тип: Один стеллаж, один проход; Один стеллаж, два прохода или Два стеллажа, один проход.
  4. Выберите Количество уровней, Количество ячеек в глубинуКоличество ячеек.
  5. В секции свойств Местоположение и размер задайте Длину, Глубину стеллажа и Ширину прохода.
  6. После задания свойств стеллажа удостоверьтесь, что он по-прежнему соединен с сетью. Выберите стеллаж в графическом редакторе. Если стеллаж подсоединен верно, проход будет выделен зеленым цветом. В случае если это не так, переместите стеллаж относительно пути, чтобы путь проходил  по центру прохода.

Свойства

Основные свойства

Имя – Имя элемента. Имя используется для идентификации элемента и доступа к нему из кода.

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

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

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

Видимость – Если опция выбрана, стеллаж будет отображаться на анимации во время исполнения модели.

Тип – Комбинация проходов и стеллажей: Один проход, один стеллаж; Два прохода, один стеллаж; Один проход, два стеллажа.

Количество ячеек – Выберите, как нужно рассчитывать количество ячеек: Задано явно или Вычисляется на основании ширины ячейки.

Количество ячеек – [Виден, если Количество ячеек: Задано явно] Количество ячеек на каждый ряд, расположенных на одном уровне.

Ширина ячейки – [Виден, если Количество ячеек: Вычисляется на основании ширины ячейки] Фиксированная ширина ячейки.

Кол-во ячеек в глубину – Количество позиций в глубине каждой ячейки.

Количество уровней – Количество (вертикальных) уровней стеллажа.

Высота уровня – Высота (вертикальных) уровней стеллажа.

Внешний вид

Цвет заливки – Задает цвет заливки фигуры. Если вы не хотите, чтобы фигура была закрашена, выберите Нет заливки.

Цвет линии – Задает цвет линии. Если вы не хотите, чтобы линия контура была видна, выберите Нет линии.

Рисовать стойки в 3D – Снимите флажок с этой опции, если не хотите рисовать стойки стеллажа в 3D. В таком случае будут отрисованы только "полки".

Кол-во ячеек между стойками – Здесь вы можете указать количество ячеек стеллажа между стойками, если стойки рисуются в 3D. Это свойство никак не влияет на отрисовку стеллажа в 2D анимации.

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

X – X-координата стеллажа (а именно, его левый верхний угол).

Y – Y-координата стеллажа (а именно, его левый верхний угол).

Z – [Доступно, если опция Отображать в: Только в 3D выбрана] Z-координата стеллажа, в метрах.

Длина – Длина стеллажа.

Глубина стеллажа – Глубина стеллажа.

Ширина прохода – Ширина прохода.

Поворот – Угол поворота стеллажа в плоскости XY в градусах.

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

Отображать в - Здесь вы можете выбрать, будет ли фигура отображаться В 2D и в 3D, Только в 2D или Только в 3D.

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

Функции

Конфигурация стеллажа

PalletRackType getType() - Возвращает тип этого стеллажа.

setType(PalletRackType type) - Задает тип этого стеллажа.
Параметр: type - тип стеллажа.

double getCellWidth() - Возвращает текущую ширину ячейки.

setCellWidth(double cellWidth) - Задает ширину ячейки равной параметру cellWidth.

double getDepth() - Возвращает глубину стеллажа.

double getDepthRight() - Возвращает глубину правого стеллажа.

setDepth(double depth) - Задает глубину стеллажа равной параметру depth.

setDepthRight(double depthR) - Задает глубину правого стеллажа равной параметру depthR.

double getAisleDepth() - Возвращает глубину прохода.

double getAisleRightDepth() - Возвращает глубину правого прохода.

setAisleDepth(double aisleDepth) - Задает глубину прохода.
Параметр: aisleDepth - глубина прохода

setAisleRightDepth(double aisleRDepth) -
Задает глубину правого прохода.
Параметр: aisleRDepth - глубина правого прохода.

double getLength() - Возвращает длину стеллажа.

double getLevelHeight() -
Возвращает высоту уровня.

setLength(double length) - Задает длину стеллажа
.
Параметр: length - длина стеллажа.

setLevelHeight(double levelHeight) - Задает высоту уровня стеллажа
.
Параметр: levelHeight - высота уровня.

int numberOfDeepPositions() -
Возвращает количество мест в глубину ячейки.

setNumberOfDeepPositions(int nDeep) - Задает количество мест в глубину ячейки.
Параметр: nDeep - количество мест в глубину ячейки.

int numberOfLevels() - Возвращает количество уровней в стеллаже.

setNumberOfLevels(int nLevels) - Задает количество уровней в стеллаже.
Параметр: nLevels - количество уровней в стеллаже.

int numberOfPositions() - Возвращает количество мест (ячеек) на одной полке стеллажа.

setNumberOfPositions(int nPositions) - Задает количество мест (ячеек) на одной полке стеллажа.
Параметр: nPositions - количество ячеек на одной полке стеллажа.

int numberOfRows() - Возвращает количество стеллажей, 1 или 2.

Работа с содержимым стеллажа

int capacity() - Возвращает вместимость объекта (все уровни и стеллажи, если имеется два стеллажа), то есть (1 or 2) * number of positions along row * number of deep positions * number of levels.
Возвращает: общее количество ячеек

boolean contains(Agent agent) - Возвращает true, если стеллажи содержат данного агента.
Параметр: agent -
агент

int size() - Возвращает количество агентов, находящихся в стеллажах в текущий момент.

resetStats() - Удаляет статистику, собранную объектом к текущему моменту времени.

boolean hasSpace() - Проверяет, есть ли в хранилище свободное место, то есть, имеются ли незанятые или не зарезервированные ячейки. Возвращает true, если имеется достаточно места для хотя бы одного агента.

boolean isFree(int row, int position, int level) - Проверяет, свободна ли заданная ячейка [row,position,level], то есть, не занята и не зарезервирована. Если ячейка свободна, то возвращает true
Параметры:
row - номер стеллажа (0 или 1).
position - положение в ряду (0, 1, ...)
level - уровень (0 - самый низкий)

int nFree(int row, int position, int level) - Проверяет, свободна ли заданная ячейка [row,position,level], то есть, не занята и не зарезервирована и возвращает количество свободных мест в глубину ячейки.
Параметры:
row - номер стеллажа (0 или 1).
position - положение в ряду (0, 1, ...)
level - уровень (0 - самый низкий)

reserve(int row, int position, int level, boolean leftAisle) - Помечает заданную ячейку как зарезервированную [row,position,level]. Ячейка должна быть свободна.
Параметры:
row - номер стеллажа (0 или 1).
position - положение в ряду (0, 1, ...)
level - уровень (0 - самый низкий)

leftAisle - [для стеллажей с двумя проходами]: из какого прохода должна быть резервируемая ячейка

int reserved() - Возвращает количество зарезервированных ячеек в стеллаже (стеллажах).

int nReserved(int row, int position, int level) - Проверяет, зарезервирована ли заданная ячейка [row,position,level].
Параметры:
row - номер стеллажа (0 или 1).
position - положение в ряду (0, 1, ...)
level - уровень (0 - самый низкий)

Возвращает: количество зарезервированных ячеек (может быть > 1 для стеллажей с "глубиной")

release(int row, int position, int level, boolean leftAisle) - Освобождает указанную зарезервированную ячейку [row,position,level]. Ячейка должна быть зарезервирована.
Параметры:
row - номер стеллажа (0 или 1).
position - положение в ряду (0, 1, ...)
level - уровень (0 - самый низкий)

leftAisle - [для стеллажей с двумя проходами]: из какого прохода должна быть ячейка

put(int row, int position, int level, boolean leftAisle, Agent agent) - Помещает агента в ячейку с указанными координатами [row,position,level]. Если ячейка занята, выдает ошибку. Не проверяет, зарезервирована ли ячейка.
Параметры:
row - номер стеллажа (0 или 1).
position - положение в ряду (0, 1, ...)
level - уровень (0 - самый низкий)

leftAisle - [для стеллажей с двумя проходами]: из какого прохода должна быть ячейка
agent - агент

Agent get(int row, int position, int level, int deepPosition) - Возвращает агента, хранящегося в ячейке с заданными координатами [ряд row, место position, уровень level] (или null, если эта ячейка зарезервирована или свободна).
Параметры:
row - ряд (0, 1, ..)
position - позиция в ряду (0, 1, ..)
level - уровень (0 - самый низкий)
deepPosition - [если у ячейки есть глубина] номер (0, 1, ..), при счете от прохода (или от левого прохода, если возле этого ряда есть несколько проходов)

PalletRackLocation getCellOf(Agent agent) - Возвращает координаты ячейки с заданным агентом [row,position,level], или null, если агент здесь не хранится.
Параметр: agent - агент

PalletRackLocation getFreeCell(boolean infront) - Возвращает массив координат [ряд row, место position, уровень level] свободной ячейки, ближайшей к началу или концу зоны хранения, в зависимости от значения параметра infront. Если зона хранения переполнена, возвращает null.
Параметр: infront - если true, возвращаемый объект будет иметь самое маленькое из доступных местоположений

Agent randomEntity() - Возвращает случайного агента в зоне хранения или null, если зона хранения пуста.

Agent remove(Agent agent) - Извлекает агента agent из зоны хранения и возвращает его. Если такого агента в зоне хранения нет, возвращает null.
Параметр: agent - извлекаемый агент

Agent removeFromCell(int row, int position, int level, boolean leftAisle) - Извлекает агента из заданной ячейки [ряд row, место position, уровень level] и возвращает его.
Параметры:
row - номер стеллажа (0 или 1).
position - положение в ряду (0, 1, ...)
level - уровень (0 - самый низкий)

leftAisle - [для стеллажей с двумя проходами]: из какого прохода должна быть ячейка

Agent removeFromCell(PalletRackLocation location, boolean leftAisle) - Извлекает агента из заданного стеллажа [ряд row, место position, уровень level] и возвращает его.
Параметры:
location - [row,position,level]
leftAisle - [для стеллажей с двумя проходами]: из какого прохода должна быть ячейка

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

double getRotation() - Возвращает угол поворота стеллажа в радианах, по часовой стрелке.

void setRotation(double rotation) - Задает поворот стеллажа.
Параметр: rotation - угол поворота стеллажа в радианах, по часовой стрелке.

double getNearestPoint(double x, double y, double z, Point output) - Рассчитывает расстояние (с помощью объекта output) точку в этом стеллаже, ближайшую к заданным координатам (x, y, z). Возвращает квадрат расстояния до точки.
Параметры:
x
- x-координата точки
y - y-координата точки
z - z-координата точки
output - точка выхода
Возвращает: квадрат расстояния до ближайшей точки

double getNearestPoint(double x, double y, Point output) - Рассчитывает расстояние (с помощью объекта output) точку в этом стеллаже, ближайшую к заданным координатам (x, y). Возвращает квадрат расстояния до точки. Все рассчеты производятся в горизонтальной проекции (z-координата не используется, как если бы все значения z равнялись нулю).
Параметры:
x
- x-координата точки
y - y-координата точки
output - точка выхода. Обратите внимание, что output.z остается неизмененным.
Возвращает: квадрат расстояния до точки в горизонтальной (XY) проекции

Position getPositionAtCell(int row, int position, int level, int deepPosition, double offset, double depth, boolean leftAisle, Position out) - Возвращает местоположение в заданной ячейке.
Параметры:
row - номер стеллажа (0 или 1). Используется в элементах с двумя стеллажами (0 = левый ряд, 1 = правый ряд). Если имеется только один стеллаж, то его номер - 0.
position - положение в ряду (0, 1, ...)
level - уровень (0, 1, ...)
offset - смещение по краю ряда
depth - глубина ячеек (перепендикулярно краю ряда)
out - местоположение агента (может быть null)

deepPosition - [если у ячеек есть глубина] номер (0, 1, ..), отсчет начинается от прохода (или от левого прохода, если возле этого стеллажа несколько проходов)
leftAisle - [для стеллажей с двумя проходами, требуется для ориентации при рассчете] куда "смотрит" агент: был ли он помещен с левого прохода или с правого
Возвращает: заданный объект output (если он не null) или новое местоположение с координатами и углом поворота.

Position getPositionAtCellEntry(int row, int position, int level, boolean leftAisle, Position out) - Возвращает местоположение в заданной ячейке.
Параметры:
row - номер стеллажа (0 или 1). Используется в элементах с двумя стеллажами (0 = левый ряд, 1 = правый ряд). Если имеется только один стеллаж, то его номер - 0.
position - положение в ряду (0, 1, ...)
level - уровень (0, 1, ...)
offset - смещение по краю ряда
depth - глубина ячеек (перепендикулярно краю ряда)
out - местоположение
агента (может быть null)
Возвращает: заданный объект output (если он не null) или новое местоположение с координатами и углом поворота.

Position getPositionInAisle(int row, int position, boolean leftAisle, Position out) - Возвращает местоположение в заданном проходе в заданной ячейке.
Параметры:
row - номер стеллажа (0 или 1). Используется в элементах с двумя стеллажами (0 = левый ряд, 1 = правый ряд). Если имеется только один стеллаж, то его номер - 0.
position - положение в ряду (0, 1, ...)

out - местоположение агента (может быть null)
leftAisle - [для стеллажей с двумя проходами, требуется для ориентации при рассчете] куда "смотрит" агент: был ли он помещен с левого прохода или с правого
Возвращает: заданный объект output (если он не null) или новое местоположение с координатами и углом поворота.

Agent getByIndex(int index)- Возвращает находящегося в стеллаже агента с заданным номером. Порядок хранения агентов - внутренний, и может меняться, когда агенты добавляются или удаляются. Если номер больше чем количество агентов -1, возвращает null.
Параметр: index - номер
Возвращает: агента по номеру или null