柔軟な信号サイズのためのシンボリック次元を使用したコードの生成
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]; }