В этом примере показано, как создать пользовательский исходный блок, который генерирует сущности и управляет дискретными состояниями при реализации методов System object™ с дискретным событием.
Предположим, что вы управляете объектом, который производит сырье с фиксированной детерминированной скоростью. Материалы содержат 12-значный штриховой код для управления запасами и значения приоритетов для определения приоритетов порядков. Чтобы представлять это поведение, этот пример показывает, как сгенерировать пользовательский блок хранения сущности сгенерирован с одним входным портом сигнала, одним выходным портом сущности, одним выходным портом сигнала и одним элементом памяти. Блок генерирует сущности с различными значениями приоритета. Сущности несут данные и отходят от блока из его выхода порта. Значения приоритета сущности получают из значений входного сигнала.
Чтобы открыть модель и наблюдать за поведением пользовательского блока, смотрите CustomEntityGeneratorBlockExample.

Блок определяется как пользовательский блок генератора сущностей, который генерирует сущности с заданными периодами межгенерации. Сгенерированные сущности несут данные, и их значения приоритета определяются значениями входного сигнала.
Смотрите код для создания пользовательского блока генератора сущностей
Определите время между поколениями материалов.
% Nontunable properties properties (Nontunable) % Generation period period = 1; end
Инициализируйте переменные дискретного состояния.
function resetImpl(obj) % Initialize / reset discrete-state properties. obj.priority = 10; obj.value = 1:12; end
Переменная priority представляет материальный приоритет и value представляет штриховый код данных, переносимых материалами.
Инициализируйте выход для исходного блока.
function num = getNumOutputsImpl(~) % Define total number of outputs. num = 2; end function [out1 out2] = getOutputSizeImpl(obj) % Return size for each output port. out1 = [1 12]; out2 = 1; end function [out1 out2] = getOutputDataTypeImpl(obj) % Return data type for each output port. out1 = "double"; out2 = "double"; end function [out1 out2] = isOutputComplexImpl(obj) % Return true for each output port with complex data. out1 = false; out2 = false; end
Первая функция объявляет размер выхода.
Вторая функция объявляет, что типы данных выходного порта double.
Третья функция объявляет false для выходных портов, поскольку они не поддерживают комплексные данные.
Объявите размер, данные и сложность дискретных состояний.
function [sz,dt,cp] = getDiscreteStateSpecificationImpl(obj,name) % Return size, data type, and complexity of discrete-state. switch name case 'priority' sz = [1 1]; case 'value' sz = [1 12]; end dt = "double"; cp = false; end
Дискретное состояние priority скаляром. Тип данных double и принимает реальные значения.
Дискретное состояние value является 1-by- 12 вектор. Тип данных double и принимает реальные значения.
Сгенерируйте материалы с периодом межгенерации, приоритетом и данными, определяемыми:
Значение параметра obj.period, объявленный как общедоступный параметр, который можно изменить из диалогового окна блока.
Значение параметра obj.priority значения, заданные сигналом от порта входа.
Значение параметра obj.value, а 1-by- 12 вектор, который представляет данные, переносимые сущностями.
function events = setupEvents(obj) % Set up entity generation event for storage 1 at simulation start. events = obj.eventGenerate(1,'mygen',obj.period,obj.priority); % Set up the initial value of the output signal. out1 = 10; end function [entity,events,out1] = generate(obj,storage,entity,tag,in1) % Specify event actions when entity is generated in storage. entity.data = obj.value; % The value from the signal is assigned to the entity priority. obj.priority = in1; % Output signal is the assigned priority value. out1 = obj.priority; events = [obj.eventForward('output',1,0) ... obj.eventGenerate(1,'mygen',obj.period,obj.priority)]; end
Сохраните .m файл как CustomEntityStorageBlockGeneration. Связать системный объект с SimEvents® моделировать при помощи блока MATLAB Discrete-Event System. Дополнительные сведения о связывании см. в разделе Создание пользовательских блоков с использованием системного блока MATLAB Discrete-Event.
Создайте модель SimEvents, которая включает в себя блок MATLAB Discrete-Event System, блок Ramp, блок Entity Terminator и два блока Scope. Соедините блоки как показано на модели.

В блоке Ramp установите Slope равным 5 и Initial output к 10.
В блоке Entity Terminator можно отобразить значения приоритета сущностей, поступающих в блок, в Entry action поле введите этот код.
coder.extrinsic('fprintf'); fprintf('Priority: %d\n', double(entitySys.priority))
Щелкните правой кнопкой мыши путь к сущности из пользовательского Entity Generator в Entity Terminator и выберите Log Selected Signals.
Симулируйте модель.
Наблюдайте выход блока Ramp. Для образца значение выхода становится 15, 20, 25, и 30 для времени симуляции 1, 2, 3, и 4, соответственно.

Инспектор Данных моделирования показывает, что сущности передаются в блок Entity Terminator с данными размера 1 на 12.

Можно также наблюдать значения приоритета из возможностей, помеченного как Приоритет объекта для времени генерации 1, 2, 3, 4, 5, 6, 7, 8, 9, и 10.

entry | generate | getEntityPortsImpl | getEntityStorageImpl | matlab.DiscreteEventSystem | matlab.System