Main Content

完全インライン化 S-Function の記述

完全インライン化 S-Function では、アルゴリズム (ブロック) は生成コードにビルドされて組み込みブロックと見分けがつかなくなります。通常、完全インライン化 S-Function では 2 回のアルゴリズム実装が必要です。1 回は Simulink モデル (C/C++ MEX S-Function) に対して、もう 1 回はコード生成 (TLC ファイル) に対して行います。

ラッパー S-Function および TLC ファイルの記述の例を使用する場合、wrapsfcn.tlc で明示的なコード (つまり、2.0 * u) を指定することによって関数 my_alg への呼び出しを完全に削除できます。これによって性能は向上しますが、大量の C/C++ コードで実行すると、タスクが長時間になる可能性があります。また、C/C++ S-Function そのものと対応する TLC ファイルの 2 か所でアルゴリズムを保持しなければなりません。パフォーマンスの向上がその欠点を補って余りあるかどうか検討します。この例で使用するアルゴリズムをインライン化するには、wrapsfcn.tlc ファイルの Outputs セクションで次を記述する代わりに

%<y> = my_alg(%<u>);

次を使用します。

%<y> = 2.0 * %<u>;

このコードは、mdlOutputs で生成されるコードです。

void mdlOutputs(int_T tid)
{
  /* Sin Block: <Root>/Sin */
  rtB.Sin = rtP.Sin.Amplitude *
    sin(rtP.Sin.Frequency * ssGetT(rtS) + rtP.Sin.Phase);

  /* S-Function Block: <Root>/S-Function */
  rtB.S_Function = 2.0 * rtB.Sin; /* Explicit embedding of algorithm */

  /* Outport Block: <Root>/Out */
  rtY.Out = rtB.S_Function;
}

Target Language Compiler は my_alg の呼び出しをアルゴリズムそのものと置き換えます。

マルチ端子 S-Function

より詳細なマルチ端子 S-Function の例は、sfun_multiport.csfun_multiport.tlc です。この S-Function では、複数の端子を含んでいる S-Function について完全にインライン化された TLC ファイルを作成する方法を説明します。

インライン化 S-Function の記述に関するガイドライン

  • ブロック プロパティ RTWdata を使用するとします (S-Function RTWdataを参照)。このプロパティは、ブロックとの関連付けが可能な文字ベクトルの構造体です。コード ジェネレーターは、model.rtw ファイルのモデルでこの構造体を保存し、.rtw ファイルを読みやすくします。たとえば、MATLAB コマンド ウィンドウで次のコマンドを入力するとします。

    mydata.field1 = 'information for field1';
    mydata.field2 = 'information for field2';
    set_param(sfun_block, 'RTWdata', mydata);

    コード ジェネレーターがブロックに対して生成する .rtw ファイルには、構造体 mydata に指定したコメントが含まれます。

  • 関数 mdlRTW を使用して、以下の目的で生成コードで C MEX S-Function をインライン化することを検討します。

    • 生成コード内の調整可能なパラメーターの名前を変更する。

    • 調整不可能なパラメーターを TLC ファイルに導入する。

関連するトピック