Система дискретных событий позволяет реализовать различные типы событий для манипулирования сущностями и хранилищами. Иногда желаемое поведение включает в себя более одного события, действующего на одно и то же хранилище или сущность. В этом примере показано, как обработать несколько событий, действующих на один и тот же целевой объект в среде системы дискретных событий. В этом примере для реализации tag
генерируется пользовательский блок хранения сущностей, который является одним из идентификаторов, когда несколько событий таймера действуют на одну и ту же сущность. Список идентификаторов событий см. в разделе Настройка поведения системы дискретных событий с использованием событий и действий события.
Чтобы открыть модель и наблюдать за поведением пользовательского блока, смотрите CustomEntityStorageBlockWithTwoTimerEventsExample
.
Предположим, что Системный object™ с дискретным событием используется для представления средства, которое обрабатывает металлические детали с помощью печи. Значение времени вычислений изменяется в зависимости от обнаруженного металла. Для безопасности детали имеют максимально допустимое время вычислений.
Если время вычислений печи меньше допустимого максимального времени, детали обрабатываются и выходят из печи и установки.
Если имеется ошибка в обнаруженном металле, время работы превышает максимально допустимое время вычислений, процесс останавливается, и детали извлекаются из печи для дальнейшей обработки.
Чтобы представлять такое поведение, в этом примере используется пользовательский блок хранения сущностей с одним входом, двумя выходами и элементом хранения. Сущность типа Part
с TimeOut
атрибут входит в хранилище пользовательского блока, который будет обработан. TimeOut
определяет максимально допустимое время вычислений деталей. Когда компонент входит в хранилище, активируются два события таймера. Один таймер отслеживает время вычислений детали в печи. Когда этот таймер истекает, сущность переадресовывается на вывод 1
. Другой таймер действует как fail-safe и отслеживает, если превышено максимально допустимое время вычислений или нет. Когда этот таймер истекает, процесс завершается, и сущность переадресуется на выход 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
. Связать системный объект с SimEvents® моделировать при помощи блока MATLAB Discrete-Event System. Дополнительные сведения о связывании см. в разделе Создание пользовательских блоков с использованием системного блока MATLAB Discrete-Event.
Создайте модель SimEvents, включая блок MATLAB Discrete-Event System, блок Entity Generator, два блока Entity Terminator. Соедините блоки как показано на модели.
В блоке Entity Generator:
На вкладке Entity type установите Attribute Name равным TimeOut
.
На вкладке Event actions, в поле Generate action:
entity.TimeOut = 10;
В блоках Entity Terminator и Entity Terminator1 выводите Number of entities arrived, a statistic и соединяйте их со возможностями.
Увеличьте время симуляции до 100
и моделируйте модель. Обратите внимание, что сущности пересылаются на соответствующий выход на основе соответствующего истечения времени таймера.
entry
| eventTimer
| getEntityPortsImpl
| getEntityStorageImpl
| getEntityTypesImpl
| matlab.DiscreteEventSystem
| matlab.System
| timer