Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

モデル間で共有されるライブラリ サブシステムからの再利用可能なコードの生成

再利用可能なライブラリ サブシステムとは

再利用可能なライブラリ サブシステムとは、ライブラリにインクルードされ、再利用できるように構成されたサブシステムです。ライブラリでサブシステムを定義し、そのサブシステムを再利用できるよう設定して、モデル間でサブシステムを再利用しなければなりません。

共通の機能を再利用するために、サブシステムの複数インスタンスを以下のような範囲で含めることができます。

  • 最上位モデルまたはモデル参照階層の一部である単一のモデル内

  • モデル参照階層の複数の参照モデルにまたがる

  • Model ブロックを含む複数の最上位モデルにまたがる

  • Model ブロックを含まない複数の最上位モデルにまたがる

コード ジェネレーターはチェックサムを使用し、再利用可能であるかどうかを判断します。コード ジェネレーターがサブシステム コードを再利用できない場合があります。

インクリメンタルなコード生成では、再利用可能なライブラリ サブシステムが変更されると、それ自身とその親のリビルドが行われます。ビルド中、一致する関数が見つからない場合は、再利用可能な関数の新しいインスタンスが共有ユーティリティ フォルダーに生成されます。前回のビルドに別の一致した関数が見つかった場合はその関数が使用され、新しい再利用可能な関数は発行されません。

その後のビルドでも、未使用のファイルが置き換えられたり、フォルダーから削除されることはありません。モデルの開発中に共有ユーティリティ フォルダーに多数の不要な古い共有関数が存在しているときには、フォルダーを削除してコードを再生成できます。再利用可能なライブラリ サブシステムのすべてのインスタンスがモデル参照階層から削除され、コードが再生成された場合であっても、古い共有関数は明示的に削除しない限り共有ユーティリティ フォルダーに残されています。

モデルが変更され、その変更によってサブシステムに異なるコードが生成される可能性がある場合には、再利用可能な関数が新しく生成されます。たとえば、モデル コンフィギュレーション パラメーターによってコードのコメントが変更されると、再利用可能なライブラリ サブシステムに変更がなかったとしても、サブシステムに異なるコードが生成される可能性があります。

Embedded Coder のユーザーは、再利用できるように構成されたサブシステムが含まれているライブラリからコードを生成できます。詳細については、Library-Based Code Generation for Reusable Library Subsystems (Embedded Coder)を参照してください。

再利用可能なライブラリ サブシステム コードの配置と命名

再利用可能なライブラリ サブシステムの生成コードは、モデルの生成コードからは独立しています。再利用可能なライブラリ サブシステムのコードは、モデル参照階層フォルダーではなく、共有ユーティリティ フォルダー slprj/target/_sharedutils に生成されます。サポートする型用の生成コードは .h ファイルに生成され、共有ユーティリティ フォルダーにも配置されます。

名前が一意になるように、再利用可能な関数の名前には、再利用可能なライブラリ サブシステム名の末尾にチェックサムが追加されます。たとえば、サブシステム SS1 のコードおよびファイルが再利用可能なライブラリ サブシステム RLS にリンクされている場合、関数名およびファイル名は次のようになります。

  • 関数名: RLS_mgdjlngd

  • ファイル名:RLS_mgdjlnd.c および RLS_mgdjlnd.h

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

サブシステム パラメーターを以下に示すように設定します。

  • [Atomic サブシステムとして扱う] を選択します。

  • [コード生成] タブで、

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

    • [関数名オプション] パラメーターと

      [ファイル名オプション] パラメーターを次のいずれかの組み合わせに設定します。

      • [関数名オプション] および [ファイル名オプション]Auto に設定する。

      • [関数名オプション]Use subsystem name に設定し、[ファイル名オプション]Use function name に設定する。

      • [関数名オプション]User specified に設定し、[ファイル名オプション]Auto または Use function name に設定する。

      • [関数名オプション]User specified に設定し、[ファイル名オプション]User specified に設定する。[関数名][ファイル名] パラメーターに同じ値を設定する。

モデル参照階層において、再利用可能なライブラリ サブシステムのインスタンスが最上位モデルにある場合は、[コンフィギュレーション パラメーター] ダイアログ ボックスの [モデル参照] ペインで、[コード生成で固定サイズのスカラーのルート入力を値渡しで行う] パラメーターを選択しなければなりません。このパラメーターを選択しない場合には、最上位モデルの再利用可能なライブラリ サブシステムのインスタンスに別の共有関数が生成され、参照モデルのインスタンスに再利用可能な関数が生成されます。

再利用可能なライブラリ サブシステムがルートの出力端子に接続される場合には、ルートの出力端子に接続されていない同一のサブシステムでは再利用されません。ただし、[最適化] ペインで、[再利用可能なサブシステムの出力を渡す][個々の引数] に設定すれば、これらのサブシステム間で再利用が確実に行われるようになります。このパラメーターには Embedded Coder® のライセンスが必要です。

ライブラリの作成についての詳細は、カスタム ライブラリを参照してください。再利用可能なライブラリ サブシステムを含む作成例については、モデル間で共有されるサブシステムの再利用可能なコードの生成を参照してください。

再利用可能なライブラリ サブシステムを含むモデルの設定

再利用可能なライブラリ サブシステムを使用するモデルの場合は、モデルが参照モデルか、最上位モデルかによってモデルを異なる方法で設定しなければなりません。サブシステムが参照モデルの階層構造内にある場合は、コンフィギュレーション パラメーター共有コードの配置[自動] に設定します。参照モデルの階層構造内にない場合は、サブシステムを使用する各モデルに対して、モデル コンフィギュレーション パラメーター [共有コードの配置][共有場所] に設定します。

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

