メインコンテンツ

再利用可能なライブラリ サブシステム向けのライブラリベースのコード生成

ライブラリベースのコード生成は、モデルで共有できる一連の再利用可能なコンポーネントのコードを生成する方法を提供します。最上位の再利用可能なライブラリ サブシステムごとに、サブシステム インターフェイスを制限する一連の関数インターフェイスを指定します。関数インターフェイスは、サブシステム入出力ブロック パラメーター設定とモデル コンフィギュレーション パラメーター設定で構成されます。

関数インターフェイスは、付随するライブラリと一緒に保存する独立したモデルです。再利用可能なライブラリ サブシステムのインスタンスを含むモデル用のコードを生成する前に、ライブラリ用のコードを生成します。ライブラリベースのコード生成により、ライブラリがコードの所有者となります。個別のモデルをコードの所有者にするために、再利用可能なライブラリ サブシステム用のコードを共有ユーティリティ フォルダーに生成できます。詳細については、モデル間で共有されるライブラリ サブシステムからの再利用可能なコードの生成を参照してください。

モデルとライブラリの例

関数インターフェイスとライブラリベースのコード生成を使用する方法を示すために、この例ではモデル LibraryCodeGeneration とライブラリ LibraryCodeGenerationLibrary を使用しています。このモデルには、再利用可能なライブラリ サブシステム Atomic_Controller の 2 つのインスタンスが含まれています。Atomic_Controller_Single では、入力信号のデータ型は single です。Atomic_Controller_Double では、入力信号のデータ型は double です。モデルとライブラリのファイルを開くために、MATLAB コマンド プロンプトで、次のように入力します。

LibraryCodeGeneration
LibraryCodeGenerationLibrary

再利用可能なライブラリ サブシステムの構成

ライブラリベースのコード生成を実行するには、ライブラリ サブシステムを再利用可能として構成する必要があります。

  1. Subsystem ブロック パラメーターのダイアログ ボックスで、[Atomic サブシステムとして扱う] を選択します。

  2. [コード生成] タブで以下のようにします。

    • [関数のパッケージ化][再利用可能な関数] に設定します。

    • 次の表に基づいて、[関数名オプション] パラメーターと [ファイル名オプション] パラメーターを設定します。この表は、コード ジェネレーターによるコードの生成方法を要約しています。この表の目的のため、Subsystem ブロックの名前は mySubsystem で、[ユーザー指定] オプションの [ファイル名] の値は myFunction であるものと仮定しています。

      関数名オプションファイル名オプション生成される関数名生成されるファイル名
      自動自動mySubsystem_checksummySubsystem_checksum.c, mySubsystem_checksum.h
      サブシステム名を使用コード生成はサポートされていません。
      関数名を使用mySubsystem_checksummySubsystem_checksum.c, mySubsystem_checksum.h
      ユーザー指定コード生成はサポートされていません。
      サブシステム名を使用自動コード生成はサポートされていません。
      サブシステム名を使用コード生成はサポートされていません。
      関数名を使用コード生成はサポートされていません。
      ユーザー指定コード生成はサポートされていません。
      ユーザー指定自動mySubsystem_SinglemySubsystem_Single.c, mySubsystem_Single.h
      サブシステム名を使用コード生成はサポートされていません。
      関数名を使用mySubsystem_SinglemySubsystem_Single.c, mySubsystem_Single.h
      ユーザー指定 (この指定は、ユーザー指定の関数名とファイル名が同じ場合にのみサポートされます。)myFunction_SinglemyFunction_Single.c, myFunction_Single.h

      メモ

      [関数名オプション] または [ファイル名オプション][ユーザー指定] に設定するときは、指定に $R を含める必要があります。コード ジェネレーターは $R を関数インターフェイス名に展開します。

Subsystem ブロック パラメーターの詳細については、Subsystem を参照してください。

固有の関数インターフェイス名の指定

同じ再利用可能なライブラリ サブシステムに対応する各関数インターフェイスには、固有の名前が必要です。固有の名前を指定するには、次の手順に従います。

  1. Subsystem ブロック パラメーターのダイアログ ボックスの [コード生成] タブで、[関数名オプション] パラメーターを User specified に設定します。

  2. [関数名] パラメーターに、$N トークンと $R トークンを指定します。$R トークンは、関数インターフェイス名を表します。$N トークンは、サブシステム名を表します。

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

  4. ライブラリで、サブシステムを右クリックし、[C/C++ 関数インターフェイス]、[関数インターフェイスの作成] を選択します。[関数インターフェイスの作成] ダイアログ ボックスの [名前] パラメーターに、コンテキストを説明する名前を指定します。

関数インターフェイスの構成と管理

