Conveyor


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

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

Вместимость конвейера определяется как длина length, поделенная на минимальное расстояние между агентами space.

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

Пожалуйста, помните, что поведение в начальных/конечных точках отличается от реального поведения конвейеров, что, правда, может повлиять только на те модели, в которых два конвейера последовательно соединены друг с другом: объект Conveyor подразумевает, что агенты имеют нулевую длину и только лишь сохраняет расстояние space между ними, в то время как в реальности агенты могут иметь ненулевые размеры и нулевое расстояние между собой. Поэтому когда агент покидает один конвейер и помещается на другой, первый конвейер "забывает" об этом агенте и не будет учитывать его, если будет такая ситуация, что агент лишь частично была помещен на второй конвейер и остановился и т.д.

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

Новый агент может быть помещен на конвейер только в том случае, если конвейер движется, и предыдущий агент переместился от начала конвейера хотя бы на расстояние, равное параметру space. Поэтому если существует вероятность того, что два агента могут поступить на вход конвейера с интервалом времени, меньшим, чем space/speed, то вам нужно будет добавить специальный объект буферизации (например, Queue) перед объектом Conveyor.

Параметры

Длина задается
Выберите, как рассчитывается длина конвейера: Явно, или она равняется длине указанного пути (Согласно пути).
Синтаксис: boolean lengthDefinedByPath
Значение по умолчанию: false (Явно)
Длина
[Параметр виден, если Длина задается: Явно] Длина конвейера.
Синтаксис: double length
Значение по умолчанию: 10 м.
Скорость
Скорость, с которой движется конвейер.
Синтаксис: double speed
Значение по умолчанию: 1 м/c
Накапливающий
Если опция выбрана (true), то агенты будут двигаться даже тогда, когда на выходе образовалась «пробка», если нет, то в этом случае весь конвейер остановится.
Синтаксис: boolean accumulating
Значение по умолчанию: true
Место агентов
Фигура разметки конвейера Путь.
Синтаксис: Path entityLocation
Специфические
Взять агента с пред. конвейера
Выберите требуемый сценарий:
Равномерно, с той же скоростью
, как у предыдущего конвейера.
Мгновенно, при поступлении - предыдущий конвейер отпускает агента, как только он подходит к этому.
Мгновенно, при входе - выход предыдущего конвейера заморожен, пока агент полностью не поступит в этот.
Имя: grabBehaviour
Значение по умолчанию: Равномерно, с той же скоростью (Conveyor.GRAB_SMOOTHLY)
Изменить длину агента
Выберите эту опцию, если хотите изменить длину агента.
Синтаксис: boolean changeLengthOfEntity
Значение по умолчанию: false
Длина агента [динамический]
[Параметр виден, если выбрана опция Изменить длину агента] Длина агента.
Тип значения: double
Значение по умолчанию: 1 м.
Локальная переменная: T agent - агент.
Вернуть агента в исходную точку
Если опция выбрана, агенты возвращаются в свое начальное местоположение (узел или путь, где они находились до того, как попали в этот блок), после того, как покинут фигуру разметки, заданную в параметре Место агентов.
Синтаксис: boolean restoreEntityLocationOnExit
Значение по умолчанию: false
Действия
При входе [код]
Код, выполняемый, когда агент начинает поступать на конвейер.
Локальная переменная: T agent - агент.
При полном входе [код]
Код, выполняемый, когда агент полностью поступает на конвейер.
Локальная переменная: T agent - агент.
При подходе к выходу [код]
Код, выполняемый, когда агент достигает конца конвейера (что не означает, что он немедленно покинет объект, поскольку следующий за конвейером объект может быть не готов к приему агента).
Локальная переменная: T agent - агент.
При выходе [код]
Код, выполняемый, когда агент начинает покидать конвейер.
Локальная переменная: T agent - агент.
При полном выходе [код]
Код, выполняемый, когда агент полностью покидает конвейер.
Локальная переменная: T agent - агент.
При извлечении [код]
Код, выполняемый, когда агент умышленно извлекается из блока посредством вызова функции агента remove(). Этот код вызывается автоматически после вызова функции remove().
Локальная переменная: T agent - агент.

Функции

boolean canEnter() - Возвращает true, если еще один агент может быть помещен на конвейер.

double distanceFromExit(int index) - Возвращает расстояние до конца конвейера для агента с заданным номером.

double distanceFromExit(T agent) - Возвращает расстояние до конца конвейера для указанного агента.

T get(int index) - Возвращает агента с заданным номером (подсчет ведется от конца).

double getSpeed(int index) - Возвращает скорость движения агента, в единицах длины, выбранных в параметре Скорость.

int indexOf(Agent agent) - Возвращает номер позиции для заданного агента (подсчет ведется от конца). Возвращает -1, если агент не найден.

boolean isMoving() - Возвращает true, если конвейер в данный момент движется, и false - если нет.

T remove(Agent agent) - Удаляет заданного агента из любой позиции на конвейере. Если агент не находится на конвейере, возвращает null, иначе - возвращает удаленного агента.

T remove(int index) - Удаляет агента с заданным номером с конвейера. Выдает ошибку, если номер неверен или не найден. Возвращает удаленного агента.

void resume() - Возобновляет движение конвейера.

void stop() - Останавливает конвейер.

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

double spaceAhead(int index) - Возвращает значение свободного пространства перед агентом с заданным номером (для первого агента это значение равно расстоянию до конца конвейера).

Iterator iterator() - Возвращает итератор над агентами (в порядке: первый - ближайший к выходу).

Порты

in
Входной порт.
out
Выходной порт.