Main Content

データ ストアの基礎

データ ストアは、入力または出力信号を直接データ ストアに接続することなしにデータの書き込みまたは読み取りができるリポジトリです。データ ストアは、モデルのレベルを越えてアクセス可能なため、サブシステムおよび参照されるモデルはデータ ストアを使用して、I/O 端子を使用せずにデータを共有できます。

データ ストアの使用時

データ ストアは、モデルの異なるレベルでの複数信号が同じグローバル値が必要とする際に便利です。信号すべてを明示的に接続すると、モデルを煩雑にするか、実現可能になるまで時間がかかります。データ ストアはプログラムのグローバル変数と同じで、同じような利点や欠点 (検証を難しくするなど) があります。

データ ストアは、再利用可能なアルゴリズムのインスタンス (カスタム ライブラリ内のサブシステムや再利用可能な参照モデルなど) の間でデータを共有する場合に使用できます。再利用可能な参照モデルでのデータ共有の詳細については、参照モデル インスタンス間でのデータの共有を参照してください。

データ ストアおよびソフトウェアの検証

データ ストアは、ソフトウェア検証、特にデータ結合および制御の領域で大きな影響があります。入力端子と出力端子のみを使用してデータを渡すモデルおよびサブシステムの結果は、生成コード内でクリーンで、適切に指定され、簡単に検証できるインターフェイスになります。

グローバル データの任意のタイプと同じように、データ ストアは検証をより困難にします。開発過程がソフトウェアの検証を含む場合、設計過程の早い時期にデータ ストアの効果を計画してください。

詳細は、RTCA DO-331 の『Model-Based Development and Verification Supplement to DO-178C and DO-278A』の MB.6.3.3.b 節を参照してください。

Goto ブロックおよび From ブロックによる信号の経路指定

ある場合には、Goto ブロックおよび From ブロックなどの簡単な手法を使用して、データ ストアで与えられるものと似たような結果を取得できます。Goto/From データ リンクの主な欠点は、非バーチャル サブシステムの境界を越えてアクセスできないことです。適切に設定されたデータ ストアは、任意の場所でアクセスできます。Goto/From リンクの詳細は、Goto および From ブロックのリファレンス ページを参照してください。

ローカルおよびグローバル データ ストア

2 種類のデータ ストアを定義できます。

  • ローカル データ ストアは、データ ストアを定義するレベルまたはそれより下のレベルで、参照されるモデルを除きモデルの階層構造の任意の場所からアクセス可能です。ローカル データ ストアは、モデルでグラフィカルに、またはモデル ワークスペースの信号オブジェクト (Simulink.Signal) の作成によって定義できます。

  • グローバル データ ストアは、参照されるモデルを含むモデルの階層構造全体でアクセス可能です。グローバル データ ストアは、MATLAB® ベース ワークスペースでのみ、信号オブジェクトを使用して定義できます。参照モデルでアクセスできる唯一のタイプのデータ ストアがグローバル データ ストアです。

一般に、モデル内の最低レベルのデータ ストアを探します。このモデルは、データ ストアへのアクセスを必要とするモデルのすべての部分に、データ ストアへのアクセスを許可します。ローカルおよびグローバル データ ストアの例は、データ ストアの例に表示されます。

参照モデルの使い方の詳細は、モデル参照を参照してください。

データ ストア診断

データ ストア診断について

Simulink® は、データ ストアの問題を回避するために使用できる、さまざまな実行時およびコンパイル時の診断機能を提供します。診断は、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスおよび Data Store Memory ブロックのパラメーター ダイアログ ボックスで使用可能です。Simulink モデル アドバイザーは、診断が無効なためデータ ストア エラー発生の可能性のある場所をリストすることにより、サポートを提供しています。

アクセス順序エラーの検出

データ ストア実行時診断を使用して、シミュレーション中に発生したデータ ストアの読み取りおよび書き込みの意図しない順序を検出できます。これらの診断をすべてのデータ ストアに適用したり、各 Data Store Memory ブロックにそれぞれの値を設定できます。診断は次のとおりです。

