Main Content

Stateflow チャートでのカスタム コードの再利用

C または C++ で記述されたカスタム コードを、Simulink® モデルの Stateflow® チャートと統合できます。カスタム コードと Stateflow チャートの間でデータと関数を共有することにより、Stateflow の機能を拡張し、既存のコードを活用できます。

Stateflow チャートへのカスタム C コードの統合

この例では、カスタム C コードを使用して、モデル内のチャートでアクセスできる定数、変数、および関数を定義する方法を説明します。チャートへのカスタム C++ コードの統合の詳細については、Stateflow チャート内のカスタム C++ コードへのアクセスを参照してください。

次の例では、Stateflow チャートが custom_function というカスタム コード関数を呼び出します。この関数は、チャート入力 signal とローカル データ threshold を読み取り、それらの値を比較してから、HIGHMEDIUM、および LOW という 3 つのカスタム グローバル定数のいずれかを返します。このチャートは、関数の値を使用して、custom_var というカスタム変数の値をインクリメントまたはデクリメントした後に新しいステートに遷移するかどうかを決定します。

このチャートがアクセスするカスタム コードを表示するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[シミュレーション ターゲット] ペインで [コード情報] タブを選択します。

  • [インクルード ヘッダー] パラメーターには、ヘッダー ファイル sf_custom_header.h を指定する #include ステートメントが含まれています。このファイルには、3 つの静的なグローバル定数の定義と、変数 custom_var および関数 custom_function の宣言が含まれています。

  • [ソース ファイル] パラメーターは、ソース ファイル sf_custom_source.c を指定します。このファイルは custom_var の初期値をゼロに設定し、関数 custom_function を定義します。

いずれのファイルも、モデルと同じフォルダーにあります。別のフォルダーにあるカスタム コード ファイルにアクセスするには、相対パス名を使用します。詳細については、カスタム コードへの相対パスの指定を参照してください。

このモデルをシミュレートすると、Stateflow はソース ファイルとチャートを単一の S-Function MEX ファイルにコンパイルします。カスタム定義は生成されたマシンのヘッダー ファイル (sf_custom_sfun.h) の先頭に配置されるため、シミュレーション中にモデル内の各チャートはカスタム コードにアクセスできます。

モデルのカスタム コードの構成

シミュレーション用のカスタム コード設定の指定

シミュレーション中にモデルがカスタム コードにアクセスするように構成するには、[コンフィギュレーション パラメーター] ダイアログ ボックスの [シミュレーション ターゲット] ペインを使用します。

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

  2. [シミュレーション ターゲット] ペインの [コード情報] タブで、次のパラメーターを指定します。

    • インクルード ヘッダー — 生成される model.h ヘッダー ファイルの冒頭にインクルードするコード (生成コード内のカスタム関数やデータを宣言する) を入力します。このコード行は生成されるすべてのソース コード ファイルの冒頭に配置され、すべての生成コードから認識されます。たとえば、このパラメーターを使用して、#define ステートメントと #include ステートメントを入力できます。カスタム ヘッダー ファイルをインクルードする場合は、ファイル名を二重引用符で囲む必要があります。詳細については、ヘッダーを含める (Simulink)を参照してください。

      メモ

      このパラメーターに指定したコードは、単一のバイナリにリンクされる複数のソース ファイルに配置されるため、int x や、void myfun(void) のシグネチャを含む関数など、グローバル変数の定義を含めることはできません。これらのステートメントはリンク エラーを引き起こします。それらのシンボル定義が生成コードのソース ファイルに複数回現れるためです。ただし、extern int xextern void myfun(void) など、変数や関数の extern 宣言をインクルードすることは可能です。

    • インクルード ディレクトリ[ヘッダー ファイル] パラメーターに直接的に、またはコンパイルされるターゲットに間接的にインクルードするカスタム ヘッダー ファイルを含むフォルダー パスのリストを、スペースで区切って入力します。詳細については、インクルード ディレクトリ (Simulink)を参照してください。

    • ソース ファイル — コンパイルしてターゲットにリンクするソース ファイルのリストを入力します。ソース ファイルは、単一のコンマ、空白、または改行で区切ることができます。詳細については、ソース ファイル (Simulink)を参照してください。

    • ライブラリ — ターゲットにリンクするカスタム オブジェクト コードを含むスタティック ライブラリのリストをスペースで区切って入力します。詳細については、ライブラリ (Simulink)を参照してください。

    • 定義 — 生成コードに追加するプリプロセッサ マクロ定義のリストをスペースで区切って入力します。詳細については、定義 (Simulink)を参照してください。

    • コンパイラ フラグ — カスタム コードのコンパイル時にコンパイラのコマンド ラインに追加する追加のコンパイラ フラグを入力します。詳細については、Compiler flags (Simulink)を参照してください。

    • リンカー フラグ — カスタム コードのリンク時にリンカーのコマンド ラインに追加する追加のリンカー フラグを入力します。詳細については、Linker flags (Simulink)を参照してください。

  3. [詳細設定パラメーター] で、[カスタム コードのインポート] (Simulink) を選択します。

  4. モデルにライブラリ チャートが含まれる場合は、チャートをモデルに提供する各ライブラリ モデルのカスタム コード設定を構成します。詳細については、ライブラリ モデル内のカスタム コードの構成を参照してください。

