メインコンテンツ

生成コードでの多次元配列の次元の保持

既定では、多次元のモデル データについて、生成コードには 1 次元配列が含まれます。[コンフィギュレーション パラメーター] ダイアログ ボックスで [配列のレイアウト] パラメーターが Row-major に設定されている場合に、生成コードで多次元配列の次元を保持できます。生成されたコードで配列の次元を保持すると、外部コードとの統合が強化されます。

MATLAB® と C では、多次元データの編成方法が異なります (多次元配列の次元保持を参照)。生成コードで、ルートレベルの入力端子と出力端子、パラメーター、信号、状態、ルックアップ テーブル、およびデータ ストアの次元を保持できます。

次元を保持するための既定のモデル データ要素の構成

[コード マッピング][データの既定の設定] タブで、次のモデル データ要素カテゴリを構成できます。次元を保持するには、ストレージ クラスを指定します。

  • 入力端子

  • 出力端子

  • Signals, states, and internal data

  • Shared local data stores

  • Global data stores

  • モデル パラメーター

  • External parameters

その後、個々のモデル データ要素で [ストレージ クラス]Auto または Model default に設定すると、既定で、[データの既定の設定] タブでそれぞれのモデル データ要素に対して設定した構成がコード ジェネレーターによって適用されます。

この例では、上記のモデル データ要素カテゴリの配列の次元を保持する方法を示します。

モデル例 PreserveArrayDims を開きます。

model = "PreserveArrayDims";
open_system(model);

[コンフィギュレーション パラメーター] ダイアログ ボックスで、パラメーター [配列のレイアウト]Row-major に設定されていることを確認します。

set_param("PreserveArrayDims", "ArrayLayout", "Row-major");

Embedded Coder アプリを開きます。[C コード] タブで、コード マッピング エディターを開きます。[コード インターフェイス][既定のコード マッピング] を選択します。このオプションにより、コード マッピング エディターが開いた状態でピン留めされます。

[データの既定の設定] タブで、[入力端子] カテゴリを選択します。指定されている [ストレージ クラス]ExportToFile です。編集アイコンをクリックし、[PreserveDimensions] プロパティを選択します。

[PreserveDimensions] プロパティをプログラムで構成するには、MATLAB コマンド ウィンドウで coder.mapping.defaults.set 関数を使用します。

cm = coder.mapping.api.get("PreserveArrayDims");
setDataDefault(cm, "Inports", "PreserveDimensions", "1")

Embedded Coder® で新しいストレージ クラスを作成し、そのクラスを指定して次元を保持できます。詳細については、新しいストレージ クラスの次元の保持を参照してください。

サポートされているストレージ クラスのリストについては、次元を保持するためにサポートされているストレージ クラスを参照してください。

コードの生成とレビュー

evalc("slbuild('PreserveArrayDims')");

生成されたコードは、ルートレベルの入力端子の次元を保持します。

file = fullfile("PreserveArrayDims_ert_rtw",...
    "PreserveArrayDims.c");
coder.example.extractLines(file,"real_T rtActuator", ...
    "real_T rtTemperature",0,1);
real_T rtPressure[2][3];               /* '<Root>/Pressure' */
real_T rtTargetVolume[2][3];           /* '<Root>/TargetVolume' */
real_T rtTemperature[2][3];            /* '<Root>/Temperature' */

次元を保持するための個々のモデル データ要素の構成

[入力端子][出力端子][パラメーター][データ ストア]、および [信号/状態] などの他のタブで個々のモデル データ要素のソースを構成することで、[データの既定の設定] タブで指定された既定の構成をオーバーライドできます。以下に、モデル データ要素カテゴリに適用可能なワークフローの例を示します。

コード マッピング エディターへの信号の追加

  1. [C コード] タブから、[コード インターフェイス][個々の要素コードのマッピング] を開きます。

  2. コード マッピング エディターで [信号/状態] タブを選択します。[信号] セクションは現在空です。特定のモデルには、複数の信号が存在する場合があります。コード生成を構成する際、これらの信号の一部は重要ではない場合があります。コード生成の構成に関連する対象の信号として、信号をマークできます。信号を明示的に追加すると、その信号はコード マッピング エディターに追加されます。

  3. コード マッピング エディターで、[信号/状態] タブを開きます。Simulink® エディターで、コード マッピング エディターに追加する信号を選択します。この例では、サブシステム Volume Controller から Outport Actuator Command に向かう信号を選択します。信号線の上または下に表示されている省略記号 (...) にカーソルを合わせて、アクション バーを開きます。[選択した信号をコード マッピングに追加] ボタンをクリックします。その信号が、コード マッピング エディターの [信号] テーブルに追加されます。

