Используя хранилища данных через многоуровневые модели

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

Откройте модели в качестве примера

Откройте модели в качестве примера. Топ-модель модели sldemo_mdlref_dsm_bot и sldemo_mdlref_dsm_bot2 ссылок sldemo_mdlref_dsm. Журналирование хранилищ данных включено для sldemo_mdlref_dsm на панели Импорта/Экспорта Данных диалогового окна Параметров конфигурации.

sldemo_mdlref_dsm_bot эталонной модели усиливает входящий сигнал 5, если сигнал положителен или 2, если сигнал отрицателен и пишет значение этого сигнала к локальному хранилищу данных RefSignalVal. Это локальное хранилище данных сконфигурировано, чтобы регистрировать все записанные значения к рабочей области после симуляции. Параметрами журналирования для этого локального хранилища данных управляет вкладка Logging диалогового окна параметров блоков.

sldemo_mdlref_dsm_bot2 эталонной модели устанавливает значение глобального хранилища булевых данных под названием ErrorCond к истине, если значение ее входящего сигнала за пределами области значений (-0.8, 0.8). Топ-модель также контролирует хранилище данных ErrorCond и переключается между выходными параметрами двух моделей, на которые ссылаются, в зависимости от значения того хранилища данных.

Задайте хранилище глобальных данных Используя Simulink® Signal Object

Чтобы указать к Simulink, что топ-модель и обе из моделей, на которые ссылаются, используют ту же память для Хранилища данных под названием ErrorCond в каждой модели, создайте экземпляр объекта Simulink.Signal под названием ErrorCond в базовом рабочем пространстве. Поскольку этот объект видим к каждой модели, ее осциллограф охватывает отдельные модели и подразумевает, что существует одно хранилище глобальных данных того имени, которое является общим для модели. Обратите внимание на то, что ни одна из этих трех моделей не содержит Блок памяти Хранилища данных с именем хранилища данных ErrorCond. Если бы какая-либо модель содержала такой блок, тот блок задал бы хранилище данных, локальное для модели, которая была бы тень хранилище глобальных данных.

Поскольку объект ErrorCond задает хранилище глобальных данных, он должен явным образом задать DataType, Complexity, Dimensions и свойства SamplingMode к ненаследованным настройкам. SampleTime и StorageClass можно оставить как их наследованные значения, или явным образом установить.

Пример включает MAT-файл под названием sldemo_mdlref_dsm_data.mat, который содержит объект Simulink.Signal ErrorCond. Функция предварительной нагрузки модели sldemo_mdlref_dsm загружает этот MAT-файл, вызывающий объект загрузиться в базовом рабочем пространстве. Можно просмотреть этот объект путем выбора базового рабочего пространства в Model Explorer. Можно также создать этот объект из командной строки MATLAB®. Следующие команды задают объект, используемый в этом примере:

   ErrorCond = Simulink.Signal;
   ErrorCond.Description = 'Use to signal that subsystem output is invalid';
   ErrorCond.DataType = 'boolean';
   ErrorCond.Complexity = 'real';
   ErrorCond.Dimensions = 1;
   ErrorCond.SamplingMode='Sample based';
   ErrorCond.SampleTime = 0.1;
   ErrorCond.LoggingInfo.DataLogging = true;

Журналирование хранилища глобальных данных

Чтобы регистрировать все значения, записанные в хранилище глобальных данных, установите свойство DataLogging свойства LoggingInfo объекта Simulink.Signal. Свойство LoggingInfo также позволяет спецификацию других параметров журналирования, таких как десятикратное уменьшение и максимальные точки.

   Simulink.LoggingInfo (handle)
           DataLogging: 1
              NameMode: 0
           LoggingName: ''
          DecimateData: 0
            Decimation: 2
       LimitDataPoints: 0
             MaxPoints: 5000

Моделируйте модель

Теперь можно моделировать sldemo_mdlref_dsm, чтобы видеть вывод. sldemo_mdlref_dsm_bot эталонной модели пишет в хранилище данных ErrorCond, в то время как топ-модель sldemo_mdlref_dsm читает из хранилища данных. Синяя строка представляет вход sldemo_mdlref_dsm_bot; зеленая строка представляет вывод блока switch. Обратите внимание на то, что вывод переключается, когда значение входного сигнала падает за пределами области значений.

Просмотрите регистрируемые результаты

И глобальные данные хранят ErrorCond и локальное хранилище данных, RefSignalVal сконфигурированы, чтобы регистрировать все записанные значения после симуляции. Эти регистрируемые результаты хранятся в базовом рабочем пространстве в переменной dsmout.

dsmout = 

Simulink.SimulationData.Dataset 'dsmout' with 2 elements

                                  Name          BlockPath                                
                                  ____________  ________________________________________ 
    1  [1x1 DataStoreMemory]      ErrorCond     ''                                      
    2  [1x1 DataStoreMemory]      RefSignalVal  ...dlref_dsm/A|sldemo_mdlref_dsm_bot/DSM

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

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

   >> dsmout.getElement('RefSignalVal')
  Simulink.SimulationData.DataStoreMemory
  Package: Simulink.SimulationData

  Properties:
                   Name: 'RefSignalVal'
              BlockPath: [1x1 Simulink.SimulationData.BlockPath]
                  Scope: 'local'
    DSMWriterBlockPaths: [1x2 Simulink.SimulationData.BlockPath]
             DSMWriters: [101x1 uint32]
                 Values: [1x1 timeseries]

Данные хранятся в timeseries в поле Values.

   >> plot(dsmout.getElement('RefSignalVal').Values);

Чтобы определить, какой блок записал в хранилище данных в установленный срок, используйте свойство DSMWriters. Этот массив содержит список индексов в массив DSMWriterBlockPaths. Например, блок path блока Data Store Write, который записал 5-е значение в хранилище данных, может быть получен можно следующим образом:

   >> dsm = dsmout.getElement('RefSignalVal');
   >> dsm.DSMWriterBlockPaths(dsm.DSMWriters(5))
  Simulink.SimulationData.BlockPath
  Package: Simulink.SimulationData

  Block Path:
    'sldemo_mdlref_dsm/A'
      'sldemo_mdlref_dsm_bot/PositiveSS/DSW'

  Use the getBlock method to access block path character vectors from this object.
Для просмотра документации необходимо авторизоваться на сайте