Stateflow チャートへの MATLAB 関数の統合
MATLAB® 関数を使用して、Stateflow® チャートに複雑なアルゴリズムを実装できます。MATLAB 関数を使用して、次のことができます。
数学的な計算、データの処理、統計の解析を表現する。
確立された MATLAB アルゴリズムをステート マシンに組み込む。
複雑なロジックをカプセル化してチャート設計を簡潔にする。
Stateflow チャートで使用するための MATLAB 関数の作成の詳細については、MATLAB 関数の定義による MATLAB コードの再利用を参照してください。
Stateflow チャートへの MATLAB 関数の追加
この例では、2 つの MATLAB 関数を含むモデルを作成し、それらの関数を使用して、チャートに入力するデータの平均と標準偏差を計算します。
モデルの設定
新しい Simulink® モデルを作成します。
1 つの Chart ブロック、1 つの Constant ブロック、2 つの Display ブロックを追加します。
Constant ブロックの値を [2 3 4 5] に設定します。

モデルを
call_stats_function_stateflowという名前で保存します。
Stateflow チャートの構成
Chart ブロックを開きます。
MATLAB 関数のアイコン
を使用して MATLAB 関数を 2 つ追加します。次のシグネチャを使って関数にラベルを付けます。
meanout = meanstats(vals)stdevout = stdevstats(vals)
次の条件アクションをもつデフォルト遷移を終端ジャンクションに追加します。
{ mean = meanstats(invals); stdev = stdevstats(invals); }
関数シグネチャの引数がスカラーの場合は、関数呼び出しの入力と出力がスカラー拡張のルールに従っていることを確認してください。詳細については、すべての要素への値の代入を参照してください。
データ要素の定義
[シンボル] ペインを開きます。
[タイプ] 列を使用して次のデータのデータ型を設定します。
invals:入力データstdev:出力データmean:出力データ

標準偏差関数のプログラミング
stdevstats 関数を開き、次のコードを追加します。
function stdevout = stdevstats(vals) %#codegen % Calculate standard deviation len = length(vals); stdevout = sqrt(sum(((vals-avg(vals,len)).^2))/len); function meanfcn = avg(inputArray,inputSize) meanfcn = sum(inputArray)/inputSize;
関数 sum で stdevout の値が計算されます。%#codegen コンパイル命令を使用すると、コード生成でサポートされる MATLAB 関数の構文およびセマンティクスのコンパイル時違反を検出できます。
平均関数のプログラミング
meanstats 関数を開き、次のコードを追加します。
function meanout = meanstats(vals) %#codegen % Calculate statistical mean len = length(vals); meanout = avg(vals,len); % Plot results (simulation only) coder.extrinsic("plot"); plot(vals,"-+"); function meanfcn = avg(inputArray,inputSize) meanfcn = sum(inputArray)/inputSize;
length 関数は、コード生成をサポートし、ベクトルの長さを返します。関数 avg で meanout の値が計算されます。plot はコード生成ではサポートされていないため、外部として定義します。
モデルのシミュレーション
Simulink ブロックをチャートの入力端子と出力端子に接続します。

[実行] をクリックします。平均と標準偏差の数値が Display ブロックに表示されます。

MATLAB 関数を使用するチャートからのコードの生成
コードを生成するには、すべての関数がコード生成をサポートしていなければなりません。いずれかの関数がコード生成をサポートしていない場合、coder.extrinsic (Simulink) を使用して例外としてマークできます。MATLAB がコード生成でサポートする関数の一覧については、C/C++ コードの生成でサポートされている関数およびオブジェクト (MATLAB Coder)を参照してください。
参考
coder.extrinsic (Simulink)