生成コードでの多次元配列の次元の保持
既定では、多次元のモデル データについて、生成コードには 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' */
次元を保持するための個々のモデル データ要素の構成
[入力端子]、[出力端子]、[パラメーター]、[データ ストア]、および [信号/状態] などの他のタブで個々のモデル データ要素のソースを構成することで、[データの既定の設定] タブで指定された既定の構成をオーバーライドできます。以下に、モデル データ要素カテゴリに適用可能なワークフローの例を示します。
コード マッピング エディターへの信号の追加
[C コード] タブから、[コード インターフェイス]、[個々の要素コードのマッピング] を開きます。
コード マッピング エディターで [信号/状態] タブを選択します。[信号] セクションは現在空です。特定のモデルには、複数の信号が存在する場合があります。コード生成を構成する際、これらの信号の一部は重要ではない場合があります。コード生成の構成に関連する対象の信号として、信号をマークできます。信号を明示的に追加すると、その信号はコード マッピング エディターに追加されます。
コード マッピング エディターで、[信号/状態] タブを開きます。Simulink® エディターで、コード マッピング エディターに追加する信号を選択します。この例では、サブシステム Volume Controller から Outport Actuator Command に向かう信号を選択します。信号線の上または下に表示されている省略記号 (...) にカーソルを合わせて、アクション バーを開きます。[選択した信号をコード マッピングに追加] ボタンをクリックします。その信号が、コード マッピング エディターの [信号] テーブルに追加されます。

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' */
次元を保持するためにサポートされているストレージ クラス
次のストレージ クラスに対して、生成されたコードで次元を保持できます。
ConstVolatileConstVolatileExportToFileImportFromFileFileScopeLocalizableGetSet
新しいストレージ クラスの次元の保持
独自のストレージ クラスを設計する際に次元を保持するには、Embedded Coder ディクショナリのプロパティ インスペクターで [ストレージ タイプ] を Unstructured に設定し、[配列の次元を保持] プロパティを選択します。このプロパティを選択すると、ストレージ クラスのインスタンスの次元が保持されます。そのストレージ クラスを使用するには、コード マッピング エディターで、[ストレージ クラス] に作成した新しいストレージ クラスを指定して、モデル要素カテゴリを構成します。
カスタム ストレージ クラス デザイナーで独自のストレージ クラスを設計する際に次元を保持するには、[タイプ] に Unstructured を指定し、[配列の次元を保持] プロパティを選択します。[配列の次元を保持] には、以下のオプションがあります。
No(既定の設定) — 生成されたコードで、多次元配列を 1 次元にフラット化します。Yes— 指定したストレージ クラスのパラメーターの配列の次元を保持します。Instance Specific— ストレージ クラスの各インスタンスの配列の次元を保持する場合は、パラメーター オブジェクトに対して [配列の次元を保持] プロパティを有効にします。Simulink パッケージの場合、このプロパティの設定は既定でInstance Specificになっています。
制限
コード ジェネレーターは、データ オブジェクトのないパラメーターの次元を保持しません。
N 次元のベクトルについては、N 次元のインデックスが指定されている場合でも、コード ジェネレーターは常に 1 次元配列を生成します。
コード ジェネレーターは、生成されたサービス インターフェイス コードによって呼び出されるターゲット環境サービス関数からアクセスされる場合、生成された C コード内の多次元配列をフラット化します。