В этом примере показано, как создать пользовательский блок с несколькими хранилищами и управлять поведением хранилища с помощью методов System object™ с дискретными событиями.
Предположим, что вы управляете средством, которое производит элементы для порядков клиента. Для подготовки к повторяющимся порядкам объект производит поставку элементов до поступления порядков. При поступлении нового порядка запасы проверяются на наличие.
Если элемент находится на складе, она отходит от объекта для выполнения порядка.
Если элемент не найден на складе, создаётся новый элемент, и сгенерированный элемент покидает объект для выполнения порядка.
Чтобы сгенерировать это пользовательское поведение, вы манипулируете несколькими хранилищами через Системный объект дискретных событий, созданную с помощью matlab.DiscreteEventSystem
методы. Чтобы наблюдать за поведением пользовательского блока, смотрите CustomEntityStorageBlockWithTwoStoragesExample
.
Сгенерируйте пользовательский блок хранения сущностей с двумя входами, одним выходом и двумя элементами хранения.
Желаемым поведением пользовательского блока является выбор и вывод сущностей на основе ссылки сущности.
Input port 1
принимает сущности с типом Item
в хранилище 1
.
Input port 2
принимает ссылочные сущности с типом Order
в хранилище 2
.
Когда ссылка Order
поступает в хранилище 2
его атрибутные данные записываются как ссылочное значение, и сущность уничтожается.
The 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 Discrete-Event.
Создайте модель 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.
В Diagnostic Viewer наблюдайте за входящим Key
ссылочные значения, переносимые 10
сущности, которые заходят в хранилище 2 и затем уничтожаются.
Инспектор Данных моделирования показывает отправляющиеся предметы и их Attribute1
значения. Значения соответствуют Key
значения, отображаемые в Средство Просмотра.
Также наблюдайте 5
сущности, отделяющиеся от Attribute1
значение 4
. Эти сущности генерируются в хранилище 2 из-за Attribute1
не может иметь значения 4
для сущностей, сгенерированной блоком Entity Generator.
entry
| generate
| getEntityPortsImpl
| getEntityStorageImpl
| iterate
| matlab.DiscreteEventSystem
| matlab.System