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

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

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

  • Если элемент находится на складе, она отходит от объекта для выполнения порядка.

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

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

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

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

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

  1. Input port 1 принимает сущности с типом Item в хранилище 1.

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

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

  4. The 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 Discrete-Event.

  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. В Diagnostic Viewer наблюдайте за входящим Key ссылочные значения, переносимые 10 сущности, которые заходят в хранилище 2 и затем уничтожаются.

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

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

См. также

| | | | | |

Похожие темы

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