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

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

  5. Сгенерируйте материалы с периодом межгенерации, приоритетом и данными, определяемыми:

    • Значение параметра 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

Реализуйте пользовательский блок

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

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

  3. В блоке Ramp установите Slope равным 5 и Initial output к 10.

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

    coder.extrinsic('fprintf');
    fprintf('Priority: %d\n', double(entitySys.priority))
  5. Щелкните правой кнопкой мыши путь к сущности из пользовательского Entity Generator в Entity Terminator и выберите Log Selected Signals.

  6. Симулируйте модель.

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

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

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

См. также

| | | | |

Похожие темы