Main Content

モデル参照のサポート

参照モデルをもつモデルをビルドする際にカスタム システム ターゲット ファイルを使用する場合は、カスタム システム ターゲット ファイルがモデル参照をサポートするよう設定しなければなりません。

カスタム システム ターゲット ファイルを使用するモデル参照の要件

他のモデルを参照するモデルをビルドするには、次のようにします。

  • GRT システム ターゲット ファイル、または ERT システム ターゲット ファイルから派生したカスタム システム ターゲット ファイルを使用します。

  • カスタム システム ターゲット ファイルではモデル参照準拠を宣言しなければなりません。モデル参照準拠の宣言を参照してください。

  • テンプレート makefile はモデル参照をサポートするいくつかのエンティティを定義しなければなりません。TMF でのモデル参照のサポートを参照してください。

モデル参照準拠の宣言

ターゲットのモデル参照準拠を宣言するには、ModelReferenceCompliant フラグを設定するコールバック関数を実装して、システム ターゲット ファイルの rtwgensettings 構造体の SelectCallback フィールドにコールバック関数をインストールしなければなりません。コールバック関数は、システム ターゲット ファイル ブラウザーでターゲットが選択されるたびにトリガーされます。たとえば、次のシステム ターゲット ファイル コードは、custom_select_callback_handler という名前の関数 SelectCallback をインストールします。

rtwgensettings.SelectCallback = 'custom_select_callback_handler(hDlg,hSrc)';

関数 SelectCallback への引数 (hDlghSrc) は、コールバック 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 の詳細については、関数 slConfigUIGetValslConfigUISetEnabled および slConfigUISetVal のリファレンス ページを参照してください。

TMF でのモデル参照のサポート

モデル参照のためにテンプレート makefile (TMF) を設定するには、次のようにします。

  1. 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.tmf を参照してください。
    RELATIVE_PATH_TO_ANCHOR生成された makefile の場所から MATLAB® 作業フォルダーへの相対パス。
    MODELREF_TARGET_TYPE

    ビルドするターゲットのタイプを示します。可能な値は以下のとおりです。

    • NONE:その他のモデルを参照するスタンドアロン モデルまたは最上位モデル

    • RTW:モデル参照ターゲット ビルド

    • SIM:モデル参照シミュレーション ターゲット ビルド

  2. インクルード パス RELATIVE_PATH_TO_ANCHOR を変数 INCLUDES 全体に追加します。

    INCLUDES = -I. -I$(RELATIVE_PATH_TO_ANCHOR) $(ADD_INCLUDES) \
    	   $(USER_INCLUDES) $(SHARED_INCLUDES)
  3. 最初に共通モジュールだけがリストされるように TMF 内の SRCS 変数を変更します。追加のモジュールは、次の手順に示すように、その後に条件付きで追加されます。たとえば、次の行

    SRCS  = $(MODEL).c $(MODULES) ert_main.c $(ADD_SRCS) $(EXT_SRC)

    を次のように変更します。

    SRCS = $(MODULES)
  4. 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) を削除します。

  5. 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
  6. 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

関連するトピック