Спецификация интерфейса с использованием объектов шины

В этом примере показов, как распространить шины на ссылочные модели. Это также показывает, как можно симулировать модели-ссылки независимо с помощью записанных данных сигнала от родительской модели.

Откройте модель примера

Откройте и симулируйте пример модели sldemo_mdlref_bus.

Исследуйте модель

Модель содержит блок Model с именем CounterA, который ссылается sldemo_mdlref_counter_bus, которая является моделью простого счетчика.

Массив шин с именем COUNTERBUS подает данные и пределы насыщения счетчика в модель. Каждый из шин с именем COUNTERBUS содержит два элемента: сигнал данных и вложенную шину с именем LIMITBUS. Данные используются в подсчете, и LIMITBUS содержит верхнее и нижнее предельные значения счетчика.

Блок Model имеет второй входной порт, который соединяется с шиной с именем INCREMENTBUS. Эта шина содержит элементы, которые изменяют шаг и сбрасывают счетчик.

Модель использует файл словаря данных с именем sldemo_mdlref_bus.sldd который содержит Simulink.Bus объекты, которые определяют элементы COUNTERBUS, LIMITBUS и INCREMENTBUS.

Чтобы просмотреть Bus откройте Редактор шин. В Simulink ® Toolstrip, на вкладке « Моделировании», в галерее Design, нажмите Bus Editor.

Модель использует Bus объекты для задания выходов следующих блоков Bus Creator:

  • COUNTERBUSCreator1

  • COUNTERBUSCreator2

  • LIMITBUSCreator1

  • LIMITBUSCreator2

  • IncrementBusCreator

Блок Inport с именем counter_input in sldemo_mdlref_counter_bus задает Bus объект с именем COUNTERBUS. Дважды кликните блок. В диалоговом окне Параметров блоков, на вкладке Signal Attributes, Тип данных устанавливается на Bus: COUNTERBUS.

Блок Inport с именем increment_input аналогично сконфигурирован, чтобы использовать Bus объект с именем INCREMENTBUS.

Журнал данных сигнала

Эти сигналы отмечены для логгирования сигналов:

  • ПРОТИВОАВТОБУС

  • INCREMENTBUS

  • OUTERDATA

  • INNERDATA

После моделирования модели записанные сигналы доступны в базовом рабочем пространстве в topOut переменная.

topOut = 

Simulink.SimulationData.Dataset 'topOut' with 4 elements

                         Name          BlockPath                                
                         ____________  ________________________________________ 
    1  [1x1 Signal]      COUNTERBUS    sldemo_mdlref_bus/Concatenate           
    2  [1x1 Signal]      OUTERDATA     sldemo_mdlref_bus/CounterA              
    3  [1x1 Signal]      INCREMENTBUS  sldemo_mdlref_bus/IncrementBusCreator   
    4  [1x1 Signal]      INNERDATA     ...erA|sldemo_mdlref_counter_bus/COUNTER

  - Use braces { } to access, modify, or add elements using index.

Модель использует Dataset формат для логгирования сигналов. Для доступа к Dataset форматировать записанные данные для заданного сигнала, используйте getElement метод:

topOut.getElement('COUNTERBUS')
ans = 

  Simulink.SimulationData.Signal
  Package: Simulink.SimulationData

  Properties:
              Name: 'COUNTERBUS'
    PropagatedName: ''
         BlockPath: [1x1 Simulink.SimulationData.BlockPath]
          PortType: 'outport'
         PortIndex: 1
            Values: [2x1 struct]

Данные шины регистрируются как структура MATLAB ® в Values поле:

topOut.getElement('COUNTERBUS').Values
ans = 

  2x1 struct array with fields:

    data
    limits

Эта структура содержит MATLAB timeseries объекты для каждой шины:

topOut.getElement('COUNTERBUS').Values(1).data
  timeseries

  Common Properties:
            Name: 'data'
            Time: [301x1 double]
        TimeInfo: tsdata.timemetadata
            Data: [301x1 int32]
        DataInfo: tsdata.datametadata

topOut.getElement('COUNTERBUS').Values(2).data
  timeseries

  Common Properties:
            Name: 'data'
            Time: [301x1 double]
        TimeInfo: tsdata.timemetadata
            Data: [301x1 int32]
        DataInfo: tsdata.datametadata

Вы также можете построить график записанных данных с помощью plot функция:

topOut.getElement('OUTERDATA').Values.plot()

Логгирование сигналов модели

Чтобы записать сигналы в ссылочную модель, выберите блок Model и нажмите Log Signals на вкладке Model Block.

Для этой модели Режим регистрации установлен в Log all signals as specified in model. Все сигналы, которые регистрируются при симуляции sldemo_mdlref_counter_bus как верхняя часть также регистрируются при симуляции ее как модели-ссылки. Чтобы изменить логгирование для любого из этих сигналов или зарегистрировать подмножество сигналов:

  1. Установите режим логгирования на Override signals.

  2. На панели Иерархия модели снимите флажок CounterA (sldemo_mdlref_counter_bus), чтобы указать, что эта модель не должна использовать Log all signals as specified in model настройка.

  3. В таблице выберите сигналы для регистрации при симуляции верхней модели.

  4. Чтобы сохранить изменения, сохраните верхнюю модель.

Загрузка данных

Откройте ссылочную модель sldemo_mdlref_counter_bus как модель верхней части нажав значок Open As Верхней части Model в левом нижнем углу Блока Model.

Ссылочная модель сконфигурирована, чтобы считать записанные данные сигнала через корневые блоки Inport. Чтобы увидеть это строение, откройте диалоговое окно Параметров конфигурации. На панели инструментов Simulink, на вкладке Modeling, нажмите Model Settings. На вкладке Data Import/Export, вход использует разделенный списками , разделенными запятыми, чтобы задать записанные данные из topOut для двух входных портов. Порт counter_input использует массив структур timeseries, чтобы загрузить данные для COUNTERBUS, а порт increment_input использует структуру timeseries, чтобы загрузить данные для INCREMENTBUS.

  • topOut.getElement('COUNTERBUS')

  • topOut.getElement('INCREMENTBUS')

Вы можете сконфигурировать поле Input, нажав кнопку Connect Input. Откроется инструмент Root Inport Mapper. В этом примере инструмент использует алгоритм отображения, чтобы настроить поле Input из записанных данных в базовом рабочем пространстве.

Чтобы выбрать данные для импорта:

  1. В окне Root Inport Mapper нажмите From Workspace.

  2. Выберите записанные данные topOut и нажмите OK.

  3. В открывшемся диалоговом окне укажите имя файла и нажмите кнопку «Сохранить».

С помощью данных, загруженных в инструмент Root Inport Mapper, можно определить корневой входной порт, для которого нужно назначить входные данные. Simulink сопоставляет входные данные с входными портами на основе одного из следующих критериев: имя блока, путь блока, имя сигнала, порядок порта или пользовательский алгоритм. Потому что topOut регистрируется с помощью имен сигналов из модели, лучшим выбором для критерия отображения является Имя сигнала. Используя этот критерий, Simulink пытается сопоставить имена переменных входных данных с именами входных сигналов.

Чтобы выбрать эту опцию:

  1. На панели иерархии Root Inport Mapper выберите набор данных сценария topOut.

  2. Нажмите на переключатель Имя.

  3. Нажмите кнопку Map to Model стрелы, затем выберите Map All.

При отображении данных Simulink оценивает входные порты по входным данным, чтобы определить совместимость. Таблица Root Inport Mapper отражает состояние этой совместимости с зеленой галочкой, оранжевым предупреждающим треугольником или красным восклицательным знаком ошибки. В этом примере таблица показывает зеленый статус, указывающий на отсутствие проблемы совместимости. Можно симулировать модель с этим отображением входных данных к входным портам. Сопоставление также устанавливает Вход на вкладке Данных Import/Export диалогового окна Параметров конфигурации в соответствующий список , разделенный запятыми входов. Чтобы применить изменения к модели, в диалоговом окне Параметры конфигурации (Configuration Parameters) нажмите Применить (Apply).

Симуляция модели с импортированными данными

Моделируйте sldemo_mdlref_counter_bus.

После симуляции возможностей из sldemo_mdlref_bus (OUTERDATA) и sldemo_mdlref_counter_bus (INNERDATA) показать ту же трассировку.

Сигнал, подающий возможности в ссылочной модели, также регистрируется. Записанные данные доступны в рабочем пространстве MATLAB под переменной subOut. Можно проверить, что данные в topOut.getElement('OUTERDATA') и subOut.getElement('INNERDATA') то же самое.

См. также

Похожие темы