Main Content

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    #include "SS1.h"
    
    /* Include model header file for global data */
    #include "rtwdemo_atomic.h"
    #include "rtwdemo_atomic_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. サブシステムをもつモデル (rtwdemo_atomic など) を開きます。

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

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

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

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

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

    Embedded Coder を使用している場合は、[関数インターフェイス] パラメーターが void_void に設定されていることを確認します。詳細については、Generate Predictable Function Interface to Match Graphical Block Interface (Embedded Coder)を参照してください。

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

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

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

    #include "SS1.h"
    
    /* Include model header file for global data */
    #include "rtwdemo_atomic.h"
    #include "rtwdemo_atomic_private.h"
    
    /* Outputs for atomic system: '<Root>/SS1' */
    void myfun(void)
    {
      /* Outport: '<Root>/Out1' incorporates:
       *  DiscreteIntegrator: '<S1>/Integrator'
       */
      rtwdemo_atomic_Y.Out1 = rtwdemo_atomic_DW.Integrator_DSTATE;
    }
    
    /* Update for atomic system: '<Root>/SS1' */
    void myfun_Update(void)
    {
      /* Update for DiscreteIntegrator: '<S1>/Integrator' */
      rtwdemo_atomic_DW.Integrator_DSTATE += rtwdemo_atomic_B.Sum;
    }

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

関連するトピック