Система дискретных событий позволяет реализовать различные типы событий для манипулирования объектами и хранилищами. Иногда требуемое поведение включает в себя более одного события, действующего на одно и то же хранилище или объект. В этом примере показано, как обрабатывать несколько событий, действующих на одном и том же целевом объекте в системе с дискретными событиями. В этом примере настраиваемый блок хранения объектов создается для реализации tag, который является одним из идентификаторов, когда несколько событий таймера действуют на один и тот же объект. Список идентификаторов событий см. в разделе Настройка поведения системы дискретных событий с использованием событий и действий с событиями.
Сведения об открытии модели и наблюдении за поведением пользовательского блока см. в разделе CustomEntityStorageBlockWithTwoTimerEventsExample.
Предположим, что object™ системы с дискретным событием используется для представления объекта, который обрабатывает металлические детали с помощью печи. Время обработки изменяется в зависимости от обнаруженного металла. Для безопасности детали имеют максимально допустимое время обработки.
Если время обработки в печи меньше допустимого максимального времени, детали обрабатываются и выходят из печи и оборудования.
При наличии ошибки в обнаруженном металле время обслуживания превышает максимально допустимое время обработки, процесс останавливается, и детали извлекаются из печи для повторной маршрутизации для дальнейшей обработки.
Для представления этого поведения в этом примере используется пользовательский блок хранения объектов с одним входом, двумя выходами и элементом хранения. Объект типа Part с TimeOut входит в хранилище обрабатываемого пользовательского блока. TimeOut определяет максимально допустимое время обработки позиций. При поступлении компонента в хранилище активируются два события таймера. Один таймер отслеживает время обработки детали в печи. Когда этот таймер истекает, объект перенаправляется на выход 1. Другой таймер действует как отказоустойчивый и отслеживает, превышается ли максимально допустимое время обработки. По истечении этого таймера процесс завершается, и объект пересылается на выход. 2.

Этот пример создает пользовательский блок и однозначно идентифицирует эти два события таймера, нацеленные на один и тот же объект с помощью пользовательских тегов.
См. Код для создания пользовательского блока хранилища с событиями таймера
Создайте пользовательский блок с одним входом, двумя выходами и элементом хранения. Дополнительные сведения о создании базового элемента хранения см. в разделе Реализация объекта системы дискретных событий с помощью блока системы дискретных событий 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
Вызов двух таймеров с тегами '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
Таймер, который истекает первым, определяет поведение объекта при пересылке.
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
Сохранить .m файл как CustomEntityStorageBlockTimer. Свяжите объект System с моделью SimEvents ® с помощью блока MATLAB Discrete-Event System. Дополнительные сведения о связывании см. в разделе Создание пользовательских блоков с помощью системного блока дискретных событий MATLAB.
Создайте модель SimEvents, включающую блок системы дискретных событий MATLAB, блок генератора объектов, два блока терминатора объектов. Соедините блоки, как показано в модели.

В блоке «Генератор объектов»:
На вкладке Тип объекта (Entity type) задайте для параметра Наименование атрибута (Attribute Name) значение TimeOut.
На вкладке Действия с событиями в поле Создать действие:
entity.TimeOut = 10;
В блоках Entity Terminator и Entity Terminator1 выведите Число поступивших объектов, статистику и соедините их с областями.
Увеличение времени моделирования до 100 и смоделировать модель. Обратите внимание, что объекты пересылаются на соответствующий выход на основании истечения соответствующего таймера.


entry | eventTimer | getEntityPortsImpl | getEntityStorageImpl | getEntityTypesImpl | matlab.DiscreteEventSystem | matlab.System | timer