exponenta event banner

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

В этом примере показано, как создать пользовательский блок с несколькими хранилищами и управлять поведением хранилища с помощью методов 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. Свяжите объект System с моделью SimEvents ® с помощью блока MATLAB Discrete-Event System. Дополнительные сведения о связывании см. в разделе Создание пользовательских блоков с помощью системного блока дискретных событий MATLAB.

  2. Создайте модель SimEvents, включающую блок системы дискретных событий MATLAB, два блока генератора объектов и блок терминатора объектов. Соедините блоки, как показано в модели.

  3. В блоке «Генератор объектов»:

    1. На вкладке Создание объекта (Entity generation) задайте для параметра Генерировать объект в начале моделирования (Generate entity at simulation start) значение off.

    2. На вкладке Тип объекта задайте имя типа объекта как Item.

    3. На закладке Действия с событиями в поле Создать действие введите:

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

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

    4. На вкладке Статистика (Statistics) выведите статистику Количество отклоненных объектов (Number of entities departed), d и подключите ее к области.

  4. В блоке Generator1 объектов:

    1. На вкладке Создание объекта (Entity generation) задайте значение Генерировать объект в начале моделирования (Generate entity at simulation start) offи установите для параметра «Период» значение 5.

    2. На вкладке Тип объекта задайте имя типа объекта как Order и наименование атрибута как Key.

    3. На закладке Действия с событиями в поле Создать действие введите:

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

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

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

  5. В блоке Терминатор сущности (Entity Terminator) выведите Число полученных сущностей (Number of entities incompended), статистику и подключите ее к области.

  6. Щелкните правой кнопкой мыши путь к объекту от блока Система дискретных событий MATLAB до блока Терминатор объекта и выберите Зарегистрировать выбранные сигналы.

  7. Увеличение времени моделирования до 50 и смоделировать модель. Обратите внимание, что:

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

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

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

      Также наблюдать 5 объекты, отправляемые с Attribute1 стоимость 4. Эти объекты создаются в хранилище 2, так как Attribute1 не может иметь значение 4 для объектов, созданных блоком «Генератор объектов».

См. также

| | | | | |

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