モデル LibraryCodeGeneration には、再利用可能なライブラリ サブシステム Atomic_Controller の 2 つのインスタンスが含まれています。各インスタンスは関数インターフェイスを表します。ライブラリ LibraryCodeGenerationLibrary で、再利用可能なライブラリ サブシステム Atomic_Controller の下部の右端にあるバッジを右クリックします。[関数インターフェイスの管理] を選択します。2 つの関数インターフェイスの名前は SingleDouble です。これは、Atomic_Controllersingledouble のデータ型を取るためです。

関数インターフェイスを作成するには、ライブラリでサブシステムを右クリックし、[C/C++ 関数インターフェイス]、[関数インターフェイスの作成] を選択します。関数インターフェイスの [名前] を指定します。

次に、関数インターフェイスを構成するために、次のいずれかの方法を選択します。

モデルからの関数インターフェイスの指定

再利用可能なライブラリ サブシステムのリンクされたインスタンスから関数インターフェイスを作成するには、次のようにします。

  1. ライブラリで、再利用可能なライブラリ サブシステムの下部の右端にあるバッジを右クリックして [関数インターフェイスの作成] を選択します。ダイアログ ボックスで [関数インターフェイスを作成するためのライブラリ ブロック インスタンスを指定] パラメーターを選択します。

  2. [インスタンスをもつ Simulink モデル] パラメーターで、サブシステムを含むモデルを選択します。

  3. [ライブラリ ブロック インスタンス名] パラメーターで、サブシステムを選択します。

  4. [OK] をクリックして [関数インターフェイスの作成] ダイアログ ボックスを閉じます。

  5. 関数インターフェイスごとに上記の手順を繰り返します。

メモ

リンクされた再利用可能なライブラリ サブシステムのインスタンスを含むモデル内から関数インターフェイスを作成することができます。[コード] パースペクティブを開いている必要があります。[コード] パースペクティブを開くには、[アプリ] メニューから、[Embedded Coder] を選択します。サブシステムに関数インターフェイスがある場合、サブシステムの右下隅にバッジが表示されます。バッジを右クリックして、[関数インターフェイスの作成] を選択します。サブシステムに関数インターフェイスがない場合は、サブシステムを右クリックし、[C/C++ 関数インターフェイス][関数インターフェイスの作成] を選択します。

既存の関数インターフェイスのエクスポートおよび構成

関数インターフェイスをエクスポートして独立モデルとして構成するには、次のようにします。

  1. ライブラリで、再利用可能なライブラリ サブシステムの下部の右端にあるバッジを右クリックし、[関数インターフェイスの管理] を選択します。

  2. 変更する関数インターフェイスを選択します。

  3. [エクスポート] をクリックします。

  4. [名前を付けて保存] ウィンドウで、現在の作業フォルダーを指定します。エクスポートされる関数インターフェイスは .slx ファイルで、関数インターフェイス名に _export が付加された名前となります。

  5. エクスポートされたモデルを開きます。サブシステム入出力ブロック パラメーター設定とモデル構成パラメーター設定に変更を加えます。モデルを保存します。

  6. ライブラリで、再利用可能なライブラリ サブシステムを右クリックし、[C/C++ 関数インターフェイス]、[関数インターフェイスの作成] を選択します。関数インターフェイスの [名前] を指定します。

  7. [インスタンスをもつ Simulink モデル] パラメーターで、現在の作業フォルダーにあるエクスポートしたモデルを選択します。

  8. [ライブラリ ブロック インスタンス名] パラメーターで、サブシステムを選択します。

  9. [OK] をクリックして [関数インターフェイスの作成] ダイアログ ボックスを閉じます。

