柔軟な信号サイズのためのシンボリック次元を使用したコードの生成
Simulink® のシンボリック次元は、モデルにおける信号の次元を表します。モデルのビルド時に固定の数値を使用して次元を表す代わりに、シンボルを使用します。信号の次元を指定する必要があるあらゆる状況 (ブロックやデータ オブジェクトなど) で、数値の代わりにシンボリック次元を使用できます。
シンボリック次元をもつモデルの場合、Simulink のブロック線図全体にシンボリック次元が伝播されます。Embedded Coder® を使用してコードを生成すると、シンボリック次元がプリプロセッサの条件として生成コードに含まれるため、コードが柔軟になり、コードを再生成することなくさまざまな次元で動作できるようになります。シンボリック次元をもつモデルの作成の詳細については、Create a Model with Symbolic Dimensionsを参照してください。
シンボリック次元用のストレージ クラス
シンボリック次元を実装するには、シンボリック次元を表す Simulink.Parameter オブジェクトをベース ワークスペースまたはデータ ディクショナリで作成します。コード生成を正常に行うには、Simulink.Parameter オブジェクトのストレージ クラスが次のいずれかでなければなりません。
ヘッダー ファイルが指定された
Define、ImportedDefine指定されたヘッダー ファイル内でデータをマクロとして定義するユーザー定義のカスタム ストレージ クラス
ImportedDefine カスタム ストレージ クラスをもつ Simulink.Parameter オブジェクトの場合は、ヘッダー ファイルが MATLAB パス上にあることを確認してください。そのヘッダー ファイルの名前を Simulink.Parameter ダイアログ ボックスで [HeaderFile] ボックスに入力します。
ストレージ クラスの詳細については、生成されたコードでのデータ表示を制御するストレージ クラスの選択を参照してください。
シンボリック次元をもつ C コードの生成
シンボリック次元をもつモデルのコードを生成する前に、シミュレーションが正常に実行されることを確認します。シンボリック次元を処理できるかどうかは Simulink ブロックごとに異なります。シンボリック次元を扱えるブロックもあれば、エラーが生成されるブロックもあります。サポートされていないブロックも、シンボリック次元を操作しない限りは、シンボリック次元を含むモデルで動作します。
ヒント
シンボリック次元の機能をサポートする Simulink ブロックを調べるには、MATLAB コマンド プロンプトで「showblockdatatypetable」と入力し、ブロック サポート テーブルを確認します。
設計モデル
この例では、Inport ブロックと Outport ブロックの信号の次元をシンボリック次元として定義します。

シンボリック次元の定義
ベース ワークスペースで
Simulink.ParameterオブジェクトSを作成します。S = Simulink.Parameter;
Valueフィールドを使用してSの信号の次元サイズを 3 に設定し、データ型をdoubleに設定します。S.Value = 3; S.DataType = "double";
Inport ブロック
In1の [ブロック パラメーター] ダイアログ ボックスを開きます。既定では、[端子の次元] パラメーターは-1に設定されています。これは、接続されている信号から端子に次元が継承されることを示します。シンボリック次元Sを使用して [端子の次元] パラメーターを設定します。同様に、In2、In3、およびOut1の [端子の次元] をSに変更します。[デバッグ] タブの [診断] セクションで、[情報のオーバーレイ]、[信号の次元] を選択します。
モデルのシミュレーションを実行します。Simulink のブロック線図全体にシンボリック次元が伝播されることを確認します。
コードの生成
このモデルのコードを生成するには、Embedded Coder アプリを開きます。
コード マッピング エディターの [パラメーター] タブで、
Sのストレージ クラスをCompilerFlagに設定します。詳細については、ストレージ クラス プロパティを参照してください。Embedded Coder からコードをビルドするときにシンボリック次元を指定するには次のようにします。[コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成]、[カスタム コード] ペインで、[コード情報] タブを選択し、[定義] ボックスに「
S=3」と入力します。[OK] をクリックします。[コード生成] ペイン: カスタム コード: 追加のビルド情報: 定義を参照してください。
[C コード] タブで、[ビルド] をクリックします。
コード ジェネレーターにより、現在の作業フォルダーにフォルダー
model_name_ert_rtwが作成され、そのフォルダーにソース コード ファイルが保存されます。生成されたコードを表示します。Inport ブロックと Outport ブロックに対して、
model_name.hでシンボリック次元が定義されています。typedef struct { real_T In1[S]; /* '<Root>/In1' */ real_T In2[S]; /* '<Root>/In2' */ real_T In3[S]; /* '<Root>/In3' */ } ExtU_slexVariantDimension_T; typedef struct { real_T Out1[S]; /* '<Root>/Out1' */ } ExtY_slexVariantDimension_T;Inport ブロックと Outport ブロックの配列のサイズがシンボリック次元のサイズ
Sを使用して定義されています。model_name.cで、ループ境界の計算にシンボリック次元が使用されています。void slexVariantDimension_step(void) { int32_T i; for (i = 0; i < S; i++) { slexVariantDimension_Y.Out1[i] = (2.0 * slexVariantDimension_U.In1[i] + 3.0 * slexVariantDimension_U.In2[i]) + slexVariantDimension_U.In3[i]; }