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

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

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

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

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

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

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

Чтобы представлять такое поведение, в этом примере используется пользовательский блок хранения сущностей с одним входом, двумя выходами и элементом хранения. Сущность типа Part с TimeOut атрибут входит в хранилище пользовательского блока, который будет обработан. TimeOut определяет максимально допустимое время вычислений деталей. Когда компонент входит в хранилище, активируются два события таймера. Один таймер отслеживает время вычислений детали в печи. Когда этот таймер истекает, сущность переадресовывается на вывод 1. Другой таймер действует как fail-safe и отслеживает, если превышено максимально допустимое время вычислений или нет. Когда этот таймер истекает, процесс завершается, и сущность переадресуется на выход 2.

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

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

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

  1. Сгенерируйте пользовательский блок с одним входом, двумя выходами и элементом хранения. Для получения дополнительной информации о создании базового элемента хранения смотрите Реализация системного объекта дискретных событий с блоком системы дискретных событий MATLAB.

        function num = getNumInputsImpl(~)
            num = 1;    
        end
            
        function num = getNumOutputsImpl(~)
            num = 2;
        end      
         
        function entityTypes = getEntityTypesImpl(obj)
            entityTypes = obj.entityType('Part');
        end
            
        function [inputTypes,outputTypes] = getEntityPortsImpl(obj)
            inputTypes = {'Part'};
            outputTypes = {'Part' 'Part'};    
        end
    
        function [storageSpecs, I, O] = getEntityStorageImpl(obj)
            storageSpecs = obj.queueFIFO('entity1', obj.Capacity);
            I = 1;
            O = [1 1];
        end
  2. Активируйте два таймера с тегами 'TimeOut' и 'ProcessComplete' при входе сущности в хранилище.

        function [entity,event] = PartEntry(obj,storage,entity,source)
            % Specify event actions when entity enters storage.
            ProcessingTime = randi([1 15]);
            % The TimeOut attribute specifies the expiration time of the timer with tag TimeOut
            event1 = obj.eventTimer('TimeOut', entity.data.TimeOut);
            % The expiration time of the timer ProcessComplete is a random integer between 
            % 1 and 15.
            event2 = obj.eventTimer('ProcessComplete', ProcessingTime);   
            event = [event1 event2];
        end
  3. Таймер, который истекает первый, определяет сущность поведение вперед.

        function [entity, event] = timer(obj,storage,entity,tag)
            % Specify event actions for when scheduled timer completes.
            event = obj.initEventArray;
                switch tag
                    case 'ProcessComplete'
                        % If ProcessComplete expires first, entities are forwarded to output 1.
                        event = obj.eventForward('output', 1, 0);
                    case 'TimeOut'
                        % If TimeOut expires first, entities are forwarded to output 2.
                        event = obj.eventForward('output', 2, 0);
                end
        end

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

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

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

  3. В блоке Entity Generator:

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

    2. На вкладке Event actions, в поле Generate action:

      entity.TimeOut = 10;
  4. В блоках Entity Terminator и Entity Terminator1 выводите Number of entities arrived, a statistic и соединяйте их со возможностями.

  5. Увеличьте время симуляции до 100 и моделируйте модель. Обратите внимание, что сущности пересылаются на соответствующий выход на основе соответствующего истечения времени таймера.

См. также

| | | | | | |

Похожие темы