これらの診断は [モデル コンフィギュレーション パラメーター]、[診断]、[データ有効性]、[Data Store Memory ブロック] ペインに表示されます。ここではそれぞれ次の値のいずれかをもつことができます。

  • [すべて無効] — モデルによってアクセスされるすべてのデータ ストアに対してこの診断を無効にします。

  • [警告としてすべて有効] — MATLAB のコマンド ウィンドウに警告として診断を表示します。

  • [エラーとしてすべて有効] — シミュレーションを停止して、エラー ダイアログ ボックスにその診断を表示します。

  • [ローカル設定を使用] — 各 Data Store Memory ブロックがこの診断用の値を設定できるようにします (既定)。

同じ診断は、それぞれの Data Store Memory ブロック パラメーター ダイアログ ボックスの [診断] タブにも表示されます。それぞれの診断を [なし][警告]、または [エラー] に設定できます。個別ブロックによって指定された値は、対応するコンフィギュレーション パラメーターが [ローカル設定を使用] である場合にのみ適用されます。詳細は、モデル コンフィギュレーション パラメーター: データ有効性の診断 および Data Store Memory ドキュメンテーションを参照してください。

最も保守的な手法は、すべてのデータ ストア診断を [モデル コンフィギュレーション パラメーター][診断][データ有効性][Data Store Memory ブロック][エラーとしてすべて有効] に設定することです。ただし、この設定は常に最良であるとは限りません。意図する動作にエラーとしてフラグを付ける可能性があります。次の図に、Data Store Write ブロックの前に Data Store Read ブロックを強制的に実行させるためにブロック優先順位を使用するモデルの例を示します。

データ ストア AData Store Write ブロックによる更新前に Data Store Read ブロックで読み取られたためにシミュレーションでエラーが発生しています。関連する遅延が想定される場合は、グローバル パラメーター [書き込み前の読み取りを検出][ローカル設定を使用] に設定し、そのパラメーターを Data Store Memory ブロックのダイアログ ボックスの [診断] ペインで [なし] に設定することにより、エラーを抑えることができます。この手法を使用する場合、診断から意図的に除外するブロック以外のすべての Data Store Memory ブロックで、パラメーターを [エラー] に設定してください。

データ ストアの診断とアクセラレータ モードで参照されるモデル.  アクセラレータ モードで参照されるモデルの場合、Simulink は、次の [コンフィギュレーション パラメーター][診断][データ有効性][Data Store Memory ブロック] パラメーターが [すべて無効] 以外の値に設定されている場合、それらの値を無視します。

  • 書き込み前の読み取りを検出 (ReadBeforeWriteMsg)

  • 読み取り後の書き込みを検出 (WriteAfterReadMsg)

  • 書き込み後の書き込みを検出 (WriteAfterWriteMsg)

モデル アドバイザーを使用して、上記にリストされているコンフィギュレーション パラメーターが Simulink で無視される、アクセラレータ モードで参照されるモデルを特定できます。

  1. Simulink エディターの [モデル化] タブで、[モデル アドバイザー] をクリックします。

  2. [タスク別] を選択します。

  3. [高速化されたモデル参照シミュレーション中に無視された診断設定をチェック] チェックを実行します。

データ ストア診断と MATLAB Function ブロック.  MATLAB Function ブロックが使用するデータ ストア メモリの診断は、保守的になる可能性があります。たとえば、データ ストア メモリの配列を MATLAB 関数に渡す場合、A = foo(A) などの最適化を行うと、アクセスしたのが一部の要素であっても、MATLAB によって、配列の内容全体が読み取り専用または書き込み専用とマーキングされる可能性があります。

マルチタスク アクセス エラーの検出

データ ストアがあるタスクから読み取られ、別のタスクに書き込まれた場合、データ整合性は失われる可能性があります。たとえば、次の場合を仮定します。

  1. タスクが、データ ストアに書き込まれる。

  2. 2 番目のタスクが最初のタスクに割り込む。

  3. 2 番目のタスクがそのデータ ストアから読み取られる。

2 番目のタスクが割り込んだときに最初のタスクが部分的にデータ ストアを更新していた場合、ストアの結果データは矛盾します。たとえば、値がベクトルの場合、その要素のいくつかは現在のタイム ステップで書き込まれますが、残りは以前のステップで書き込まれます。値がマルチワードの場合、部分的にも正しくない矛盾状態のままである可能性もあります。

