В этом примере показано, как создать пользовательский исходный блок, который генерирует сущности и управлять дискретными состояниями при реализации дискретной системы событий 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