Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

サブシステムからの S-Function の生成

[S-Function を生成] メニュー オプションでは、サブシステムからの S-Function の生成を自動化できます。[S-Function を生成] メニュー オプションは、サブシステム内で使用されるパラメーターを表し、選択したパラメーターを調整可能として宣言することができます。

サブシステムから S-Function ブロックを作成するには、サブシステムから S-Function ブロックを生成を参照してください。

たとえば、SourceSubsys を考えてみます。目的はモデルから SourceSubsys を自動的に抽出し、それを元に S-Function ブロックを作成することです。SourceSubsys 内の Gain ブロックのゲイン ファクターであるワークスペース変数 K が調整可能な変数として宣言および生成されます。

調整可能なパラメーター K をもつ SourceSubsys から S-Function を自動生成するには、次のようにします。

  1. SourceSubsys モデルが開いた状態でサブシステムをクリックして選択します。

  2. サブシステムを右クリックし、[C/C++ コード][S-Function を生成] を選択します。

  3. [S-Function を生成] ウィンドウで、サブシステム内のブロック パラメーターとして参照されている変数またはデータ オブジェクトを確認します。それらを調整可能として宣言できます。

    ウィンドウの上部ペインには次の列が表示されます。

    • [変数名]: パラメーターの名前。

    • [クラス]:パラメーターがワークスペース変数の場合は、そのデータ型が表示されます。パラメーターがデータ オブジェクトの場合は、その名前とクラスが表示されます。

    • [調整可能]:調整可能なパラメーターを選択できます。パラメーターを調整可能に宣言するには、チェック ボックスをオンにします。この例では、パラメーター K が調整可能として宣言されます。

    上のペインでパラメーターを選択すると、そのパラメーターを参照するブロックと各ブロックの親システムが下のペインに表示されます。

  4. 調整可能なパラメーターを選択した後、[ビルド] ボタンをクリックします。このビルド プロセスで、S-Function ターゲットを使用した S-Function のコード生成とコンパイルが開始されます。[新規モデルの作成] オプションは自動的に有効になります。

  5. ビルド プロセスにより、MATLAB® コマンド ウィンドウにステータス メッセージが表示されます。ビルドが完了すると調整可能なパラメーターのウィンドウが閉じ、新しい無名のモデル ウィンドウが開きます。

  6. モデル ウィンドウには、ブロックを生成した元のサブシステム (この例では SourceSubsys) と同じ名前の S-Function ブロックが含まれます。オプションで、生成されたブロックを含む生成されたモデルを保存できます。

    S-Function ブロック用に生成されたコードは現在の作業フォルダーに保存されます。以下のファイルが最上位のフォルダーに書き込まれます。

    • subsys_sf.c または .cpp、ここで subsys はサブシステム名 (たとえば、SourceSubsys_sf.c)

    • subsys_sf.h

    • subsys_sf.mexext、ここで mexext はプラットフォームに依存する MEX ファイルの拡張子 (たとえば、SourceSubsys_sf.mexw64)

    S-Function 用のソース コードはサブフォルダー subsys_sfcn_rtw に書き込まれます。最上位の .c ファイルまたは .cpp ファイルは、生成されたコードに他の C/C++ コードを組み込むのに使用できるインクルード命令を含むスタブ ファイルです。

    メモ

    S-Function の配布に必要なファイルを参照してください。

生成された S-Function ブロックには幅とサンプル時間が元のモデルの値に対応する入力端子と出力端子があります。

次のコードは生成された S-Function コード (SourceSubsys_sf.c) の mdlOutputs ルーチンからのものですが、MEX API の呼び出しにより調整可能な変数 K がどのように参照されるかを示しています。

static void mdlOutputs(SimStruct *S, int_T tid)
...

/* Gain: '<S1>/Gain' incorporates:
     *  Sum: '<S1>/Sum'
     */
    rtb_Gain_n[0] = (rtb_Product_p + (*(((const
      real_T**)ssGetInputPortSignalPtrs(S, 2))[0]))) * (*(real_T
      *)(mxGetData(K(S))));
    rtb_Gain_n[1] = (rtb_Product_p + (*(((const
      real_T**)ssGetInputPortSignalPtrs(S, 2))[1]))) * (*(real_T
      *)(mxGetData(K(S))));

自動 S-Function 生成では、[調整可能なパラメーターの値を使用] オプションはクリアされます。または、コマンド ラインで 'off' に設定されます。

メモ

MEX S-Function ラッパーは、ラッパーが作成された MATLAB バージョンでのみ使用します。

マクロ パラメーター

生成コードでパラメーターがマクロとして現れるように、Define のようなストレージ クラスを Simulink.Parameter オブジェクトに適用すると仮定します。ERT S-Function の生成元のサブシステム内のパラメーター オブジェクトを使用する場合、このパラメーター オブジェクトは調整可能なパラメーターとして選択できません。代わりに、S-Function コード ジェネレーターは、パラメーター オブジェクトにカスタム ストレージ クラスを適用します。S-Function コード内のこのマクロ生成によって、Variant Subsystem ブロックのようなバリアント要素を含むサブシステムから S-Function を生成でき、生成コード内でプリプロセッサ条件を生成するように構成できます。ただし、S-Function のシミュレーション中はパラメーターの値を変更できません。

パラメーター オブジェクトを調整可能なパラメーターとして選択するには、別のストレージ クラスを適用するか、独自のストレージ クラスを作成します。パラメーターをマクロとして扱うカスタム ストレージ クラスには、DefineImportedDefineCompilerFlag およびカスタム ストレージ クラス デザイナーで [データの初期化][マクロ] に設定して作成したストレージ クラスがあります。マクロではないストレージ クラスを使用する場合、パラメーター オブジェクトをバリアント制御変数として使用してプリプロセッサ条件を生成することはできません。

パラメーター オブジェクトをインポートされたマクロとして扱うストレージ クラスを適用する場合、関数 ERT S-Function を生成する前にマクロ定義を指定します。たとえば、ストレージ クラス ImportedDefineSimulink.Parameter オブジェクトに適用して、サブシステム内でパラメーター オブジェクトをバリアント制御変数として使用すると仮定します。カスタム属性 HeaderFile'myHdr.h' に設定する場合、S-Function を生成するときにカスタム ヘッダー ファイル myHdr.h を現在のフォルダーに置きます。生成された S-Function では、パラメーター オブジェクトの Value プロパティの値ではなく、ヘッダー ファイルのマクロの値が使用されます。

コンパイラ オプションによって定義されるマクロ (たとえば、ストレージ クラス CompilerFlag を適用する) を使用するには、モデル コンフィギュレーション パラメーター [コード生成][カスタム コード][追加のビルド情報][定義] を使用してコンパイラ オプションを指定します。詳細については、[コード生成] ペイン: カスタム コード: 追加のビルド情報: 定義を参照してください。

参考

関連するトピック