モデル参照のサポート
参照モデルをもつモデルをビルドする際にカスタム システム ターゲット ファイルを使用する場合は、カスタム システム ターゲット ファイルがモデル参照をサポートするよう設定しなければなりません。
カスタム システム ターゲット ファイルを使用するモデル参照の要件
他のモデルを参照するモデルをビルドするには、次のようにします。
GRT システム ターゲット ファイル、または ERT システム ターゲット ファイルから派生したカスタム システム ターゲット ファイルを使用します。
カスタム システム ターゲット ファイルではモデル参照準拠を宣言しなければなりません。モデル参照準拠の宣言を参照してください。
テンプレート makefile はモデル参照をサポートするいくつかのエンティティを定義しなければなりません。TMF でのモデル参照のサポートを参照してください。
モデル参照準拠の宣言
ターゲットのモデル参照準拠を宣言するには、ModelReferenceCompliant
フラグを設定するコールバック関数を実装して、システム ターゲット ファイルの rtwgensettings
構造体の SelectCallback
フィールドにコールバック関数をインストールしなければなりません。コールバック関数は、システム ターゲット ファイル ブラウザーでターゲットが選択されるたびにトリガーされます。たとえば、次のシステム ターゲット ファイル コードは、custom_select_callback_handler
という名前の関数 SelectCallback
をインストールします。
rtwgensettings.SelectCallback = 'custom_select_callback_handler(hDlg,hSrc)';
関数 SelectCallback
への引数 (hDlg
、hSrc
) は、コールバック API 関数によって使用されるプライベート データのハンドルです。これらのハンドルは、システム ターゲット ファイル コールバック関数内での使用に制限され、変更されることなく渡されます。
コールバック関数は、次に示すように ModelReferenceCompliant
フラグを設定しなければなりません。
slConfigUISetVal(hDlg,hSrc,'ModelReferenceCompliant','on'); slConfigUISetEnabled(hDlg,hSrc,'ModelReferenceCompliant',false); hSrc.getConfigSet.refreshDialog;
ターゲットを使用して、大規模モデル参照階層を含むモデルをビルドする可能性がある場合は、並列ビルドを使用した参照モデルのビルド時間の短縮に示すように、並列ビルドをサポートするようターゲットを構成することを検討してください。
並列ビルド用にターゲットを設定するには、次に示すように、コールバック関数で ParMdlRefBuildCompliant
フラグも設定しなければなりません。
slConfigUISetVal(hDlg,hSrc,'ParMdlRefBuildCompliant','on'); slConfigUISetEnabled(hDlg,hSrc,'ParMdlRefBuildCompliant',false); hSrc.getConfigSet.refreshDialog;
システム ターゲット ファイル コールバック API の詳細については、関数 slConfigUIGetVal
、slConfigUISetEnabled
および slConfigUISetVal
のリファレンス ページを参照してください。
TMF でのモデル参照のサポート
モデル参照のためにテンプレート makefile (TMF) を設定するには、次のようにします。
makefile が生成されるときに拡張される次の make 変数とトークンを追加します。
MODELREFS = |>MODELREFS<| MODELLIB = |>MODELLIB<| MODELREF_LINK_LIBS = |>MODELREF_LINK_LIBS<| MODELREF_LINK_RSPFILE = |>MODELREF_LINK_RSPFILE_NAME<| RELATIVE_PATH_TO_ANCHOR = |>RELATIVE_PATH_TO_ANCHOR<| MODELREF_TARGET_TYPE = |>MODELREF_TARGET_TYPE<|
次のコード例は、makefile トークンが参照モデルに対してどのように拡張されるかを示します。
MODELREFS = MODELLIB = engine3200cc_rtwlib.a MODELREF_LINK_LIBS = MODELREF_LINK_RSPFILE = RELATIVE_PATH_TO_ANCHOR = ../../.. MODELREF_TARGET_TYPE = RTW
次のコード例は、参照モデルを参照する最上位モデルに対して makefile トークンがどのように拡張されるかを示します。
MODELREFS = engine3200cc transmission MODELLIB = MODELREF_LINK_LIBS = engine3200cc_rtwlib.a transmission_rtwlib.a MODELREF_LINK_RSPFILE = RELATIVE_PATH_TO_ANCHOR = .. MODELREF_TARGET_TYPE = NONE
トークン 拡張先 最上位モデルの MODELREFS
参照モデル名のリスト。 MODELLIB
モデルに対して生成されたライブラリの名前。 最上位モデルの MODELREF_LINK_LIBS
トークン最上位モデルがリンクする参照モデル ライブラリのリスト。 最上位モデルの MODELREF_LINK_RSPFILE
トークン最上位モデルがリンクする応答ファイルの名前。このトークンは、リンカー応答ファイルをサポートするビルド環境に対してのみ有効です。使用方法の例は、
を参照してください。matlabroot
/toolbox/coder/compile/tmf/grt_vcx64.tmfRELATIVE_PATH_TO_ANCHOR
生成された makefile の場所から MATLAB® 作業フォルダーへの相対パス。 MODELREF_TARGET_TYPE
ビルドするターゲットのタイプを示します。可能な値は以下のとおりです。
NONE
:その他のモデルを参照するスタンドアロン モデルまたは最上位モデルRTW
:モデル参照ターゲット ビルドSIM
:モデル参照シミュレーション ターゲット ビルド
インクルード パス
RELATIVE_PATH_TO_ANCHOR
を変数INCLUDES
全体に追加します。INCLUDES = -I. -I$(RELATIVE_PATH_TO_ANCHOR) $(ADD_INCLUDES) \ $(USER_INCLUDES) $(SHARED_INCLUDES)
最初に共通モジュールだけがリストされるように TMF 内の
SRCS
変数を変更します。追加のモジュールは、次の手順に示すように、その後に条件付きで追加されます。たとえば、次の行SRCS = $(MODEL).c $(MODULES) ert_main.c $(ADD_SRCS) $(EXT_SRC)
を次のように変更します。
SRCS = $(MODULES)
makefile の最終のターゲットを定義する変数を作成します。最終ターゲットを定義するための既存の変数を削除できます。次に例を示します。
PROGRAM = ../$(MODEL)
この変数を削除して、次の変数で置き換えます。
ifeq ($(MODELREF_TARGET_TYPE), NONE) # Top model for RTW PRODUCT = $(RELATIVE_PATH_TO_ANCHOR)/$(MODEL) BIN_SETTING = $(LD) $(LDFLAGS) -o $(PRODUCT) $(SYSLIBS) BUILD_PRODUCT_TYPE = "executable" # ERT based targets SRCS += $(MODEL).c ert_main.c $(EXT_SRC) # GRT based targets # SRCS += $(MODEL).c grt_main.c rt_sim.c $(EXT_SRC) $(SOLVER) else # sub-model for RTW PRODUCT = $(MODELLIB) BUILD_PRODUCT_TYPE = "library" endif
メモ
テンプレート makefile がツールチェーンに関連付けられている場合、
SRCS
リストから$(MODEL).c
または$(MODEL).$(TARGET_LANG_EXT)
を削除します。makefile の最終ターゲットの規則を作成します (既存の最終ターゲット規則を置き換えます)。以下に例を示します。
ifeq ($(MODELREF_TARGET_TYPE),NONE) # Top model for RTW $(PRODUCT) : $(OBJS) $(LIBS) $(MODELREF_LINK_LIBS) $(BIN_SETTING) $(LINK_OBJS) $(MODELREF_LINK_LIBS) $(LIBS) @echo "### Created $(BUILD_PRODUCT_TYPE): $@" else # sub-model for RTW $(PRODUCT) : $(OBJS) $(LIBS) @rm -f $(MODELLIB) $(ar) ruvs $(MODELLIB) $(LINK_OBJS) @echo "### Created $(MODELLIB)" @echo "### Created $(BUILD_PRODUCT_TYPE): $@" endif
MATLAB 作業フォルダー (
pwd
) にあるファイルを参照モデルがコンパイルすることを許可する規則を作成します。%.o : $(RELATIVE_PATH_TO_ANCHOR)/%.c $(CC) -c $(CFLAGS) $<
メモ
変数 MODELREFS
を使用せずに TMF を使用している場合、そのファイルは Simulink® ソフトウェアの以前のリリースで使用されたものかもしれません。TMF がモデル参照をサポートするようにするには、make ファイルに変数 MODELREFS
を追加してください。
コンフィギュレーション オプションの値一致の制御
既定の設定では、TLC ベースのカスタム ターゲットのシステム ターゲット ファイルで定義されたコンフィギュレーション オプションの値は、参照モデルとその親モデルで同じでなければなりません。この要件を緩和するには、コンフィギュレーションオプションを定義する rtwoptions
構造体要素に modelReferenceParameterCheck
フィールドを含めて、フィールドの値を 'off'
に設定します。以下に例を示します。
rtwoptions(2).prompt = 'My Custom Parameter'; rtwoptions(2).type = 'Checkbox'; rtwoptions(2).default = 'on'; rtwoptions(2).modelReferenceParameterCheck = 'on'; rtwoptions(2).tlcvariable = 'mytlcvariable'; ...
コンフィギュレーション オプション My Custom Parameter は、参照モデルとその親モデルで異なるように設定できます。TLC ベースのシステム ターゲット ファイルの詳細については、システム ターゲット ファイルのカスタマイズを参照してください。rtwoptions
フィールドのリストについては、rtwoptions 構造体フィールドのまとめを参照してください。
リソース競合の防止 (オプション)
フック ファイルは、ビルド プロセスの適切に定義されたステージで呼び出されるオプションの TLC プログラムファイルおよび MATLAB プログラム ファイルです。フック ファイルを使用すると、ビルド プロセスをカスタマイズしてプロセスのさまざまな段階間で情報を通信できます。
コード生成とモデル参照機能の互換性のためにカスタム ターゲットを適応させる場合、リソース競合を防止するために、最上位モデルと異なる方法で参照モデルを処理する追加のチェックをフック ファイルに追加することを検討してください。
たとえば、次のチェックを
に追加します。STF
_make_rtw_hook.m file
% Check if this is a referenced model mdlRefTargetType = get_param(codeGenModelName,'ModelReferenceTargetType'); isNotModelRefTarget = strcmp(mdlRefTargetType, 'NONE'); % NONE, SIM, or RTW if isNotModelRefTarget % code that is specific to the top model else % code that is specific to the referenced model end
同様のチェックを TLC コードで行わなければならない可能性があります。
%if !IsModelReferenceTarget() %% code that is specific to the top model %else %% code that is specific to the referenced model %endif