В этом примере показано, как создать пользовательский исходный блок, который генерирует объекты, и управлять дискретными состояниями при реализации методов discreter-event 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около-12 вектор. Тип данных: double и принимает реальные значения.
Создание материалов с периодом, приоритетом и данными между поколениями, определенными следующим образом:
Параметр obj.period, объявлен как общедоступный параметр, который может быть изменен из диалогового окна блока.
Параметр obj.priority значения, определяемые сигналом от входного порта.
Параметр obj.value, a 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 assigned priority value. out1 = obj.priority; events = [obj.eventForward('output',1,0) ... obj.eventGenerate(1,'mygen',obj.period,obj.priority)]; end
Сохранить .m файл как CustomEntityStorageBlockGeneration. Свяжите объект System с моделью SimEvents ® с помощью блока MATLAB Discrete-Event System. Дополнительные сведения о связывании см. в разделе Создание пользовательских блоков с помощью системного блока дискретных событий MATLAB.
Создайте модель SimEvents, которая включает блок MATLAB Discrete-Event System, блок Ramp, блок Entity Terminator и два блока Scope. Соедините блоки, как показано в модели.

В блоке «Пандус» задайте для параметра «Уклон» значение 5 и Начальный выход в 10.
В блоке Терминатор объекта (Entity Terminator) можно отобразить значения приоритета объектов, поступающих в блок, в поле Действие ввода (Entry action) введите этот код.
coder.extrinsic('fprintf'); fprintf('Priority: %d\n', double(entitySys.priority))
Щелкните правой кнопкой мыши путь к объекту от пользовательского генератора объектов до терминатора объектов и выберите параметр «Регистрировать выбранные сигналы».
Моделирование модели.
Обратите внимание на выходные данные блока Ramp. Например, выходное значение становится 15, 20, 25, и 30 для времени моделирования 1, 2, 3, и 4соответственно.

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

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

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