コマンド ライン API を使用したシミュレーション オプションの設定の詳細については、プログラムによるコンフィギュレーション パラメーターの設定 を参照してください。

コード生成用のカスタム コード設定の指定

モデルがコード生成用のカスタム コードにアクセスするように構成するには、[コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成][カスタム コード] ペインを使用します。コード生成時に、モデルは、シミュレーションに使用したものと同じカスタム コード設定、または固有のカスタム コード設定を使用できます。

  • シミュレーションに使用したものと同じカスタム コード設定を使用するには、[シミュレーション ターゲットと同じカスタム コードの設定を使用] をオンにします。シミュレーション用のカスタム コード設定の指定の説明に従って、[シミュレーション ターゲット] でカスタム コード設定を指定します。

  • 固有のカスタム コード設定を使用するには、[シミュレーション ターゲットと同じカスタム コードの設定を使用] をオフにします。[コード情報] タブで、コード生成用のカスタム コード設定を指定します。このタブのパラメーターの説明については、シミュレーション用のカスタム コード設定の指定を参照してください。

The Code Generation Custom Code pane of the Configuration Parameters dialog box, showing the same custom code settings specified in the Simulation Target pane.

詳細については、シミュレーション ターゲットと同じカスタム コードの設定を使用 (Simulink Coder)およびモデル コンフィギュレーション パラメーターを使用した外部コードの統合 (Simulink Coder)を参照してください。

ステートと遷移におけるカスタム コード関数の呼び出し

カスタム コード関数は、任意のステートまたは遷移のアクション、または他の関数から呼び出すことができます。

カスタム コード関数を呼び出すには、ヘッダー ファイルの関数の宣言で指定したシグネチャを使用します。関数シグネチャの仮引数のそれぞれに、実際の引数の値をインクルードします。

return_val = function_name(arg1,arg2,...)

メモ

カスタム コードと Stateflow チャートの間では、固定小数点データは共有しないでください。

カスタム コードへの相対パスの指定

モデルの更新時、またはシミュレーションの開始時に、モデルは以下のフォルダーでカスタム コード ファイルを検索します。

  • 現在のフォルダー

  • モデル フォルダー (現在のフォルダーと異なる場合)

  • 指定するフォルダーのカスタム リスト

  • ツールボックス フォルダーを除く、MATLAB® 検索パスのすべてのフォルダー

これらのフォルダーへの相対パスを使用して、カスタム コードの場所を指定できます。たとえば、前の例で、カスタム コードのソース ファイルとヘッダー ファイルをモデル フォルダーのサブフォルダー CustomCode/SourceFiles および CustomCode/HeaderFiles に保存したとします。これらのファイルにアクセスするには、[インクルード ディレクトリ] パラメーターを使用してサブフォルダーの相対パスを指定します。

The Simulation Target pane of the Configuration Parameters dialog box, showing the relative paths to two subfolders.

あるいは、相対パス名を使用して、ヘッダー ファイルとソース ファイルを個別に指定できます。

  • [インクルード ヘッダー] に次のように入力します。

    #include "./CustomCode/HeaderFiles/sf_custom_code_constants_vars_fcns_hdr.h"
  • [ソース ファイル] に次のように入力します。

    ./CustomCode/HeaderFiles/sf_custom_code_constants_vars_fcns_src.c

相対パスの構文に関するガイドライン

カスタム コードの相対パスを構成するときには、以下の構文のガイドラインに従います。

  • 相対パスの開始位置を示すには、単一のピリオド (.) を使用する。

  • 使用している現在のプラットフォームにかかわらず、ファイル区切りとしてスラッシュ (/) またはバックスラッシュ (\) を使用する。

  • パスに空白やハイフン (-) などの非標準パス文字が含まれる場合は、パスを二重引用符 ("...") で囲む。

  • 式を MATLAB ワークスペースで評価するには、その式をドル記号 ($...$) で囲む。この例では、CustomCodeFolder を MATLAB ワークスペースで "module1" として定義した変数と仮定します。パス名 .\work\source\$CustomCodeFolder$ を使用してカスタム コード ファイルを指定すると、モデルはフォルダー .\work\source\module1 でカスタム コード ファイルを検索します。

関連するトピック