複数のモデルに対するデータ ストアの使用
この例では、ローカル データ ストアの使用とログの作成について示します。また、グローバル データ ストアを定義、使用、ログを作成することにより、参照モデル間でグローバル データを共有する方法も示します。
モデル例の検査
モデル例を開きます。最上位モデル sldemo_mdlref_dsm
からモデル sldemo_mdlref_dsm_bot
および sldemo_mdlref_dsm_bot2
が参照されます。[コンフィギュレーション パラメーター] ダイアログ ボックスの [データのインポート/エクスポート] ペインで、sldemo_mdlref_dsm
のデータ ストアのログはオンになっています。
参照モデル sldemo_mdlref_dsm_bot
で入力信号が (正の場合は 5、負の場合は 2 だけ) 増幅され、この信号の値がローカル データ ストア RefSignalVal
に書き込まれます。このローカル データ ストアは、書き込まれた値がすべてシミュレーション後にワークスペースにログを作成されるように設定されています。このローカル データ ストアのログ パラメーターは、[ブロック パラメーター] ダイアログ ボックスの [ログ] タブで制御されます。
PositiveSS
サブシステムには、入力信号が正の場合に信号を 5 増幅し、この信号の値をローカル データ ストア RefSignalVal
に書き込むブロックが含まれています。
NegativeSS
サブシステムには、入力信号が負の場合に信号を 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
オブジェクトではグローバル データ ストアが定義されるため、DataType
、Complexity
、Dimensions
の各プロパティが、継承されない設定に明示的に定義されなければなりません。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
を参照する Model ブロック A
への入力を表します。オレンジのラインは 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.
参考
Data Store Memory | Data Store Read | Data Store Write