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