モデル間で共有されるサブシステムの再利用可能なコードの生成

この例では、参照モデル間で共有されるサブシステムにおいて再利用可能なライブラリ サブシステムを構成し、再利用可能な関数を生成する方法を示します。再利用可能なサブシステムのコードが、共有ユーティリティ フォルダー (slprj/target/_sharedutils) に生成されます。

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

  1. Simulink エディターで、[シミュレーション] タブの [新規]、[ライブラリ] を選択します。[Simulink スタート ページ] ウィンドウから [空のライブラリ] を選択します。rtwdemo_ssreuse を開き、サブシステム SS1 をコピーし、ライブラリ エディターに貼り付けます。これにより、SS1 の変数がベース ワークスペースに読み込まれます。サブシステム ブロックの名前を RLS に変更します。

  2. Subsystem ブロックをクリックし、Ctrl + U キーを押して、サブシステム RLS の内容を表示します。

  3. サブシステムを構成するために、ライブラリ エディターで RLS を右クリックします。コンテキスト メニューで、[ブロック パラメーター (Subsystem)] を選択します。[Subsystem のパラメーター] ダイアログ ボックスで、次のオプションを選択します。

    • [Atomic サブシステムとして扱う] を選択します。

    • [コード生成] タブで、

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

      • [関数名オプション][ユーザー指定] に設定し、[関数名]myfun に設定されていることを確認します。

      • [ファイル名オプション][自動] に設定します。

  4. [適用] をクリックし、[OK] をクリックします。

  5. ssreuselib という名前で再利用可能なライブラリ サブシステムを保存すると、ssreuselib.slx というファイルが作成されます

モデルの例の作成

  1. ssreuselib から RLS のインスタンスを 1 つ含むモデルを作成します。このサブシステムに SS1 という名前を付けます。サブシステムをもう 1 つ追加し、SS2 という名前を付けます。モデルに ex_model1 という名前を付けます。

  2. ssreuselib から RLS のインスタンスを 1 つ含むモデルをもう 1 つ作成します。このサブシステムに SS1 という名前を付けます。サブシステムをもう 1 つ追加し、SS3 という名前を付けます。モデルに ex_model2 という名前を付けます。

  3. ex_model1ex_model2 を参照する 2 つの Model ブロックをもつ最上位モデルを作成します。最上位モデルを ex_mdlref_ssreuse という名前で保存します。

最上位モデルのコンフィギュレーション パラメーターの設定

  1. モデル ex_mdlref_ssreuse を Simulink エディターで開き、[C コード] タブで [設定] をクリックし、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

  2. [ソルバー] ペインで、[タイプ][固定ステップ] に設定します。

  3. [モデル参照] ペインで、[コード生成で固定サイズのスカラーのルート入力を値渡しで行う] を選択します。

  4. [コード生成]、[レポート] ペインで、[コード生成レポートを作成][レポートを自動的に開く] を選択します。

  5. [コード生成]、[インターフェイス] ペインで、共有コードの配置[共有場所] に設定します。

  6. [コード生成]、[識別子] ペインで、[識別子の最大の長さ]256 に設定します。このステップはオプションです。

  7. [適用] をクリックし、[OK] をクリックします。

コンフィギュレーション参照の作成と伝播

  1. Simulink エディターの [モデル化] タブで、[モデル エクスプローラー] をクリックしてモデル エクスプローラーを開きます。モデル エクスプローラーの左側のナビゲーションで、ex_mdlref_ssreuse ノードを展開します。

  2. ex_mdlref_ssreuse ノードの下で [コンフィギュレーション] ノードを選択します。[コンテンツ] ペインで [コンフィギュレーション] を右クリックし、[コンフィギュレーション参照に変換] を選択します。

  3. [アクティブなコンフィギュレーションを参照に変換] ダイアログ ボックスで、[OK] をクリックします。これにより、モデル コンフィギュレーション セットがコンフィギュレーション参照 Simulink.ConfigSetRef に変換され、コンフィギュレーション セット オブジェクト configSetObj がベース ワークスペースに作成されます。

  4. 左側のナビゲーションで、[Reference (Active)] を右クリックし、[参照モデルへ伝播] を選択します。

  5. [参照モデルへのコンフィギュレーション参照の伝播] ダイアログ ボックスで、リスト内の参照モデルを選択します。[伝播] をクリックします。

これで、最上位モデルおよび参照モデルは、同一のコンフィギュレーション参照 Reference (Active) (モデル コンフィギュレーション参照オブジェクト configSetObj をポイント) をベース ワークスペースで使用します。また、モデルを保存するときは、configSetObj を MAT ファイルにエクスポートする必要があります。

コードの生成と表示

  1. コードを生成するには、Simulink エディターで、Ctrl+B キーを押します。コードが生成されると、コード生成レポートが表示されます。

  2. 参照モデルのコード生成レポートを表示するには、左側のナビゲーション ペインの [Referenced Models] セクションで、ex_model1 を選択します。コード生成レポートに ex_model1 で生成されたファイルが表示されます。

  3. 左側のナビゲーション ペインで [Shared files] を展開します。コード ジェネレーターは、再利用可能なライブラリ サブシステム名を使用します。サブシステム SS1 のコードは、myfun.cmyfun.h に記述されます。

  4. [戻る] をクリックして、コード生成レポート ex_model2 に戻ります。ex_model2 では、ex_model1 のコードと同じ myfun.cmyfun.h のソース コードが使用されています。実際の場合には、サブシステム関数およびファイルの名前はこれとは異なります。

関連するトピック