В этом примере показано, как создать пользовательский исходный блок, который генерирует сущности и управлять дискретными состояниями при реализации дискретной системы событий 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 isscalar. Типом данных является double и принимает действительные значения.
Дискретное состояние value 1- 12 вектор. Типом данных является double и принимает действительные значения.
Сгенерируйте материалы с периодом межгенерации, приоритетом и данными, заданными:
Параметр obj.period, объявленный как общедоступный параметр, который может быть изменен от диалогового окна блока.
Параметр obj.priority значения, заданные сигналом от входного порта.
Параметр obj.value, 1- 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 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.
Создайте модель SimEvents, которая включает блок MATLAB Discrete-Event System, блок Ramp, блок Entity Terminator и два блока Осциллографа. Соедините блоки как показано в модели.

В блоке 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.

Можно также заметить, что приоритетные значения от осциллографа пометили Entity Priority в течение времен генерации 1, 2,3, 4, 5, 6, 7, 8, 9, и 10.

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