action_bar_add_signals.png

cm = coder.mapping.api.get("PreserveArrayDims");
vol_ports = get_param("PreserveArrayDims/Volume Controller","PortHandles");
vol_outPort = vol_ports.Outport(1);
addSignal(cm,vol_outPort);

信号インターフェイスの構成とコードの生成

[データの既定の設定] タブの構成に従い、信号の既定のストレージ クラスは Localizable です。信号の既定の構成でも、多次元配列の次元を保持するように指定されています。既定では、個別に追加された信号の [ストレージ クラス]Auto として構成されています。[信号/状態] タブで追加された信号の仕様を変更することで、個々の信号の既定の構成をオーバーライドできます。既定の設定を適用する場合は、[信号/状態] タブで [ストレージ クラス]Model default: Localizable に設定します。選択した信号に対して、同じストレージ クラス Localizable を保持するが、次元は保持しないようにする場合、[ストレージ クラス]Localizable を指定し、[PreserveDimensions] プロパティをクリアします。

[ストレージ クラス]Model default を指定した場合、[データの既定の設定] タブで指定された既定の構成をオーバーライドすることはできません。既定のストレージ クラスの既定の仕様をオーバーライドするには、そのストレージ クラスを選択し、個々のモデリング要素の構成を変更します。

この例では、[ストレージ クラス]Localizable に設定します。編集アイコンをクリックし、[識別子] プロパティに VolumeController などの信号名を指定します。[PreserveDimensions] プロパティがクリアされていることを確認します。

setSignal(cm,vol_outPort, "StorageClass", "Localizable", "Identifier", "VolumeController", ...
    "PreserveDimensions", 0);

コードを生成してレビューします。

evalc("slbuild('PreserveArrayDims')");

生成されたコードでは、その個別の信号の次元は保持されませんが、他の信号の次元は保持されます。

file = fullfile("PreserveArrayDims_ert_rtw",...
    "PreserveArrayDims.c");
coder.example.extractLines(file,"/* Definition for custom storage class: Localizable */", ...
    "static real_T rtVolumedifference",0,1);
static real_T LogSignal[11][9];        /* '<S2>/Log volume difference' */
real_T VolumeController[6];            /* '<S3>/Gain' */
static real_T rtIterationCount[2][3];  /* '<S2>/PreviousVolumeErrorAverage' */
static real_T rtIterationCount_g[2][3];/* '<S2>/IterationCount' */
static real_T rtVolumedifference[2][3];/* '<S1>/Volume difference' */

次元を保持するためにサポートされているストレージ クラス

次のストレージ クラスに対して、生成されたコードで次元を保持できます。

  • Const

  • Volatile

  • ConstVolatile

  • ExportToFile

  • ImportFromFile

  • FileScope

  • Localizable

  • GetSet

新しいストレージ クラスの次元の保持

独自のストレージ クラスを設計する際に次元を保持するには、Embedded Coder ディクショナリのプロパティ インスペクターで [ストレージ タイプ]Unstructured に設定し、[配列の次元を保持] プロパティを選択します。このプロパティを選択すると、ストレージ クラスのインスタンスの次元が保持されます。そのストレージ クラスを使用するには、コード マッピング エディターで、[ストレージ クラス] に作成した新しいストレージ クラスを指定して、モデル要素カテゴリを構成します。

カスタム ストレージ クラス デザイナーで独自のストレージ クラスを設計する際に次元を保持するには、[タイプ]Unstructured を指定し、[配列の次元を保持] プロパティを選択します。[配列の次元を保持] には、以下のオプションがあります。

  • No (既定の設定) — 生成されたコードで、多次元配列を 1 次元にフラット化します。

  • Yes — 指定したストレージ クラスのパラメーターの配列の次元を保持します。

  • Instance Specific — ストレージ クラスの各インスタンスの配列の次元を保持する場合は、パラメーター オブジェクトに対して [配列の次元を保持] プロパティを有効にします。Simulink パッケージの場合、このプロパティの設定は既定で Instance Specific になっています。

制限

  • コード ジェネレーターは、データ オブジェクトのないパラメーターの次元を保持しません。

  • N 次元のベクトルについては、N 次元のインデックスが指定されている場合でも、コード ジェネレーターは常に 1 次元配列を生成します。

  • コード ジェネレーターは、生成されたサービス インターフェイス コードによって呼び出されるターゲット環境サービス関数からアクセスされる場合、生成された C コード内の多次元配列をフラット化します。