Создайте пользовательский блок с несколькими устройствами хранения данных

В этом примере показано, как создать пользовательский блок с несколькими устройствами хранения данных и управлять поведением устройства хранения данных с помощью дискретной системы событий object™ методы.

Предположим, что вы управляете средством, которое производит элементы для потребительских заказов. Чтобы подготовиться к повторяющимся порядкам, средство производит предоставление элементов, прежде чем порядки прибудут. Когда новый порядок прибывает, запасы проверяются на доступность.

  • Если элемент найден в устройстве хранения данных, он отбывает из средства, чтобы выполнить порядок.

  • Если элемент не найден в устройстве хранения данных, новый элемент производится, и сгенерированный элемент отбывает из средства, чтобы выполнить порядок.

Чтобы сгенерировать это пользовательское поведение, вы управляете несколькими устройствами хранения данных через объект дискретной системы событий, созданное использование matlab.DiscreteEventSystem методы. Чтобы наблюдать поведение пользовательского блока, смотрите CustomEntityStorageBlockWithTwoStoragesExample.

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

Сгенерируйте пользовательский блок системы хранения сущности с двумя входными параметрами, одним выходом и двумя запоминающими элементами.

Желаемое поведение пользовательского блока должно выбрать и вывести сущности на основе ссылочной сущности.

  1. Input port 1 принимает сущности с типом Item к устройству хранения данных 1.

  2. Input port 2 принимает ссылочные сущности с типом Order к устройству хранения данных 2.

  3. Когда ссылочный Order прибывает в устройство хранения данных 2, ее данные об атрибуте зарегистрированы как ссылочное значение, и сущность уничтожается.

  4. Order прибытие вызывает событие итерации в устройстве хранения данных 1 искать Item перенос данных, которые равны ссылочному значению.

  5. Если соответствие найдено, соответствующий элемент передается выходному порту 1 и концы итерации.

  6. Если соответствие не найдено, новый Item сгенерирован в устройстве хранения данных 1 с соответствующим значением атрибута и переданный выходному порту 1.

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

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

  1. Переменная InputKey дискретного состояния представляет записанное ссылочное значение от Order, который используется, чтобы выбрать соответствующий Item.

        properties (DiscreteState)
            InputKey;
        end
  2. Блок имеет два устройства хранения данных с поведением FIFO. Устройство хранения данных 1 сущности поддержек с типом Item, и устройство хранения данных 2 сущности поддержек с типом Order. Блок имеет два входных порта и один выходной порт. Input port 1 и выходной порт 1 соединяются с устройством хранения данных 1. Input port 2 соединяется с устройством хранения данных 2. Для получения дополнительной информации об объявлении портов и устройств хранения данных, смотрите Реализацию Объект Дискретной Системы событий с Блоком Дискретной Системы событий MATLAB.

        function num = getNumInputsImpl(~)
            num = 2;
        end
                
        function num = getNumOutputsImpl(~)
            num = 1;
        end
          
        function [entityTypes] = getEntityTypesImpl(obj)
            entityTypes = [obj.entityType('Item'), ...
                            obj.entityType('Order')];
        end
            
        function [inputTypes, outputTypes] = getEntityPortsImpl(~)
            inputTypes = {'Item' 'Order'};
            outputTypes = {'Order'};
        end
            
        function [storageSpecs, I, O] = getEntityStorageImpl(obj)
            storageSpecs = [obj.queueFIFO('Item', obj.capacity)...
                obj.queueFIFO('Order', obj.capacity)];
                I = [1 2];
                O = 1;
        end
  3. Задайте дискретное состояние и сбросьте InputKey состояния. Для получения дополнительной информации о состояниях в дискретных системах событий, смотрите Пользовательский Блок Генератора Сущности с Входом Сигнала.

        function [sz, dt, cp] = getDiscreteStateSpecificationImpl(obj, name)
            sz = 1;
            dt = 'double';
            cp = false;
        end  
        
        function resetImpl(obj)
            obj.InputKey = 0;
        end
  4. Когда Order прибывает в устройство хранения данных 2, его данные Key зарегистрирован в переменной Obj.InputKey дискретного состояния. Эта запись также вызывает событие итерации в устройстве хранения данных 1 и другое событие, чтобы уничтожить Order.

        function [Order, events] = OrderEntry(obj, storage, Order, source)
            % A key entity has arrived; record the Inputkey value.
            obj.InputKey = Order.data.Key;
            % Schedule an iteration of the entities in storage 1.
            % Destroy input key entity.
            events = [obj.eventIterate(1, '') ...   
                      obj.eventDestroy()];         
            coder.extrinsic('fprintf');      
            fprintf('Order Key Value: %f\n', Order.data.Key);
        end
  5. Цель итерации состоит в том, чтобы найти элементы с данными, которые совпадают с InputKey.

        function [Item,events,continueIter] = ItemIterate(obj,...
                                                       storage, Item, tag, cur)
            % Find entities with matching key.
            events = obj.initEventArray;
            continueIter = true;
    
            if (Item.data.Attribute1 == obj.InputKey)
                events = obj.eventForward('output', 1, 0.0);
                % If a match is found, the iteration ends and the state is reset.
                continueIter = false;
    
            elseif cur.size == cur.position
                % If a match is not found, this invokes an entity generation event.
                events = obj.eventGenerate(1,'mygen',0.0,100);
            end
        end

  6. Сгенерируйте сущность с типом entity1 и соответствующий Key значение. Затем передайте сгенерированную сущность выходному порту 1.

        function [Item,events] = ItemGenerate(obj,storage,Item,tag)            
            % Specify event actions when entity generated in the storage.            
            Item.data.Attribute1 = obj.InputKey;   
            events = obj.eventForward('output',1,0.0);
        end

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

  1. Сохраните .m файл как CustomBlockTwoEntityStorages. Соедините Системный объект с моделью SimEvents® использование блока MATLAB Discrete-Event System. Для получения дополнительной информации о соединении, смотрите, Создают Пользовательские блоки Используя Блок Дискретной Системы событий MATLAB.

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

  3. В блоке Entity Generator:

    1. Во вкладке Entity generation, набор Generate entity at simulation start к off.

    2. Во вкладке Entity type, набор Entity type name как Item.

    3. Во вкладке Event Actions в Generate action field войдите:

      entity.Attribute1 = randi([1 3]);

      По умолчанию сущности сгенерированы со временем межгенерации 1 и их Attribute1 значение является случайным целым числом между 1 и 3.

    4. Во вкладке Statistics, выход статистическая величина Number of entities departed, d и подключение это к осциллографу.

  4. В блоке Entity Generator1:

    1. Во вкладке Entity generation, набор Generate entity at simulation start к off, и набор Period к 5.

    2. Во вкладке Entity type, набор Entity type name как Order и Attribute Name как Key.

    3. Во вкладке Event Actions в Generate action field войдите:

      entity.Key = randi([1 4]);

    Сущности с типом Order сгенерированы со временем межгенерации 5, и Key атрибут принимает целочисленные значения между 1 и 4.

    Между Key нет никакого возможного соответствия и Attribute1 когда Key значением является 4 потому что Attribute1 может принять значение 1, 2, или 3.

  5. В блоке Entity Terminator, выход статистическая величина Number of entities arrived, a и подключение это к осциллографу.

  6. Щелкните правой кнопкой по пути сущности от блока MATLAB Discrete-Event System до блока Entity Terminator и выберите Log Selected Signals.

  7. Увеличьте время симуляции до 50 и симулируйте модель. Заметьте что:

    1. 50 сущности с типом Entity1 введите устройство хранения данных 1 в блок.

    2. В Диагностическом Средстве просмотра наблюдайте входящий Key ссылочные значения несет 10 сущности, которые вводят устройство хранения данных 2 и уничтожаются позже.

    3. Инспектор Данных моделирования показывает элементы отъезда и их Attribute1 значения. Значения совпадают с Key значения отображены в Диагностическом Средстве просмотра.

      Также наблюдайте 5 сущности, отбывающие с Attribute1 значение 4. Эти сущности сгенерированы в устройстве хранения данных 2 потому что Attribute1 не может иметь значения 4 для сущностей, сгенерированных блоком Entity Generator.

Смотрите также

| | | | | |

Похожие темы