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

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

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

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

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

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

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

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

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

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

  2. Входной порт 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. Блок имеет два входных порта и один выходной порт. Входной порт 1 и выходной порт 1 соединяется с устройством хранения данных 1. Входной порт 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 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.

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

| | | | | |

Похожие темы