Main Content

サブシステム コードを別々の関数およびファイルとして生成

Atomic サブシステムを設定して個別の関数およびファイルにコードを生成できます。この結果、よりモジュール化されたコードが生成され、個々のサブシステムでコードのユニット テストを実行できます。

[関数のパッケージ化]Subsystem ブロック パラメーターには、サブシステムでコードを個々の関数として生成できる 2 つの設定があります。[再利用可能な関数] オプションでは、I/O、状態、およびパラメーターを関数の引数として渡す関数が生成されます。[再利用できない関数] オプションでは、I/O、状態、およびパラメーターを関数の引数とグローバル データ構造体の組み合わせとして渡す関数が生成されます。

サブシステム関数の依存関係

サブシステムのコードを生成するときは、サブシステム関数のコードが別のファイルに記述されている場合であっても、モデルのグローバル データ構造体を参照できます。各サブシステム コード ファイルには、依存性を説明する include 命令とコメントが含まれています。コード ジェネレーターは、循環的なファイル依存性を確認し、ビルド時にそれらについて警告を生成します。コード ジェネレーターによるコードのパッケージ化の方法については、ビルド プロセスのファイルの依存関係の管理を参照してください。

親モデルに対して生成されたコードから独立したサブシステム関数コードを生成するには、モデル間で共有されるライブラリ サブシステムからの再利用可能なコードの生成の説明に従って、サブシステムをライブラリに配置し、再利用可能なサブシステムとして構成します。

Embedded Coder® がある場合、さまざまな関数インターフェイスをもつ再利用可能なサブシステムで構成されるライブラリ用のコードを生成できます。詳細については、Library-Based Code Generation for Reusable Library Subsystemsを参照してください。

関数名オプションFile name optionsFunction packagingFile packaging format

サブシステムを再利用可能な関数として生成

1. サブシステムをもつモデル (SubsystemAtomic など) を開きます。

SubsystemAtomic

rtwdemo_atomic.png

Embedded Coder を使用している場合は、[C コード] タブで、[コードの表示] をクリックして [コード ビュー] エディターを開きます。

2. Subsystemブロックを右クリックします。コンテキスト メニューから [ブロックのパラメーター (Subsystem)] を選択します。

3. [Subsystem のパラメーター] ダイアログ ボックスで [Atomic サブシステムとして扱う] が選択されていることを確認します。このパラメーターが選択されている場合、[コード生成] タブの [関数のパッケージ化] パラメーターが利用可能になります。

4. [コード生成] タブをクリックし、[関数のパッケージ化] パラメーターから Reusable function を選択します。これにより、次の 2 つのパラメーターが有効になります。

5. [ファイル名オプション] パラメーターを Use subsystem name に設定します。

6. [適用] をクリックしてダイアログ ボックスを閉じます。

7. Embedded Coder を使用している場合は、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。モデル コンフィギュレーション パラメーターFile packaging formatが [モジュラー] に設定されていることを確認します。

8. コードを生成します。

#include "SS1.h"

/* Include model header file for global data */
#include "SubsystemAtomic.h"
#include "SubsystemAtomic_private.h"

/* Outputs for atomic system: '<Root>/SS1' */
real_T myfun(DW_myfun_T *localDW)
{
  /* DiscreteIntegrator: '<S1>/Integrator' */
  return localDW->Integrator_DSTATE;
}

/* Update for atomic system: '<Root>/SS1' */
void myfun_Update(real_T rtu_In1, DW_myfun_T *localDW)
{
  /* Update for DiscreteIntegrator: '<S1>/Integrator' */
  localDW->Integrator_DSTATE += rtu_In1;
}

再利用可能な関数 myfun は、入力および状態を引数としてサブシステム関数に渡します。

詳細については、サブシステムからの再呼び出し可能なコードの生成およびモデル間で共有されるライブラリ サブシステムからの再利用可能なコードの生成を参照してください。

サブシステムを再利用できない関数として生成

1. サブシステムをもつモデル (SubsystemAtomic など) を開きます。

SubsystemAtomic

rtwdemo_atomic.png

Embedded Coder を使用している場合は、[C コード] タブで、[コードの表示] をクリックして [コード ビュー] エディターを開きます。

2. Subsystemブロックを右クリックします。コンテキスト メニューから [ブロックのパラメーター (Subsystem)] を選択します。

3. [Subsystem のパラメーター] ダイアログ ボックスで [Atomic サブシステムとして扱う] が選択されていることを確認します。このパラメーターが選択されている場合、[コード生成] タブの [関数のパッケージ化] パラメーターが利用可能になります。

4. [コード生成] タブをクリックし、[関数のパッケージ化] パラメーターから Nonreusable function を選択します。これにより、次の 2 つのパラメーターが有効になります。

5. [ファイル名オプション] パラメーターを Use subsystem name に設定します。

6. [適用] をクリックしてダイアログ ボックスを閉じます。

7. Embedded Coder を使用している場合は、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。モデル コンフィギュレーション パラメーターFile packaging formatが [モジュラー] に設定されていることを確認します。

8. コードを生成します。

#include "SS1.h"

/* Include model header file for global data */
#include "SubsystemAtomic.h"
#include "SubsystemAtomic_private.h"

/* Outputs for atomic system: '<Root>/SS1' */
void myfun(void)
{
  /* Outport: '<Root>/Out1' incorporates:
   *  DiscreteIntegrator: '<S1>/Integrator'
   */
  SubsystemAtomic_Y.Out1 = SubsystemAtomic_DW.Integrator_DSTATE;
}

/* Update for atomic system: '<Root>/SS1' */
void myfun_Update(void)
{
  /* Update for DiscreteIntegrator: '<S1>/Integrator' */
  SubsystemAtomic_DW.Integrator_DSTATE += SubsystemAtomic_B.Sum;
}

再利用できない関数 myfun は、入力および状態をグローバル データ構造体 SubsystemAtomic_YSubsystemAtomic_DW を通じて渡します。

関連するトピック