タスク プリエンプションによるデータ整合性の問題が発生しないと確信できる場合を除き、コンパイル時診断 [モデル コンフィギュレーション パラメーター]、[診断]、[データ有効性]、[Data Store Memory ブロック]、[マルチタスク データ ストア][警告] (既定) または [エラー] に設定します。この診断は、異なるタスクから読み取られ異なるタスクへ書き込まれるデータ ストアの場合にフラグを付けます。次の図は、[マルチタスク データ ストア][エラー] に設定することにより検出された問題を示します。

データ ストア A は、速いタスクに書き込まれ、遅いタスクから読み込まれるため、エラーが推奨修正方法と共に報告されます。この診断は、データ ストアの読み取りまたは書き込みが条件付きサブシステム内にある場合でも適用されます。Simulink は、ブロックが実行されるタスクを適切に診断し、診断を評価する目的でタスクを使用します。

次の図は、上記の問題に対する解決法を示します。データ ストアの読み取り後に、以前より遅いレートでデータ ストアにアクセスした Rate Transition ブロックを置きます。

変更されると、データ ストアの書き込みは、より速いレートで継続して発生します。モデルのその他の場所で、データ ストアがより速いレートで読み取られる必要がある場合、これは重要です。

マルチタスク データ ストア診断は、参照されるモデル内のデータ ストアの読み取りおよび書き込みにも適用されます。異なる 2 つのモデルがデータ ストアの読み取りおよび書き込みを異なるタスクで実行する場合、Simulink が共通の親モデルをコンパイルするとエラーが検出されます。

重複する名前のエラーの検出

データ ストアのエラーは、モデル内でのデータ ストア名の重複使用によって発生します。たとえば、異なる入れ子になったスコープで 2 つ以上のデータ ストアのメモリが同じデータ ストア名をもつ場合、データ ストアの優先順位変更が発生します。この場合、データ ストアの読み取りまたは書き込みによって低いレベルで参照されるデータ ストアのメモリは、意図された格納ではない可能性があります。

重複したデータ ストア名が原因のエラーを回避するには、コンパイル時診断 [モデル コンフィギュレーション パラメーター]、[診断]、[データ有効性]、[Data Store Memory ブロック]、[データ ストア名の重複][警告] または [エラー] に設定します。既定の設定では、診断値は、[なし] になり、重複名の検出を行いません。次の図は、[データ ストア名の重複][エラー] に設定することにより検出された問題を示します。

サブシステム階層の最下レベルでのデータ ストア読み取りは A という名前のデータ ストアを参照し、同じモデル内の 2 つの Data Store Memory ブロックもその名前をもつため、エラーが報告されます。この診断は、データ ストアの読み取りがモデルの最上位レベルの Data Store Memory ブロックを参照すると仮定されないようにします。読み取りは、Data Store Memory ブロックを Data Store Read ブロックに近い中間レベルで参照します。

モデル アドバイザーでのデータ ストア診断

モデル アドバイザーは、データ ストアと共に使用できるいくつかの診断機能を提供します。データ ストアのモデル アドバイザー診断の詳細は、次の節を参照してください。

Check Data Store Memory blocks for multitasking, strong typing, and shadowing issues

Check data store block sample times for modeling errors

Check if read/write diagnostics are enabled for data store blocks

データ ストアの初期値の指定

一般に、データ ストアの初期値を指定する際は、その他のブロックで使用する場合と同じ手法を使用できます。信号と離散状態の初期化を参照してください。

ほとんどのブロックでは、スカラー拡張を活用して非スカラー信号の初期値を指定する作業を最小限に抑えることができます。スカラーの初期値を指定する場合、信号の各要素はそのスカラーを使用します。

ただし、Data Store Memory ブロックで [次元] パラメーターを -1 に設定する場合 (既定)、スカラー拡張は使用できません。その代わり、保存された信号と同じ次元をもつ初期値を指定しなければなりません。初期値のスカラー拡張を活用するには、[次元] パラメーターを [1 2][1 myDim] (シンボリック次元用) などの特定の値に設定します。

参考

| | |

関連するトピック