Создайте пользовательский блок хранения сущностей с событием итерации

Системный object™ с дискретными событиями может содержать несколько типов событий для манипулирования сущностями, действий с хранилищами и управления ресурсами. Когда событие подлежит выполнению, система дискретного события может ответить на это событие, вызывая действия события. Цель этого примера - показать, как работать с событиями и действиями события при создании пользовательского блока. Чтобы просмотреть список предоставленных действий события и события, смотрите Настройте Поведение Системы Дискретных Событий Используя События и Действия События.

Чтобы открыть модель и наблюдать за поведением пользовательского блока, смотрите CustomEntityStorageBlockWithIterationEventExample.

Создайте системный объект дискретных событий

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

Элемент хранения позволяет вам определять его емкость для хранения и сортировки сущностей, в течение которых можно получить доступ к любой сущности и управлять ею. В этом примере устройство хранения с 5 емкости используется для хранения и сортировки автомобильных колес на основе их Diameter атрибут в порядке возрастания. Когда новое колесо входит в хранилище, событие итерации eventIterate вызывается, что запускает действие события итерации iterate отобразить положения колес в хранилище и их диаметр.

 Смотрите код, чтобы сгенерировать пользовательский блок хранения с событием итерации

Задайте поведение пользовательских блоков

  1. Определите хранилище с obj.Capacity емкости, который сортирует колеса по их значению приоритета. Значения приоритета получаются из Diameter атрибуты сущностей и сортируются в порядке возрастания.

        function [storageSpecs, I, O] = getEntityStorageImpl(obj)
                storageSpecs = obj.queuePriority('Wheel',obj.Capacity, 'Diameter','ascending');
                I = 1;
                O = [];        
        end
  2. Вход колеса в хранилище вызывает событие итерации.

        function [entity, event] = WheelEntry(obj,storage,entity, source)
                % Entity entry invokes an iterate event.      
                event = obj.eventIterate(1, '');
        end

    Входной параметр 1 - индекс хранилища для итерационного события и '' - имя тега.

  3. Итерационное событие вызывает итерационное действие события.

        % The itarate event action
        function [entity,event,next] = WheelIterate(obj,storage,entity,tag,cur)
            % Display wheel id, position in the storage, and diameter.
                coder.extrinsic('fprintf');
                fprintf('Wheel id %d, Current position %d, Diameter %d\n', ...
                    entity.sys.id, cur.position, entity.data.Diameter);
                if cur.size == cur.position 
                    fprintf('End of Iteration \n')
                end
            next = true;
            event=[];
        end

    В коде coder.extrinsic('fprintf') объявляет функцию fprintf() как внешнюю функцию для генерации кода. Для каждой итерации в коде отображается новый идентификатор колеса, текущее положение и диаметр, который используется в качестве атрибута сортировки.

Реализуйте пользовательский блок

  1. Сохраните .m файл как CustomEntityStorageBlockIteration. Связать системный объект с SimEvents® моделировать при помощи блока MATLAB Discrete-Event System. Дополнительные сведения о связывании см. в разделе Создание пользовательских блоков с использованием системного блока MATLAB Discrete-Event.

  2. Создайте модель SimEvents, включая блок MATLAB Discrete-Event System и блок Entity Generator.

  3. В блоке Entity Generator:

    1. На вкладке Entity type установите Attribute Name равным Diameter.

      Атрибут Diameter используется для сортировки сущностей в блоке MATLAB Discrete-Event System.

    2. На вкладке Event actions, в поле Generate action, добавьте этот код, чтобы рандомизировать размер входящих сущностей.

      entity.Diameter = randi([1 10]);
    3. На вкладке Statistics выведите статистику Number of entities departed, d и соединитесь с возможностями.

  4. Соедините блоки как показано и симулируйте модель.

    1. Заметьте, что блок Entity Generator генерирует 5 сущности, так как емкость блока хранения 5.

    2. Diagnostic Viewer отображает событие итерации для каждого входа колеса в хранилище. Каждая итерация отображает идентификатор, положение и диаметр колес. Наблюдайте, как каждый вход в колесо изменяет порядок хранения колес. В последней итерации 5 сущности в хранилище сортируются в порядке возрастания.

См. также

| | | | | | |

Похожие темы