Main Content

モデル参照階層からの再利用可能なコードの生成

参照モデルのルートの Inport ブロックまたは Outport ブロックに接続されている入力または出力をもつ再利用可能なサブシステム関数は、コードの再利用に影響する場合があります。これにより、スタンドアロン モデルでサブシステムを再利用するのと同様に参照モデル コンテキストで Atomic サブシステムを再利用できなくなる場合があります。

この例では、Model ブロック内で参照される再利用可能なサブシステムがある場合、再利用可能なコードを生成する方法を示します。

サブシステムの再利用可能なコードの生成

1. これらのブロックをサブシステムに変換します。作成するサブシステムの外枠にボックスをドラッグします。Simulink エディター ツールストリップの [複数] タブで、[サブシステムの作成] を選択します。

2. Subsystem ブロック パラメーターに以下の変更を行います。

3. 前述のサブシステムの 3 つのインスタンスを含むモデルを作成します。

4. モデル コンフィギュレーション パラメーター既定のパラメーター動作を [Inlined] に設定します。

5. モデルをビルドしてコードを生成するには、Ctrl+B を押します。

コード ジェネレーターでは、model.c ファイルで再利用されるサブシステムの関数のコピーを 1 つ生成してコードを最適化します。

void ex_codeReuseThreeSubsys_Subsystem1(real_T rtu_In1,
  B_Subsystem1_ex_codeReuseThreeSubsys_T *localB)
{
  /* Gain: '<S1>/Gain' */
  localB->Gain = 3.0 * rtu_In1;
}

参照モデルでのサブシステムの再利用可能なコードの生成

1. 再利用可能なサブシステムの 3 つのインスタンスをもつ前述のモデルを参照する Model ブロックを使用して最上位モデルを作成します。

2. 最上位モデルのコードを生成します。コード ジェネレーターは、slprj フォルダーに 3 つの異なる関数シグネチャを生成します。

/* Output and update for atomic system: '<Root>/Subsystem 1' */
void ex_codeReuseThreeSubsys_Subsystem1(const real_T *rtu_In1,
  B_Subsystem1_ex_codeReuseThreeSubsys_T *localB)
{
  /* Gain: '<S1>/Gain' */
  localB->Gain = 3.0 * *rtu_In1;
}

/* Output and update for atomic system: '<Root>/Subsystem 2' */
void ex_codeReuseThreeSubsys_Subsystem2(real_T rtu_In1,
  B_Subsystem2_ex_codeReuseThreeSubsys_T *localB)
{
  /* Gain: '<S2>/Gain' */
  localB->Gain = 3.0 * rtu_In1;
}

/* Output and update for atomic system: '<Root>/Subsystem 3' */
void ex_codeReuseThreeSubsys_Subsystem3(real_T rtu_In1, real_T *rty_Out1)
{
  /* Gain: '<S3>/Gain' */
  *rty_Out1 = 3.0 * rtu_In1;
}

3. コードの再利用のサブシステム関数を有効にするには、参照モデルに Signal Conversion ブロックを挿入します。Inport と Subsystem 1 の間に 1 つのブロック、Subsystem 3 と Outport の間にもう 1 つのブロックを配置します。

サブシステムに初期条件をもつ Merge ブロックがある場合、Signal Conversion ブロックを追加しないでください。代わりに、Bias ブロックを追加して再利用可能な関数を取得します。

4. モデル コンフィギュレーション パラメーターコード生成で固定サイズのスカラーのルート入力を値渡しで行うを選択します。

5. 最上位モデルのコードを生成します。コード ジェネレーターは、slprj フォルダー内に単一の再利用可能関数を生成します。

void ex_codeReuseSubsysSigConvert_Subsystem1(real_T rtu_In1,
  B_Subsystem1_ex_codeReuseSubsysSigConvert_T *localB,
  P_Subsystem1_ex_codeReuseSubsysSigConvert_T *localP)
{
  /* Gain: '<S1>/Gain' */
  localB->Gain = localP->Gain_Gain * rtu_In1;
}

関連するトピック