ライブラリ内からの関数インターフェイスの構成

  1. ライブラリで、サブシステムの下部の右端にあるバッジを右クリックして [関数インターフェイスの設定] を選択します。

  2. [関数インターフェイスの設定] ダイアログ ボックスで、サブシステムの入力と出力に対して、[データ型][次元][信号タイプ] の各パラメーターの値を指定します。サブシステムの入力と出力のパラメーター設定を変更するには、前のセクションのエクスポート方法に従ってください。

  3. モデル コンフィギュレーション パラメーターを変更するには、歯車ボタンをクリックして、変更を加えます。[適用] をクリックします。[コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。

  4. 関数インターフェイスをインスタンス モデルからの既存のインターフェイスで置き換えるには、[インスタンスを使用して再生成] を選択します。

  5. [インスタンスをもつ Simulink モデル] パラメーターと [ライブラリ ブロック インスタンス名] パラメーターの値を指定します。[再生成] をクリックします。

  6. [適用] をクリックして [関数インターフェイスの設定] ダイアログ ボックスを閉じます。

ライブラリのビルド

ライブラリ内のサブシステムの関数インターフェイスを指定した後、ライブラリ用のコードを生成します。モデル用のコードを生成する前に、ライブラリ用のコードを生成する必要があります。コード ジェネレーターは、ライブラリ コードを個別の C ライブラリとしてパッケージ化します。生成されたライブラリ用のコードは、ハードウェア設定に対応するフォルダーに格納されます (IntelWin64 など)。ライブラリ コードのフォルダーは、ライブラリと同じ名前になり、ライブラリと同じ階層レベルになければなりません。

コードを生成するために、ライブラリのロックが解除されていることを確認します。Embedded Coder アプリを開き、[ビルド] をクリックします。

LibraryCodeGenerationLibrary ライブラリのコードを生成すると、LibraryCodeGenerationLibrary フォルダーに以下の .c ファイルと .h ファイルが格納されます。

  • Atomic_Controller_Single.h

  • Atomic_Controller_Single.c

  • Atomic_Controller_Double.h

  • Atomic_Controller_Double.c

これらの関数名は、Subsystem ブロック パラメーター ダイアログ ボックスの [関数名オプション][関数名] パラメーターの $N$R の指定を表しています。

_shared フォルダーには、共有ユーティリティ (固定小数点ユーティリティ、Lookup Table ブロック、MATLAB Function ブロックなど) のためのコード、補足ファイル、エクスポートされたパラメーターと型が格納されています。

事前に生成されたライブラリ コードを使用できる再利用可能なライブラリ サブシステムのインスタンスを含むモデル用のコードを生成すると、モデルはライブラリ コードにリンクされます。コード ジェネレーターはチェックサムを使用し、再利用可能であるかどうかを判断します。生成されたモデル用のコードは、ライブラリと同じフォルダーにある必要があります。MATLAB コマンド ラインに、次のように入力します。

Simulink.fileGenControl('set', 'CodeGenFolderStructure',...
 Simulink.filegen.CodeGenFolderStructure.TargetEnvironmentSubfolder);
詳細については、Simulink.fileGenControlを参照してください。

モデルでライブラリ コードを使用できない場合、コード生成時に Embedded Coder で警告またはエラーを生成するかどうかを指定できます。[コンフィギュレーション パラメーター] ダイアログ ボックスで、[事前生成されたライブラリ サブシステム コードが見つからない場合の動作] 診断パラメーター設定を設定します。

次のコマンドを入力することで、ライブラリ用のコードを生成するが、makefile を実行しないようにすることができます。

library='LibraryCodeGenerationLibrary'
set_param(library, 'GenCodeOnly', 'on')
slbuild(library)

メモ

S-Function を含む再利用可能なサブシステムで構成されるライブラリ用のコードを生成できます。コンパイルできないコードを避けるために、S-Function に対応する TLC 関数では、コード ジェネレーターが model.cmodel.hmodel_types.h などのモデル ファイルを操作するように指示することは避けてください。

再利用可能なライブラリ サブシステム インスタンスを含むモデルからのコードの生成

ライブラリ コードの使用対象となる再利用可能なライブラリ サブシステムのインスタンスを含むモデルからコードを生成するには、以下のようにします。

  1. モデル コンフィギュレーション パラメーター [共有コードの配置][共有場所] に設定します。

  2. Behavior when pregenerated library subsystem code is missingパラメーターの設定を指定するか、既定の設定 (warning) のままにします。

  3. [コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインの [固定ステップ サイズ] のパラメーター設定および [コード生成] ペインのパラメーター設定は、モデルおよび再利用可能なライブラリ サブシステムの関数インターフェイスの間で同一でなければなりません。設定が異なると、チェックサムが一致しなくなり、[事前生成されたライブラリ サブシステム コードが見つからない場合の動作] パラメーターの設定に応じて、警告、エラーが発生するか、またはどちらも発生しません。

  4. 再利用可能なライブラリ サブシステムで共有のローカル データ ストアを使用し、モデル データ要素に対して既定のマッピングを構成している場合は、カテゴリ [Shared local data stores] の既定のストレージ クラス マッピングを [既定] に設定したままにします。

生成された LibraryCodeGeneration 用の C コードを以下に示します。

/* Model step function */
void LibraryCodeGeneration_step(void)
{
  /* Outputs for Atomic SubSystem: '<Root>/Atomic_Controller_Double' */

  /* Inport: '<Root>/pos_rqst' incorporates:
   *  Inport: '<Root>/fbk_1'
   *  Outport: '<Root>/pos_cmd_one'
   */
  Atomic_Controller_Double(pos_rqst1, rtU.fbk_1, &rtY.pos_cmd_one,
    &rtDW.Atomic_Controller_Double);

  /* End of Outputs for SubSystem: '<Root>/Atomic_Controller_Double' */

  /* Outputs for Atomic SubSystem: '<Root>/Atomic_Controller_Single' */

  /* Inport: '<Root>/pos_rqst1' incorporates:
   *  Inport: '<Root>/fbk_2'
   *  Outport: '<Root>/pos_cmd_two'
   */
  Atomic_Controller_Single(pos_rqst2, rtU.fbk_2, &rtY.pos_cmd_two,
    &rtDW.Atomic_Controller_Single);

  /* End of Outputs for SubSystem: '<Root>/Atomic_Controller_Single' */
}

コードには Atomic_Controller_Single 関数と Atomic_Controller_Double 関数の呼び出しが含まれています。生成されたコードは、事前生成されたライブラリ コードから関数定義を取得します。

再利用可能なライブラリ サブシステムから生成されたコードの検証

検証ワークフロー

Simulink® Test™ ソフトウェアを使用している場合は、再利用可能なライブラリ サブシステムから生成したコードを検証できます。次のワークフローを使用します。

  1. 一意のサブシステムと関数インターフェイスのペアのライブラリ内にテスト ハーネスを作成します。

  2. SIL/PIL マネージャーで次のようにします。

    1. サブシステムのノーマル モード シミュレーションとソフトウェアインザループ (SIL) またはプロセッサインザループ (PIL) のシミュレーションを実行します。

    2. シミュレーション データ インスペクターで数値の結果を比較します。

    3. Simulink Coverage™ 解析レポートを表示します。

詳細については、Test Library Blocks (Simulink Test)を参照してください。

検証ワークフローの制限

検証ワークフローでは、以下はサポートされません。

  • Function-Call Subsystem ブロック。

  • ゼロクロッシング イベントを使用する Triggered Subsystem ブロックまたはサブシステム。

  • For Each Subsystem ブロック。

  • Stateflow® チャート サブシステム。

  • Inports/Outports の数値がグラフィカル インターフェイスの Inports/Outports の数値と一致しない関数インターフェイス。

  • ExportToFile ストレージ クラスを使用するパラメーター。

  • Mux ブロックまたは Demux ブロックによってフィードされる Outport ブロックを持つサブシステム。

  • Inport ブロックとして渡されるバーチャル バス。

  • ExportedGlobal ストレージ クラスを使用する Data Store Memory ブロック。

  • サブシステム コード外部でデータが初期化されるブロック (例: Width ブロック)。

  • コード カバレッジの強調表示と注釈。

  • 信号と状態データのログ。

これらのケースでは、再利用可能なライブラリ サブシステムのインスタンスを含むモデルを作成し、SIL/PIL マネージャーを使用して SIL または PIL シミュレーションを実行します。

制限

コード ジェネレーターはチェックサムを使用して再利用可能であるかどうかを判断するため、再利用可能なライブラリ サブシステムを共有するモデル用のコード生成に適用されるのと同じ制限が、ライブラリベースのコード生成にも適用されます。制限を参照してください。以下の制限も適用されます。

  • 別の再利用可能なライブラリ サブシステム内にある再利用可能なライブラリ サブシステムに関数インターフェイスを指定することはできません。

  • 再利用可能なライブラリ サブシステムの関数インターフェイスにコンフィギュレーション参照を適用することはできません。コンフィギュレーション セットを比較するには、関数インターフェイスを別のモデルにエクスポートし、コンフィギュレーション セットを MATLAB® スクリプトにエクスポートします。詳細については、コンフィギュレーション セットを保存するを参照してください。

  • ERT および ERT 派生のシステム ターゲット ファイルのみがライブラリベースのコード生成をサポートします。

  • 同じ再利用可能なライブラリ サブシステムに対応する各関数インターフェイスは固有である必要があります。

  • Windows プラットフォームでは、ライブラリに lib.slx という名前を付けることは避けてください。こうすると、スタティック ライブラリのコンパイル プロセスに干渉する可能性があります。

  • ライブラリからコードを生成するときに、コード ジェネレーターはライブラリ内の最上位の再利用可能なサブシステムに対してのみコードを生成します。最上位のライブラリ サブシステムはクライアント モデル内の任意のレベルでインスタンス化することができ、クライアント モデル内のインスタンスはライブラリ コードがあればそれを再利用します。

  • ライブラリ サブシステムは、Enable ブロック パラメーター [イネーブル時の状態]reset に設定された Enabled Subsystem ブロック内にコードがある場合、そのコードを再利用できません。

  • 生成された複数の関数を単一のファイル内に配置することはできません。

参考

トピック