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