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) の先頭に配置されるため、シミュレーション中にモデル内の各チャートはカスタム コードにアクセスできます。

カスタム コードの構成

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

C のソース、ヘッダー、およびライブラリ ファイルを指定する例は、次のフォルダー構造に基づいています。

The MATLAB file browser shows three folders: "src", "includes" and "lib". "src" contains three C files. "includes" contains two header files and a "utilities" folder with one header file. "lib" contains a DLL library and a "additional libraries" folder with a DLL library.

シミュレーション中にモデルがカスタム コードにアクセスするように構成するには、次の手順に従います。

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。この方法の詳細については、ダイアログ ボックスを使用したコンフィギュレーション パラメーターの設定 (Simulink)を参照してください。

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

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

      メモ

      • このパラメーターで指定するコードには、extern int xextern void myfun(void) など、変数や関数の extern 宣言をインクルードすることが可能です。ただし、int xvoid myfun(void) などのグローバル変数や関数定義は、その定義が生成コードのソース ファイルに複数回出現するため、リンク エラーを引き起こします。

      The Simulation Target Custom Code "Include headers" tab has three lines of code: #include "util.h", #include "table.h", and #include "extra functions.h"

    • インクルード ディレクトリ — コンフィギュレーション パラメーターに直接的に、またはコンパイルされるターゲットに間接的にインクルードするカスタム ヘッダー、ソース、およびライブラリの各ファイルを含むフォルダー パスのリストを入力します。エントリを区切るには、改行、スペース、またはセミコロンを使用できます。詳細については、インクルード ディレクトリ (Simulink)を参照してください。

      The Simulation Target Custom Code "Include directories" tab shows five lines: src, includes, includes/utilities, lib, "lib/additional libraries"

    • ソース ファイル — コンパイルしてターゲットにリンクするソース ファイルのリストを、改行、スペース、またはセミコロンで区切って入力します。詳細については、ソース ファイル (Simulink)を参照してください。

      The Simulation Target Custom Code "Source files" tab shows three lines: util.c, table.c, and "extra functions.c"

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

      The Simulation Target Custom Code "Libraries" tab shows two lines: addons.dll, and library.dll

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

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

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

  3. [詳細設定パラメーター][カスタム コードのインポート] (Simulink) がオンになっていることを確認します。このパラメーターは既定で有効になっています。

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

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

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

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

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

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

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

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

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

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

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

カスタム コードの構成

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

  • MATLAB® をアクション言語として使用するチャートでは、カスタム コードで #define ステートメントはサポートされません。チャートとカスタム コードの間で定数を共有するには、マクロではなく、静的なグローバル定数を使用します。

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

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

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

  • 現在のフォルダー

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

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

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

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

The Simulation Target pane of the Configuration Parameters dialog box shows 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 でカスタム コード ファイルを検索します。

関連するトピック