Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

複数のモデルに対するデータ ストアの利用

この例では、ローカル データ ストアの使用とログの作成について示します。また、グローバル データ ストアを定義、使用、ログを作成することにより、参照モデル間でグローバル データを共有する方法も示します。

モデル例を開く

モデル例を開きます。最上位モデル sldemo_mdlref_dsm からモデル sldemo_mdlref_dsm_bot および sldemo_mdlref_dsm_bot2 が参照されます。[コンフィギュレーション パラメーター] ダイアログ ボックスの [データのインポート/エクスポート] ペインで、sldemo_mdlref_dsm のデータ ストアのログはオンになっています。

参照モデル sldemo_mdlref_dsm_bot で入力信号が (正の場合は 5、負の場合は 2 だけ) 増幅され、この信号の値がローカル データ ストア RefSignalVal に書き込まれます。このローカル データ ストアは、書き込まれた値がすべてシミュレーション後にワークスペースにログを作成されるように設定されています。このローカル データ ストアのログ パラメーターは、[ブロック パラメーター] ダイアログの [ログ] タブで制御されます。

参照モデル sldemo_mdlref_dsm_bot2 により、ErrorCond という名前のグローバル boolean データ ストアの値は、その入力信号の値が (-0.8, 0.8) の範囲外にある場合、true に設定されます。また、最上位モデルではデータ ストア ErrorCond がモニターされ、2 つの参照モデルの出力が、このデータ ストアの値に応じて切り替えられます。

Simulink® 信号オブジェクトを使用したグローバル データ ストアの定義

最上位モデルと両方の参照モデルが各モデルで ErrorCond という名前のデータ ストアに対して同じメモリを使用するということを Simulink に対して指定するには、ErrorCond という名前の Simulink.Signal オブジェクトのインスタンスを各モデルで表示されるワークスペースまたはデータ ディクショナリに作成します。このオブジェクトは各モデルに可視であるため、そのスコープは個々のモデルを網羅し、モデル間で共有されるその名前のグローバル データ ストアが 1 つ存在することを意味します。3 つのモデルはどれも、ErrorCond のデータ ストア名をもつ Data Store Memory ブロックを含んでいません。いずれかのモデルがこのようなブロックを含んでいれば、そのブロックではそのモデルにローカルなデータ ストアが定義されることになり、グローバル データ ストアは隠されます。

ErrorCond オブジェクトではグローバル データ ストアが定義されるため、DataTypeComplexityDimensions の各プロパティが、継承されない設定に明示的に定義されなければなりません。SampleTime および StorageClass は、継承された値のままにしても明示的に設定しても構いません。

この例には、ErrorCond という Simulink.Signal オブジェクトを含む sldemo_mdlref_dsm_data.mat という名前の MAT ファイルが含まれています。モデル sldemo_mdlref_dsm のプリロード関数によってこの MAT ファイルが読み込まれ、このオブジェクトがベース ワークスペースに読み込まれます。モデル エクスプローラーでベース ワークスペースを選択することにより、このオブジェクトを表示できます。MATLAB® コマンド プロンプトからこのオブジェクトを作成することもできます。以下のコマンドにより、この例で使用するオブジェクトが定義されます。

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

グローバル データ ストアのログ

グローバル データ ストアに書き込まれた値のすべてのログを作成するには、Simulink.Signal オブジェクトの LoggingInfo プロパティの DataLogging プロパティを設定します。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]

データは Values フィールド内の timeseries に保存されています。

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

ある時間にデータ ストアがどのブロックによって書き込まれたのかを知るには、DSMWriters プロパティを使用します。この配列には、DSMWriterBlockPaths 配列へのインデックスの一覧が含まれています。たとえば、データ ストアに 5 番目の値を書き込んだ Data Store Write ブロックのブロック パスは、以下のように取得できます。

   >> 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.

参考

| |

関連するトピック