Инициализация стеллажей с параметрами в AnyLogic - PullRequest
0 голосов
/ 16 мая 2019

Уважаемое сообщество переполнения стека,

Я пытаюсь создать стеллаж для поддонов в AnyLogic (версия университета 7.1.2), в котором количество ячеек, количество уровней и некоторые другие свойства устанавливаются из параметров. Параметры устанавливаются перед выполнением модели со страницы моделирования. Кто-нибудь делал это раньше?

На мой взгляд, проблема начинается с свойств palletRack, которые не позволяют задавать параметры в качестве значений, но требуют числа («Количество ячеек: 10» вместо «Количество ячеек: myParameter»). Но есть предопределенные функции, такие как "setNumberOfPositions (int nPositions)", так что я подумал, что могу избежать этой проблемы, вызывая эти функции в начале симуляции (в нулевое время). Я использовал поле действия события для этого .

Это вызвало исключение, в котором говорилось, что «элемент root: palletRack: Markup уже инициализирован и не может быть изменен. Пожалуйста, используйте конструктор без аргументов, выполните настройку и, наконец, вызовите функцию initialize ().».

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

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

PalletRack palletRack = new PalletRack();
palletRack.setOwner(this); 
[...]
palletRack.setNumberOfPositions(p_CellsInX);
palletRack.setNumberOfLevels(p_CellsInY);
palletRack.setCellWidth(p_WidthOfCell);
palletRack.setLevelHeight(p_HeightOfCell);

palletRack.initialize();

Это не выдало никаких ошибок, но и не позволило собрать стойку.

Кроме того, я попытался добавить "@Override" перед своими функциями.

У кого-нибудь есть идеи, как можно инициализировать стойку поддонов с параметрами или переопределить начальные значения?

Очевидно, я абсолютный новичок в AnyLogic. Буду очень признателен за любые советы. Заранее спасибо!

1 Ответ

0 голосов
/ 16 мая 2019

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

Обратите внимание, что myNetwork - это существующая сеть, которую я нарисовал здесь вручную во время разработки.

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

PS: это может не работать в AL7, но работает в AL8. Для добавления в presentation

вам могут потребоваться немного другие функции
myRack = new PalletRack(this, // Agent owner
                        SHAPE_DRAW_2D3D,  // ShapeDrawMode
                        true, // isPublic
                        ground, // ground
                        false, // isObstacle
                        -2480,  // x pos
                        1980,  // y pos
                        0.0, // z pos
                        35.2*numCellsPerRackPerLevel,  // length (keep constant cell width and vary rack length accordingly)
                        20.0,  // depth
                        20.0,  // depthR (depth of the right riack (only if type is 2 racks and 1 aisle)
                        50.0, // levelHeight
                        0., // rotation
                        PALLET_RACK_TWO_PALLET_RACKS, // PalletRackType
                        PALLET_RACK_NO_DIRECTION, // PalletRackDirection
                        40.0,  // aisleDepth = width
                        40.0,  // aisleRDepth (width of right aisle, only if 1 rack 2 aisles)
                        35.2,  // cellWidth
                        numCellsPerRackPerLevel,  // nPositions
                        numLevelsPerRack,  // nLevels
                        1, // nDeep
                        lavender,  // fillColor
                        dodgerBlue, // lineColor
                        2); // cellsBetweenLegs

presentation.add(myRack);

// this must cut through both rack's aisles
MarkupSegmentLine segment = new MarkupSegmentLine(myRack.getX()-10, myRack.getY()+30, 0.0, myRack.getX()+myRack.getLength()+10, v_IMS_Rack1.getY()+30, 0.0);

Path path = new Path(this, SHAPE_DRAW_2D3D, true,
                     true, true, 1.0, false, 10,
                     PATH_LINE, dodgerBlue, 1.0,
                     segment);
presentation.add(myRack);
myNetwork.add( myRack);
myNetwork.add(path);
myNetwork.initialize();
...