Этот пример показывает, как создать авторский блок с несколькими устройствами хранения данных и управлять поведением устройства хранения данных с помощью дискретной системы событий object™ методы.
Предположим, что вы управляете средством, которое производит элементы для потребительских заказов. Чтобы подготовиться к повторяющимся порядкам, средство производит предоставление элементов, прежде чем порядки прибудут. Когда новый порядок прибывает, запасы проверяются на доступность.
Если элемент найден в устройстве хранения данных, он отбывает из средства, чтобы выполнить порядок.
Если элемент не найден в устройстве хранения данных, новый элемент производится, и сгенерированный элемент отбывает из средства, чтобы выполнить порядок.
Чтобы сгенерировать это пользовательское поведение, вы управляете несколькими устройствами хранения данных через объект дискретной системы событий, созданное использование методов matlab.DiscreteEventSystem
. Чтобы наблюдать поведение авторского блока, смотрите CustomEntityStorageBlockWithTwoStoragesExample
.
Сгенерируйте пользовательский блок системы хранения сущности с двумя входными параметрами, одним выводом и двумя запоминающими элементами.
Желаемое поведение авторского блока должно выбрать и вывести сущности на основе ссылочной сущности.
Входной порт 1
принимает сущности с типом Item
к устройству хранения данных 1
.
Входной порт 2
принимает ссылочные сущности с типом Order
к устройству хранения данных 2
.
Когда ссылочный Order
прибывает в устройство хранения данных 2
, его данные об атрибуте зарегистрированы как ссылочное значение, и сущность уничтожается.
Прибытие Order
вызывает событие итерации в устройстве хранения данных 1
, чтобы искать данные о переносе Item
, которые равны ссылочному значению.
Если соответствие найдено, соответствующий элемент передается выходному порту 1
и концы итерации.
Если соответствие не найдено, новый Item
сгенерирован в устройстве хранения данных 1
с соответствующим значением атрибута и передан выходному порту 1
.
См. код, чтобы сгенерировать пользовательский блок системы хранения с несколькими устройствами хранения данных
Переменная InputKey
дискретного состояния представляет записанное ссылочное значение от Order
, который используется, чтобы выбрать соответствующий Item
.
properties (DiscreteState)
InputKey;
end
Блок имеет два устройства хранения данных с поведением FIFO. Устройство хранения данных 1
поддерживает сущности с типом Item
и устройство хранения данных 2
, поддерживает сущности с типом Order
. Блок имеет два входных порта и один выходной порт. Входной порт 1
и выходной порт 1
соединяется с устройством хранения данных 1
. Входной порт 2
соединяется с устройством хранения данных 2
. Для получения дополнительной информации об объявлении портов и устройств хранения данных, смотрите Реализацию Объект Дискретной Системы событий с Блоком Дискретной Системы событий MATLAB.
function num = getNumInputsImpl(~) num = 2; end function num = getNumOutputsImpl(~) num = 1; end function [entityTypes] = getEntityTypesImpl(obj) entityTypes = [obj.entityType('Item'), ... obj.entityType('Order')]; end function [inputTypes, outputTypes] = getEntityPortsImpl(~) inputTypes = {'Item' 'Order'}; outputTypes = {'Order'}; end function [storageSpecs, I, O] = getEntityStorageImpl(obj) storageSpecs = [obj.queueFIFO('Item', obj.capacity)... obj.queueFIFO('Order', obj.capacity)]; I = [1 2]; O = 1; end
Задайте дискретное состояние и сбросьте InputKey
состояния. Для получения дополнительной информации о состояниях в дискретных системах событий, смотрите Пользовательский Блок Генератора Сущности с Входом Сигнала.
function [sz, dt, cp] = getDiscreteStateSpecificationImpl(obj, name) sz = 1; dt = 'double'; cp = false; end function resetImpl(obj) obj.InputKey = 0; end
Когда Order
прибывает в устройство хранения данных 2, его данные, Key
зарегистрирован в переменной Obj.InputKey
дискретного состояния. Эта запись также вызывает событие итерации в устройстве хранения данных 1
и другое событие, чтобы уничтожить Order
.
function [Order, events] = OrderEntry(obj, storage, Order, source) % A key entity has arrived; record the Inputkey value. obj.InputKey = Order.data.Key; % Schedule an iteration of the entities in storage 1. % Destroy input key entity. events = [obj.eventIterate(1, '') ... obj.eventDestroy()]; coder.extrinsic('fprintf'); fprintf('Order Key Value: %f\n', Order.data.Key); end
Цель итерации состоит в том, чтобы найти элементы с данными, которые совпадают с InputKey
.
function [Item,events,continueIter] = ItemIterate(obj,... storage, Item, tag, cur) % Find entities with matching key. events = obj.initEventArray; continueIter = true; if (Item.data.Attribute1 == obj.InputKey) events = obj.eventForward('output', 1, 0.0); % If a match is found, the iteration ends and the state is reset. continueIter = false; elseif cur.size == cur.position % If a match is not found, this invokes an entity generation event. events = obj.eventGenerate(1,'mygen',0.0,100); end end
Сгенерируйте сущность с типом entity1
и соответствующее значение Key
. Затем передайте сгенерированную сущность выходному порту 1
.
function [Item,events] = ItemGenerate(obj,storage,Item,tag) % Specify event actions when entity generated in the storage. Item.data.Attribute1 = obj.InputKey; events = obj.eventForward('output',1,0.0); end
Сохраните файл .m
как CustomBlockTwoEntityStorages
. Соедините Системный объект с моделью SimEvents® использование блока MATLAB Discrete-Event System. Для получения дополнительной информации о соединении, смотрите, Создают Авторские блоки Используя Блок Дискретной Системы событий MATLAB.
Создайте модель SimEvents включая блок MATLAB Discrete-Event System, два блока Генератора Сущности и блок Entity Terminator. Соедините блоки как показано в модели.
В блоке Entity Generator:
Во вкладке Entity generation, набор Generate entity at simulation start к off
.
Во вкладке Entity type, набор Entity type name как Item
.
Во вкладке Event Actions в Generate action field войдите:
entity.Attribute1 = randi([1 3]);
По умолчанию сущности сгенерированы со временем межгенерации, 1
и их значение Attribute1
являются случайным целым числом между 1
и 3
.
Во вкладке Statistics, вывод статистическая величина Number of entities departed, d и подключение это к осциллографу.
В блоке Entity Generator1:
Во вкладке Entity generation, набор Generate entity at simulation start к off
и набор Period к 5
.
Во вкладке Entity type, набор Entity type name как Order
и Attribute Name как Key
.
Во вкладке Event Actions в Generate action field войдите:
entity.Key = randi([1 4]);
Сущности с типом, Order
сгенерирован со временем межгенерации 5
и атрибут Key
, принимают целочисленные значения между 1
и 4
.
Нет никакого возможного соответствия между Key
и Attribute1
, когда значением Key
является 4
, потому что Attribute1
может принять значение 1
, 2
или 3
.
В блоке Entity Terminator, вывод статистическая величина Number of entities arrived, a и подключение это к осциллографу.
Щелкните правой кнопкой по пути сущности от блока MATLAB Discrete-Event System до блока Entity Terminator и выберите Log Selected Signals.
Увеличьте время симуляции до 50
и моделируйте модель. Заметьте что:
Сущности 50
с типом Entity1
вводят устройство хранения данных 1 в блок.
В Диагностическом Средстве просмотра наблюдайте входящие значения ссылки Key
, которые несут сущности 10
, которые вводят устройство хранения данных 2 и уничтожаются позже.
Инспектор Данных моделирования показывает элементы отъезда и их значения Attribute1
. Значения совпадают со значениями Key
, отображенными в Диагностическом Средстве просмотра.
Также наблюдайте сущности 5
, отбывающие со значением Attribute1
4
. Эти сущности сгенерированы в устройстве хранения данных 2, потому что Attribute1
не может иметь значения 4
для сущностей, сгенерированных блоком Entity Generator.
entry
| generate
| getEntityPortsImpl
| getEntityStorageImpl
| iterate
| matlab.DiscreteEventSystem
| matlab.System