В этом примере показано, как создать пользовательский блок с несколькими хранилищами и управлять поведением хранилища с помощью методов 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. Свяжите объект System с моделью SimEvents ® с помощью блока MATLAB Discrete-Event System. Дополнительные сведения о связывании см. в разделе Создание пользовательских блоков с помощью системного блока дискретных событий MATLAB.
Создайте модель SimEvents, включающую блок системы дискретных событий MATLAB, два блока генератора объектов и блок терминатора объектов. Соедините блоки, как показано в модели.

В блоке «Генератор объектов»:
На вкладке Создание объекта (Entity generation) задайте для параметра Генерировать объект в начале моделирования (Generate entity at simulation start) значение off.
На вкладке Тип объекта задайте имя типа объекта как Item.
На закладке Действия с событиями в поле Создать действие введите:
entity.Attribute1 = randi([1 3]);
По умолчанию объекты создаются со временем между поколениями. 1 и их Attribute1 значение является случайным целым числом между 1 и 3.
На вкладке Статистика (Statistics) выведите статистику Количество отклоненных объектов (Number of entities departed), d и подключите ее к области.
В блоке Generator1 объектов:
На вкладке Создание объекта (Entity generation) задайте значение Генерировать объект в начале моделирования (Generate entity at simulation start) offи установите для параметра «Период» значение 5.
На вкладке Тип объекта задайте имя типа объекта как Order и наименование атрибута как Key.
На закладке Действия с событиями в поле Создать действие введите:
entity.Key = randi([1 4]);
Объекты с типом Order генерируются со временем между поколениями 5, и Key атрибут принимает целочисленные значения между 1 и 4.
Нет возможного совпадения между Key и Attribute1 когда Key значение равно 4 потому что Attribute1 может принимать значение 1, 2, или 3.
В блоке Терминатор сущности (Entity Terminator) выведите Число полученных сущностей (Number of entities incompended), статистику и подключите ее к области.
Щелкните правой кнопкой мыши путь к объекту от блока Система дискретных событий MATLAB до блока Терминатор объекта и выберите Зарегистрировать выбранные сигналы.
Увеличение времени моделирования до 50 и смоделировать модель. Обратите внимание, что:
50 объекты с типом Entity1 введите хранилище 1 в блоке.

В программе Diagnostic Viewer просмотрите входящие Key ссылочные значения, переносимые 10 объекты, которые поступают в хранилище 2 и затем уничтожаются.

Инспектор данных моделирования показывает вылетающие элементы и их Attribute1 значения. Значения соответствуют Key значения, отображаемые в средстве просмотра диагностики.

Также наблюдать 5 объекты, отправляемые с Attribute1 стоимость 4. Эти объекты создаются в хранилище 2, так как Attribute1 не может иметь значение 4 для объектов, созданных блоком «Генератор объектов».
entry | generate | getEntityPortsImpl | getEntityStorageImpl | iterate | matlab.DiscreteEventSystem | matlab.System