Main Content

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

モデルの階層構造の異なるコンテキストに対応する柔軟なストレージ クラス

この例では、モデルの階層構造全体で 1 つのストレージ クラスを使用して、単一インスタンス データに対しては構造化されていないコード、マルチインスタンス データに対しては構造化されたコードを生成する方法を示します。モデルの階層構造に単一インスタンスとマルチインスタンスのデータが含まれている場合、2 つの個別のストレージ クラスを作成するのではなく、柔軟なストレージ クラスを使用して 2 つのコンテキストに対する設定を指定します。

この例では、単一インスタンスの最上位モデル ex_mdlreftop_dd を使用し、そのモデルでマルチインスタンスのモデル ex_mdlrefbot_dd を 3 回参照します。両方のモデルでデータ ディクショナリ ex_mdlref_dd.sldd を共有します。共有データ ディクショナリでストレージ クラスを定義すると、そのクラスを両方のモデルのデータ項目に適用できます。

  1. モデル例 ex_mdlreftop_dd を開きます。

    addpath(fullfile(docroot,'toolbox','ecoder','examples'))
    ex_mdlreftop_dd
  2. 共有データ ディクショナリを開きます。[モデル化] タブで、[設計][データ ディクショナリ] をクリックします。

  3. 共有 Embedded Coder ディクショナリを開きます。モデル エクスプローラーの [モデルの階層構造] ペインで、ex_mdlref_dd ノードを展開し、[Embedded Coder ディクショナリ] をクリックします。右側のペインで、[Embedded Coder ディクショナリを開く] をクリックします。

  4. 左側のペインで、[ストレージ クラス] をクリックします。

  5. 組み込みストレージ クラス MultiInstance はマルチインスタンス データに対する構造体を生成するように構成されています。このストレージ クラスを複製し、その他のプロパティを編集できるようにします。MultiInstance ストレージ クラスを選択して [複製] をクリックします。組み込みストレージ クラスの詳細については、MultiInstanceを参照してください。

  6. [ストレージ クラス] セクションで、[作成] をクリックします。

  7. 新しいストレージ クラスの場合、[プロパティ インスペクター] ペインで次のプロパティ値を設定します。

    • 名前MyStorageClass

    • [単一インスタンス データとマルチインスタンス データに異なるプロパティ設定を使用] — 選択。

    • [単一インスタンス ストレージ][ストレージ タイプ]Unstructured

    • [マルチインスタンス ストレージ][ストレージ タイプ]Structured

    Coder dictionary dialog box showing new storage class.

    MyStorageClass をデータ項目に適用すると、データのタイプとモデル参照階層におけるモデルのコンテキストに応じて、単一インスタンスの設定またはマルチインスタンスの設定が Embedded Coder ディクショナリで実装されます。疑似コードのプレビューで、それぞれの設定の実装を確認します。

  8. ストレージ クラスをディクショナリの既定の設定として指定することで内部データ項目に適用します。Embedded Coder ディクショナリで、[データの既定の設定] をクリックします。[Signals, states, and internal data] の行で、[ストレージ クラス]MyStorageClass に設定します。[OK] をクリックします。

    ex_mdlreftop_ddex_mdlrefbot_dd でディクショナリ ex_mdlref_dd.sldd を共有するため、両方のモデルで MyStorageClass が内部データ用の既定のストレージ クラスとして使用されます。

  9. モデル ex_mdlreftop_dd の Embedded Coder アプリを開きます。

  10. モデルのコードを生成します。

  11. 参照モデルの生成コードを確認します。エディターで参照モデルを開くには、Model ブロック CounterA をダブルクリックします。コード ビューに参照モデルのコードが表示されます。ex_mdlrefbot_dd.h の参照モデルのコードでは、参照モデルの内部データを格納するストレージ クラスの構造体を定義しています。

    /* Storage class 'MyStorageClass', for model 'ex_mdlrefbot_dd' */
    typedef struct {
      real_T PreviousOutput_DSTATE;        /* '<Root>/Previous Output' */
    } ex_mdlrefbot_dd_MyStorageClass;
    
    /* Real-time Model Data Structure */
    struct ex_mdlrefbot_dd_tag_RTM {
      const char_T **errorStatus;
      ex_mdlrefbot_dd_MyStorageClass *MyStorageClass_ex_mdlrefbot_dd;
    };

    参照モデルはマルチインスタンスであるため、この定義で MyStorageClass のマルチインスタンス データの設定が実装されます。参照モデルのコードでは、内部データを構造体 ex_mdlrefbot_dd_MyStorageClass に格納します。

  12. 最上位モデルに戻り、生成コードを確認します。ex_mdlreftop_dd.c の最上位モデルのコードでは、参照モデルのストレージ クラス ex_mdlrefbot_dd_MyStorageClass をインスタンス化することで、各 Model ブロックの内部データを定義しています。

    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MdlrefDW ex_mdlreftop_dd_CounterA_InstanceData;
    ex_mdlrefbot_dd_MdlrefDW ex_mdlreftop_dd_CounterB_InstanceData;
    ex_mdlrefbot_dd_MdlrefDW ex_mdlreftop_dd_CounterC_InstanceData;
    
    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MyStorageClass MyStorageClass_CounterA;
    
    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MyStorageClass MyStorageClass_CounterB;
    
    /* Storage class 'MyStorageClass' */
    ex_mdlrefbot_dd_MyStorageClass MyStorageClass_CounterC;

    最上位モデルは単一インスタンスであるため、これらの定義で MyStorageClass の単一インスタンス データの設定が実装されます。さらに、最上位モデルでは、単一インスタンス データの設定を使用して、独自の内部データをスタンドアロンの変数としてパッケージ化します。最上位モデルのコードには、内部データ用の構造体の定義は含まれません。

参考

関連するトピック