グローバルなデータ共有
グローバル データの使用時期
次の場合に、グローバル データを MATLAB Function ブロックと併用しなければならないことがあります。
グローバル変数を使用する複数の MATLAB® 関数があり、これらの関数を MATLAB Function ブロックから呼び出す場合。
大量のグローバル データを使用する既存のモデルがあり、MATLAB Function ブロックをそのモデルに追加し、他の入力や出力によるモデルの混乱を避ける場合。
データの可視性をモデルの部分にスコープする場合。
グローバル データと MATLAB Function ブロックの併用
Simulink® では、データ ストア メモリを使用して、グローバル データを格納します。Data Store Memory ブロックまたは Simulink.Signal
オブジェクトのいずれかを使用して、データ ストア メモリを実装します。グローバル データの格納方法は、グローバル変数の数と範囲によって決まります。詳細については、ローカルおよびグローバル データ ストアとグローバル データの格納方法の選択を参照してください。
MATLAB グローバルとデータ ストア メモリの関連性
Simulink の MATLAB 関数では、グローバル宣言は MATLAB グローバル ワークスペースにマップされません。その代わり、グローバル データを MATLAB Function ブロックとともに登録し、データをデータ ストア メモリにマップします。これにより、MATLAB 関数のグローバル データは Simulink ソルバーと相互運用され、誤って使用された場合は診断が与えられます。
グローバル変数は、モデル内の同じ名前をもつ最も近いデータ ストア メモリに、階層的に関連付けられます。2 つの異なる MATLAB Function ブロックで発生する同じグローバル変数は、モデルの構造体によって、異なるデータ ストア メモリに関連付けられることがあります。この機能を使用して、データの可視性をサブシステムにスコープできます。
グローバルと MATLAB Function ブロックの併用
MATLAB Function ブロックまたはこのブロックが呼び出すコードでグローバル データを使用するには、以下を行わなければなりません。
MATLAB Function ブロックで、または MATLAB Function ブロックが呼び出すコードでグローバル変数を宣言します。
グローバル変数と同じ名前をもつ Data Store Memory ブロックまたは
Simulink.Signal
オブジェクトを MATLAB Function ブロックに登録します。
詳細については、Data Store Memory ブロックを使用したデータの格納とSimulink.Signal オブジェクトを使用したデータの格納を参照してください。
グローバル データの格納方法の選択
次の表は、Data Store Memory ブロックまたは Simulink.Signal
オブジェクトのどちらを使用するかをまとめています。
実行する操作: | 使用: | 詳細情報: |
---|---|---|
モデル参照を使用しない単一モデルで、少数のグローバル変数を使用する場合。 | Data Store Memory ブロック。 メモ Data Store Memory ブロックを使用することで、データはモデルのスコープになります。
| Data Store Memory ブロックを使用したデータの格納 |
モデル参照を使用しない単一モデルで、多数のグローバル変数を使用する場合。 | モデル ワークスペースで定義された
| Simulink.Signal オブジェクトを使用したデータの格納 |
複数モデル間でデータを共有する場合 (参照されたモデルを含む)。 | ベース ワークスペースで定義された メモ
| Simulink.Signal オブジェクトを使用したデータの格納 |
Data Store Memory ブロックを使用したデータの格納
このモデルでは、Data Store Memory ブロック A
に保存されたグローバル データを MATLAB Function ブロックで使用する方法を説明します。
dsm_demo.mdl モデルを開きます。
MATLAB Function ブロックをダブルクリックして MATLAB Function ブロック エディターを開きます。
この MATLAB Function ブロックのコードでは、グローバル変数
A
が定義されています。ブロックが実行されるたびにA
の値が変更されます。function y = fcn %#codegen global A; A = A+1; y = A;
グローバル変数が MATLAB Function ブロックに登録されていることを確認します。MATLAB Function ブロックの変数の作成と定義を参照してください。
[モデル化] タブの [設計] セクションで、[[シンボル] ペイン] をクリックします。
[シンボル] ペインでデータ [A] を選択します。このデータではグローバル変数と同じ名前を使用しています。右クリックして
[検査]
を選択し、プロパティ インスペクターを開きます。プロパティ インスペクターで、データの [スコープ] が
Data Store Memory
に設定されています。
Data Store Memory ブロック
A
をダブルクリックします。[ブロック パラメーター] ダイアログ ボックスで、[データ ストア名] にグローバル変数の名前と同じA
が表示されます。ブロックの初期値は25
です。Data Store Memory をモデルに追加するときは次のようにします。
[データ ストア名] を設定して、MATLAB Function ブロック コードのグローバル変数の名前と一致するようにします。
[データ型] を明示的なデータ型に設定します。データ型を [
auto
] に設定することはできません。[信号タイプ] を設定し、[初期値] を指定します。
モデルのシミュレーションを実行します。
MATLAB Function ブロックが実行されるたびに、
A
に格納されたグローバル データの初期値が読み取られ、A
の値が更新されます。
Simulink.Signal
オブジェクトを使用したデータの格納
このモデルでは、Simulink.Signal
オブジェクト A
に保存されたグローバル データを MATLAB Function ブロックで使用する方法を説明します。
simulink_signal_local モデルを開きます。
このモデルでは、モデル ワークスペースの
Simulink.Signal
オブジェクトを使用します。メモ
複数のモデルでグローバル データを使用するには、ベース ワークスペースに
Simulink.Signal
オブジェクトを作成します。Simulink.Signal
オブジェクトがモデル エクスプローラーに追加されていることを確認します。[モデル化] タブで、[モデル エクスプローラー] をクリックします。
モデル エクスプローラーの左側ペインで、
simulink_signal_local
モデルのモデル ワークスペースを選択します。[コンテンツ] ペインは、モデル ワークスペースのデータを表示します。
Simulink.Signal
オブジェクトA
をクリックします。モデル エクスプローラーの右側のペインで、
A
の属性が次のように表示されていることを確認します。属性 値 データ型 double
実数/複素数 real
次元 1
初期値 5
モデル エクスプローラーも参照してください。
MATLAB Function ブロックをダブルクリックして、エディターを開きます。
MATLAB Function ブロックが実行されるたびに、グローバル データ
A
の値が変更されます。function y = fcn %#codegen global A; A = A+1; y = A;
Simulink.Signal
オブジェクトが MATLAB Function ブロックに登録されていることを確認します。[モデル化] タブの [設計] セクションで、[[シンボル] ペイン] をクリックします。
[シンボル] ペインでデータ [A] を選択します。このデータではグローバル変数と同じ名前を使用しています。右クリックして
[検査]
を選択し、プロパティ インスペクターを開きます。プロパティ インスペクターで、データの [スコープ] を
Data Store Memory
に設定します。
モデルのシミュレーションを実行します。
MATLAB Function ブロックが実行されるたびに、
A
に格納されたグローバル データの初期値が読み取られ、A
の値が更新されます。
データ ストア診断を使用したメモリのアクセス問題の検出
モデルを構成して、データ ストアの問題を回避する実行時およびコンパイル時の診断を提供できます。診断は、[コンフィギュレーション パラメーター] ダイアログ ボックスおよび Data Store Memory ブロックのパラメーター ダイアログ ボックスで使用可能です。これらの診断は、Simulink.Signal
オブジェクトではなく、Data Store Memory ブロックのみで使用可能です。データ ストア診断の使用についての詳細は、データ ストア診断を参照してください。
メモ
データ ストア メモリ配列を関数に渡す場合、A=foo(A)
のような最適化を実行すると、コード生成ソフトウェアは、いくつかの要素のみがアクセスされたにもかかわらず、配列のすべての内容を読み取りまたは書き込みとしてマークを付けることがあります。
MATLAB Function ブロックでの共有データ使用の制限
Data Store Memory ブロックは次をサポートしません。
MATLAB 値クラス
可変サイズのデータ