exponenta event banner

Блок генератора пользовательских объектов с сигнальным входом и сигнальным выходом

В этом примере показано, как создать пользовательский исходный блок, который генерирует объекты, и управлять дискретными состояниями при реализации методов discreter-event System object™.

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

Сведения об открытии модели и наблюдении за поведением пользовательского блока см. в разделе CustomEntityGeneratorBlockExample.

Создание системного объекта дискретного события

Блок определяется как пользовательский блок генератора объектов, который генерирует объекты с указанными периодами между поколениями. Сформированные объекты несут данные, и их значения приоритета определяются значениями входного сигнала.

 См. раздел Код для создания блока генератора пользовательских объектов

Поведение пользовательского блока

  1. Определите время между генерациями материала.

        % Nontunable properties 
        properties (Nontunable)
            % Generation period
            period = 1;
        end
  2. Инициализируйте дискретные переменные состояния.

        function resetImpl(obj)
            % Initialize / reset discrete-state properties.
            obj.priority = 10;
            obj.value = 1:12;            
        end
    

    Переменная priority представляет приоритет материала и value представляет данные штрихового кода, переносимые материалами.

  3. Инициализируйте вывод для исходного блока.

        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 для выходных портов, поскольку они не поддерживают сложные данные.

  4. Объявите размер, данные и сложность дискретных состояний.

        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 и принимает реальные значения.

  5. Создание материалов с периодом, приоритетом и данными между поколениями, определенными следующим образом:

    • Параметр 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

Внедрение пользовательского блока

  1. Сохранить .m файл как CustomEntityStorageBlockGeneration. Свяжите объект System с моделью SimEvents ® с помощью блока MATLAB Discrete-Event System. Дополнительные сведения о связывании см. в разделе Создание пользовательских блоков с помощью системного блока дискретных событий MATLAB.

  2. Создайте модель SimEvents, которая включает блок MATLAB Discrete-Event System, блок Ramp, блок Entity Terminator и два блока Scope. Соедините блоки, как показано в модели.

  3. В блоке «Пандус» задайте для параметра «Уклон» значение 5 и Начальный выход в 10.

  4. В блоке Терминатор объекта (Entity Terminator) можно отобразить значения приоритета объектов, поступающих в блок, в поле Действие ввода (Entry action) введите этот код.

    coder.extrinsic('fprintf');
    fprintf('Priority: %d\n', double(entitySys.priority))
  5. Щелкните правой кнопкой мыши путь к объекту от пользовательского генератора объектов до терминатора объектов и выберите параметр «Регистрировать выбранные сигналы».

  6. Моделирование модели.

    1. Обратите внимание на выходные данные блока Ramp. Например, выходное значение становится 15, 20, 25, и 30 для времени моделирования 1, 2, 3, и 4соответственно.

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

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

См. также

| | | | |

Связанные темы