このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
モデル間で共有されるライブラリ サブシステムからの再利用可能なコードの生成
再利用可能なライブラリ サブシステムとは
再利用可能なライブラリ サブシステムとは、ライブラリにインクルードされ、再利用できるように構成されたサブシステムです。モデル間でサブシステムを再利用するには、ライブラリでサブシステムを定義し、そのサブシステムを再利用できるように構成しなければなりません。
共通の機能を再利用するために、サブシステムの複数のインスタンスを以下のような範囲で含めることができます。
最上位モデルまたはモデル参照階層の一部である単一のモデル内
モデル参照階層の複数の参照モデルにまたがる
Model ブロックを含む複数の最上位モデルにまたがる
Model ブロックを含まない複数の最上位モデルにまたがる
コード ジェネレーターはチェックサムを使用し、再利用可能であるかどうかを判断します。コード ジェネレーターがサブシステム コードを再利用できない場合があります。
インクリメンタルなコード生成では、再利用可能なライブラリ サブシステムが変更されると、それ自身とその親のリビルドが行われます。ビルド中、一致する関数が見つからない場合は、再利用可能な関数の新しいインスタンスが共有ユーティリティ フォルダーに生成されます。前回のビルドから異なる一致した関数が見つかった場合はその関数が使用され、新しい再利用可能な関数は発行されません。
その後のビルドでも、未使用のファイルが置き換えられたり、フォルダーから削除されたりすることはありません。モデルの開発中に共有ユーティリティ フォルダーに多数の旧式の共有関数が存在している場合は、フォルダーを削除してコードを再生成できます。再利用可能なライブラリ サブシステムのすべてのインスタンスがモデル参照階層から削除され、コードが再生成された場合であっても、旧式の共有関数は明示的に削除しない限り共有ユーティリティ フォルダーに残されています。
モデルが変更され、その変更によってサブシステムに異なるコードが生成される可能性がある場合には、再利用可能な関数が新しく生成されます。たとえば、モデル コンフィギュレーション パラメーターによってコードのコメントが変更されると、再利用可能なライブラリ サブシステムに変更がなかったとしても、サブシステムに異なるコードが生成される可能性があります。
Embedded Coder® のユーザーは、再利用できるように構成されたサブシステムが含まれているライブラリからコードを生成できます。詳細については、Library-Based Code Generation for Reusable Library Subsystems (Embedded Coder)を参照してください。
再利用可能なライブラリ サブシステム コードの配置と命名
再利用可能なライブラリ サブシステムの生成コードは、モデルの生成コードからは独立しています。再利用可能なライブラリ サブシステムのコードは、モデル参照階層フォルダーではなく、共有ユーティリティ フォルダー slprj/ に生成されます。サポートする型用の生成コードは target/_sharedutils.h ファイルに生成され、共有ユーティリティ フォルダーにも配置されます。モデルの生成コードに適用されるコード テンプレートは、再利用可能なライブラリ サブシステムの生成コードにも適用されます。
名前が一意になるように、再利用可能な関数の名前では、再利用可能なライブラリ サブシステム名の末尾にチェックサムが追加されます。たとえば、再利用可能なライブラリ サブシステム RLS にリンクされたサブシステム SS1 のコードおよびファイルは、次のようになります。
関数名:
RLS_mgdjlngdファイル名:
RLS_mgdjlnd.cおよびRLS_mgdjlnd.h
再利用可能なライブラリ サブシステムを構成するには、以下に示したようにサブシステム パラメーターを設定します。
[Atomic サブシステムとして扱う] を選択します。
[コード生成] タブで以下のようにします。
[関数のパッケージ化] を
[再利用可能な関数]に設定します。次の表に基づいて、[関数名オプション] パラメーターと [ファイル名オプション] パラメーターを設定します。この表では、コード ジェネレーターがどのようにコードを生成するのかをまとめ、再利用可能なライブラリ サブシステムからコードを生成できるようにする [ファイル名オプション] を太字で強調表示しています。この表の目的のため、Subsystem ブロックの名前は
mySubsystemで、[ユーザー指定]オプションの[ファイル名]の値はmyFunctionであり、サブシステムのメソッド (Embedded Coder)命名規則モデル コンフィギュレーション パラメーターに既定値$R$N$M$Fが設定されているものと仮定しています。関数名オプション ファイル名オプション 生成されるフォルダーの場所 生成される関数名 生成されるファイル名 自動自動/slprj/target/_sharedutilsmySubsystem_checksummySubsystem_checksum.c,mySubsystem_checksum.hサブシステム名を使用/slprj/target/_sharedutilsmySubsystem_checksummySubsystem_checksum.c,mySubsystem_checksum.h関数名を使用/slprj/target/_sharedutilsmySubsystem_checksummySubsystem_checksum.c,mySubsystem_checksum.hユーザー指定model_target_rtwmodel_SubsystemmyFile.hサブシステム名を使用自動model_target_rtwmodel_Subsystem生成コードは model.hに含まれるサブシステム名を使用/slprj/target/_sharedutilsmySubsystem_checksummySubsystem_checksum.c,mySubsystem_checksum.h関数名を使用/slprj/target/_sharedutilsmySubsystem_checksummySubsystem_checksum.c,mySubsystem_checksum.hユーザー指定model_target_rtwmodel_SubsystemmyFile.hユーザー指定自動(この指定は、モデル内のサブシステムの一意の 1 つのインスタンスでサポートされます。)/slprj/target/_sharedutilsmyFunctionmyFunction.c, myFunction.hサブシステム名を使用model_target_rtwmyFunctionmySubsystem.c, mySubsystem.h関数名を使用(この指定は、モデル内のサブシステムの一意の 1 つのインスタンスでサポートされます。)/slprj/target/_sharedutilsmyFunctionmyFunction.c, myFunction.hユーザー指定(この指定は、ユーザー指定の関数名とファイル名が同じ場合に、モデル内のサブシステムの一意の 1 つのインスタンスでのみサポートされます。)/slprj/target/_sharedutilsmyFunctionmyFunction.c, myFunction.h
Subsystem ブロック パラメーターの詳細については、Subsystem を参照してください。
再利用可能なライブラリ サブシステムを含むモデルの構成
モデルで再利用可能なライブラリ サブシステムを使用する場合は、モデルが参照モデルか、最上位モデルかによってモデルを異なる方法で構成しなければなりません。サブシステムが参照モデルの階層構造内にある場合は、コンフィギュレーション パラメーター 共有コードの配置 を [自動] に設定します。そうでない場合は、サブシステムを使用する各モデルに対して、モデル コンフィギュレーション パラメーター [共有コードの配置] を [共有場所] に設定します。
再利用可能なライブラリ サブシステムで共有のローカル データ ストアを使用し、モデル データ要素に対して既定のマッピングを構成している場合は、カテゴリ [Shared local data stores] の既定のストレージ クラス マッピングを [既定] に設定したままにします。
モデル参照階層において、再利用可能なライブラリ サブシステムのインスタンスが最上位モデルにある場合は、[コンフィギュレーション パラメーター] ダイアログ ボックスの [モデル参照] ペインで、[コード生成で固定サイズのスカラーのルート入力を値渡しで行う] パラメーターを選択しなければなりません。このパラメーターを選択しない場合には、最上位モデルの再利用可能なライブラリ サブシステムのインスタンスに別の共有関数が生成され、参照モデルのインスタンスに再利用可能な関数が生成されます。
再利用可能なライブラリ サブシステムがルートの出力端子に接続される場合は、ルートの出力端子に接続されていない同一のサブシステムでは再利用されません。ただし、[最適化] ペインで、[再利用可能なサブシステムの出力を渡す] を [個々の引数] に設定すれば、これらのサブシステム間で再利用が確実に行われるようになります。このパラメーターには Embedded Coder のライセンスが必要です。
ライブラリの作成の詳細については、ライブラリとブロックセットを参照してください。再利用可能なライブラリ サブシステムの作成の例については、モデル間で共有されるサブシステムの再利用可能なコードの生成を参照してください。
モデル間で共有されるサブシステムの再利用可能なコードの生成
この例では、参照モデル間で共有されるサブシステムにおいて再利用可能なライブラリ サブシステムを構成し、再利用可能な関数を生成する方法を示します。結果として、再利用可能なサブシステムのコードが、共有ユーティリティ フォルダー (slprj/) に生成されます。target/_sharedutils
再利用可能なライブラリ サブシステムの作成
Simulink エディターで、[シミュレーション] タブの [新規]、[ライブラリ] を選択します。[Simulink スタート ページ] ウィンドウから [空のライブラリ] を選択します。
GeneratedCodeFunctionReuseを開きます。openExample('GeneratedCodeFunctionReuse')サブシステム
SS1をコピーし、ライブラリ エディターに貼り付けます。これにより、SS1の変数がベース ワークスペースに読み込まれます。サブシステム ブロックの名前をRLSに変更します。
Subsystem ブロックをクリックし、Ctrl+U を押して、サブシステム
RLSの内容を表示します。
サブシステムを構成するために、ライブラリ エディターで
RLSを右クリックします。コンテキスト メニューで、[ブロック パラメーター (Subsystem)] を選択します。[Subsystem パラメーター] ダイアログ ボックスで、次のオプションを選択します。[Atomic サブシステムとして扱う] を選択します。
[コード生成] タブで以下のようにします。
[関数のパッケージ化] を
[再利用可能な関数]に設定します。[関数名オプション] を
[ユーザー指定]に設定し、[関数名] がmyfunに設定されていることを確認します。[ファイル名オプション] を
[自動]に設定します。
[適用] をクリックし、[OK] をクリックします。
再利用可能なライブラリを
ssreuselibとして保存します。これによりファイルssreuselib.slxが作成されます。
モデル例の作成
ssreuselibからRLSのインスタンスを 1 つ含むモデルを作成します。このサブシステムにSS1という名前を付けます。サブシステムをもう 1 つ追加し、SS2という名前を付けます。モデルにex_model1という名前を付けます。
ssreuselibからRLSのインスタンスを 1 つ含むモデルをもう 1 つ作成します。このサブシステムにSS1という名前を付けます。サブシステムをもう 1 つ追加し、SS3という名前を付けます。モデルにex_model2という名前を付けます。
ex_model1とex_model2を参照する 2 つの Model ブロックをもつ最上位モデルを作成します。最上位モデルをex_mdlref_ssreuseという名前で保存します。
最上位モデルのコンフィギュレーション パラメーターの設定
モデル
ex_mdlref_ssreuseを Simulink® エディターで開き、[C コード] タブで [設定] をクリックし、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインで [タイプ] を
[固定ステップ]に指定します。[モデル参照] ペインで、省略記号をクリックして詳細設定パラメーターを表示します。次に、[コード生成で固定サイズのスカラーのルート入力を値渡しで行う] を選択します。
[コード生成]、[レポート] ペインで、[コード生成レポートを作成] および [レポートを自動的に開く] を選択します。
[コード生成]、[インターフェイス] ペインで、共有コードの配置を
[共有場所]に設定します。[コード生成]、[識別子] ペインで、[識別子の最大の長さ] を
256に設定します。このステップはオプションです。[適用] をクリックし、[OK] をクリックします。
コンフィギュレーション参照の作成と伝播
Simulink エディターの [モデル化] タブで、[モデル エクスプローラー] をクリックしてモデル エクスプローラーを開きます。モデル エクスプローラーの左側のナビゲーション列で、
ex_mdlref_ssreuseノードを展開します。ex_mdlref_ssreuseノードの下で [コンフィギュレーション] ノードを選択します。[コンテンツ] ペインで [コンフィギュレーション] を右クリックし、[コンフィギュレーション参照に変換]を選択します。[アクティブなコンフィギュレーションを参照に変換] ダイアログ ボックスで、[OK] をクリックします。これにより、モデル コンフィギュレーション セットがコンフィギュレーション参照
Simulink.ConfigSetRefに変換され、コンフィギュレーション参照オブジェクトconfigSetObjがベース ワークスペースに作成されます。左側のナビゲーション列で、[Reference (Active)] を右クリックし、
[参照モデルへ伝播]を選択します。[参照モデルへのコンフィギュレーション参照の伝播] ダイアログ ボックスで、リスト内の参照モデルを選択します。[伝播] をクリックします。
これで、最上位モデルおよび参照モデルは、同一のコンフィギュレーション参照 Reference (Active) (モデル コンフィギュレーション参照オブジェクト configSetObj をポイント) をベース ワークスペースで使用するようになります。モデルを保存する際には、configSetObj を MAT ファイルにエクスポートする必要もあります。
コードを生成して表示します。
コードを生成するには、Simulink エディターで、Ctrl+B を押します。コードが生成されると、コード生成レポートが開きます。
参照モデルのコード生成レポートを表示するには、左側のナビゲーション ペインの [参照モデル] セクションで、
ex_model1を選択します。コード生成レポートにex_model1で生成されたファイルが表示されます。左側のナビゲーション ペインで [共有ファイル] を展開します。コード ジェネレーターは、再利用可能なライブラリ サブシステム名を使用します。サブシステム
SS1のコードは、myfun.cとmyfun.hに記述されます。
[戻る] をクリックして、コード生成レポート
ex_model2に戻ります。ex_model2では、ex_model1のコードと同じmyfun.cとmyfun.hのソース コードが使用されています。実際のサブシステム関数およびファイルの名前はこれとは異なります。