В этом примере показано, как создать пользовательский блок с несколькими устройствами хранения данных и управлять поведением устройства хранения данных с помощью дискретной системы событий object™ методы.
Предположим, что вы управляете средством, которое производит элементы для потребительских заказов. Чтобы подготовиться к повторяющимся порядкам, средство производит предоставление элементов, прежде чем порядки прибудут. Когда новый порядок прибывает, запасы проверяются на доступность.
Если элемент найден в устройстве хранения данных, он отбывает из средства, чтобы выполнить порядок.
Если элемент не найден в устройстве хранения данных, новый элемент производится, и сгенерированный элемент отбывает из средства, чтобы выполнить порядок.
Чтобы сгенерировать это пользовательское поведение, вы управляете несколькими устройствами хранения данных через объект дискретной системы событий, созданное использование matlab.DiscreteEventSystem
методы. Чтобы наблюдать поведение пользовательского блока, смотрите CustomEntityStorageBlockWithTwoStoragesExample
.
Сгенерируйте пользовательский блок системы хранения сущности с двумя входными параметрами, одним выходом и двумя запоминающими элементами.
Желаемое поведение пользовательского блока должно выбрать и вывести сущности на основе ссылочной сущности.
Input port 1
принимает сущности с типом Item
к устройству хранения данных 1
.
Input port 2
принимает ссылочные сущности с типом Order
к устройству хранения данных 2
.
Когда ссылочный Order
прибывает в устройство хранения данных 2
, ее данные об атрибуте зарегистрированы как ссылочное значение, и сущность уничтожается.
Order
прибытие вызывает событие итерации в устройстве хранения данных 1
искать Item
перенос данных, которые равны ссылочному значению.
Если соответствие найдено, соответствующий элемент передается выходному порту 1
и концы итерации.
Если соответствие не найдено, новый Item
сгенерирован в устройстве хранения данных 1
с соответствующим значением атрибута и переданный выходному порту 1
.
См. код, чтобы сгенерировать пользовательский блок системы хранения с несколькими устройствами хранения данных
Переменная InputKey
дискретного состояния представляет записанное ссылочное значение от
Order
, который используется, чтобы выбрать соответствующий Item
.
properties (DiscreteState)
InputKey;
end
Блок имеет два устройства хранения данных с поведением FIFO. Устройство хранения данных 1
сущности поддержек с типом Item
, и устройство хранения данных 2
сущности поддержек с типом Order
. Блок имеет два входных порта и один выходной порт. Input port 1
и выходной порт 1
соединяются с устройством хранения данных 1
. Input port 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 Generator и блок 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