Системный object™ с дискретными событиями может содержать несколько типов событий для манипулирования сущностями, действий с хранилищами и управления ресурсами. Когда событие подлежит выполнению, система дискретного события может ответить на это событие, вызывая действия события. Цель этого примера - показать, как работать с событиями и действиями события при создании пользовательского блока. Чтобы просмотреть список предоставленных действий события и события, смотрите Настройте Поведение Системы Дискретных Событий Используя События и Действия События.
Чтобы открыть модель и наблюдать за поведением пользовательского блока, смотрите CustomEntityStorageBlockWithIterationEventExample
.
В этом примере пользовательский блок позволяет сущностям вводить свой элемент хранения через его входной порт. Элемент хранения сортирует сущности на основе их Diameter
атрибут в порядке возрастания. Каждый вход сущности в хранилище блока вызывает событие итерации, чтобы отобразить диаметр и положение каждой сущности в хранилище.
Элемент хранения позволяет вам определять его емкость для хранения и сортировки сущностей, в течение которых можно получить доступ к любой сущности и управлять ею. В этом примере устройство хранения с 5 емкости
используется для хранения и сортировки автомобильных колес на основе их Diameter
атрибут в порядке возрастания. Когда новое колесо входит в хранилище, событие итерации eventIterate
вызывается, что запускает действие события итерации iterate
отобразить положения колес в хранилище и их диаметр.
Смотрите код, чтобы сгенерировать пользовательский блок хранения с событием итерации
Определите хранилище с obj.Capacity емкости
, который сортирует колеса по их значению приоритета. Значения приоритета получаются из Diameter
атрибуты сущностей и сортируются в порядке возрастания.
function [storageSpecs, I, O] = getEntityStorageImpl(obj) storageSpecs = obj.queuePriority('Wheel',obj.Capacity, 'Diameter','ascending'); I = 1; O = []; end
Вход колеса в хранилище вызывает событие итерации.
function [entity, event] = WheelEntry(obj,storage,entity, source) % Entity entry invokes an iterate event. event = obj.eventIterate(1, ''); end
Входной параметр 1
- индекс хранилища для итерационного события и ''
- имя тега.
Итерационное событие вызывает итерационное действие события.
% 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()
как внешнюю функцию для генерации кода. Для каждой итерации в коде отображается новый идентификатор колеса, текущее положение и диаметр, который используется в качестве атрибута сортировки.
Сохраните .m
файл как CustomEntityStorageBlockIteration
. Связать системный объект с SimEvents® моделировать при помощи блока MATLAB Discrete-Event System. Дополнительные сведения о связывании см. в разделе Создание пользовательских блоков с использованием системного блока MATLAB Discrete-Event.
Создайте модель SimEvents, включая блок MATLAB Discrete-Event System и блок Entity Generator.
В блоке Entity Generator:
На вкладке Entity type установите Attribute Name равным Diameter
.
Атрибут Diameter
используется для сортировки сущностей в блоке MATLAB Discrete-Event System.
На вкладке Event actions, в поле Generate action, добавьте этот код, чтобы рандомизировать размер входящих сущностей.
entity.Diameter = randi([1 10]);
На вкладке Statistics выведите статистику Number of entities departed, d и соединитесь с возможностями.
Соедините блоки как показано и симулируйте модель.
Заметьте, что блок Entity Generator генерирует 5
сущности, так как емкость блока хранения 5
.
Diagnostic Viewer отображает событие итерации для каждого входа колеса в хранилище. Каждая итерация отображает идентификатор, положение и диаметр колес. Наблюдайте, как каждый вход в колесо изменяет порядок хранения колес. В последней итерации 5
сущности в хранилище сортируются в порядке возрастания.
entry
| eventIterate
| getEntityPortsImpl
| getEntityStorageImpl
| getEntityTypesImpl
| iterate
| matlab.DiscreteEventSystem
| matlab.System