このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
モデル間で共有されるライブラリ サブシステムからの再利用可能なコードの生成
再利用可能なライブラリ サブシステムとは
再利用可能なライブラリ サブシステムとは、ライブラリにインクルードされ、再利用できるように構成されたサブシステムです。モデル間でサブシステムを再利用するには、ライブラリでサブシステムを定義し、そのサブシステムを再利用できるように構成しなければなりません。
共通の機能を再利用するために、サブシステムの複数のインスタンスを以下のような範囲で含めることができます。
最上位モデルまたはモデル参照階層の一部である単一のモデル内
モデル参照階層の複数の参照モデルにまたがる
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
であり、Subsystem methods (Embedded Coder)命名規則モデル コンフィギュレーション パラメーターに既定値$R$N$M$F
が設定されているものと仮定しています。関数名オプション ファイル名オプション 生成されるフォルダーの場所 生成される関数名 生成されるファイル名 自動
自動
/slprj/target/_sharedutils
mySubsystem_checksum
mySubsystem_checksum.c
,mySubsystem_checksum.h
サブシステム名を使用
/slprj/target/_sharedutils
mySubsystem_checksum
mySubsystem_checksum.c
,mySubsystem_checksum.h
関数名を使用
/slprj/target/_sharedutils
mySubsystem_checksum
mySubsystem_checksum.c
,mySubsystem_checksum.h
ユーザー指定
model_target_rtw
model_Subsystem
myFile.h
サブシステム名を使用
自動
model_target_rtw
model_Subsystem
生成コードは model.h
に含まれるサブシステム名を使用
/slprj/target/_sharedutils
mySubsystem_checksum
mySubsystem_checksum.c
,mySubsystem_checksum.h
関数名を使用
/slprj/target/_sharedutils
mySubsystem_checksum
mySubsystem_checksum.c
,mySubsystem_checksum.h
ユーザー指定
model_target_rtw
model_Subsystem
myFile.h
ユーザー指定
自動
(この指定は、モデル内のサブシステムの一意の 1 つのインスタンスでサポートされます。)/slprj/target/_sharedutils
myFunction
myFunction.c, myFunction.h
サブシステム名を使用
model_target_rtw
myFunction
mySubsystem.c, mySubsystem.h
関数名を使用
(この指定は、モデル内のサブシステムの一意の 1 つのインスタンスでサポートされます。)/slprj/target/_sharedutils
myFunction
myFunction.c, myFunction.h
ユーザー指定
(この指定は、ユーザー指定の関数名とファイル名が同じ場合に、モデル内のサブシステムの一意の 1 つのインスタンスでのみサポートされます。)/slprj/target/_sharedutils
myFunction
myFunction.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
のソース コードが使用されています。実際のサブシステム関数およびファイルの名前はこれとは異なります。