メインコンテンツ

Stateflow チャートへの MATLAB 関数の統合

MATLAB® 関数を使用して、Stateflow® チャートに複雑なアルゴリズムを実装できます。MATLAB 関数を使用して、次のことができます。

  • 数学的な計算、データの処理、統計の解析を表現する。

  • 確立された MATLAB アルゴリズムをステート マシンに組み込む。

  • 複雑なロジックをカプセル化してチャート設計を簡潔にする。

Stateflow チャートで使用するための MATLAB 関数の作成の詳細については、MATLAB 関数の定義による MATLAB コードの再利用を参照してください。

Stateflow チャートへの MATLAB 関数の追加

この例では、2 つの MATLAB 関数を含むモデルを作成し、それらの関数を使用して、チャートに入力するデータの平均と標準偏差を計算します。

モデルの設定

  1. 新しい Simulink® モデルを作成します。

  2. 1 つの Chart ブロック、1 つの Constant ブロック、2 つの Display ブロックを追加します。

  3. Constant ブロックの値を [2 3 4 5] に設定します。

    Simulink model that contains a Stateflow chart, a constant block, and two display blocks.

  4. モデルを call_stats_function_stateflow という名前で保存します。

Stateflow チャートの構成

  1. Chart ブロックを開きます。

  2. MATLAB 関数のアイコン を使用して MATLAB 関数を 2 つ追加します。

  3. 次のシグネチャを使って関数にラベルを付けます。

    • meanout = meanstats(vals)

    • stdevout = stdevstats(vals)

      Stateflow chart with two MATLAB functions called meanstats and stdevstats.

  4. 次の条件アクションをもつデフォルト遷移を終端ジャンクションに追加します。

    {
    mean = meanstats(invals);
    stdev = stdevstats(invals);
    }

    Stateflow chart with a transition that calls the two MATLAB functions.

    関数シグネチャの引数がスカラーの場合は、関数呼び出しの入力と出力がスカラー拡張のルールに従っていることを確認してください。詳細については、すべての要素への値の代入を参照してください。

データ要素の定義

  1. [シンボル] ペインを開きます。

  2. [タイプ] 列を使用して次のデータのデータ型を設定します。

    • invals:入力データ

    • stdev:出力データ

    • mean:出力データ

    The data in the symbols pane.

標準偏差関数のプログラミング

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;

関数 sumstdevout の値が計算されます。%#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 関数は、コード生成をサポートし、ベクトルの長さを返します。関数 avgmeanout の値が計算されます。plot はコード生成ではサポートされていないため、外部として定義します。

モデルのシミュレーション

Simulink ブロックをチャートの入力端子と出力端子に接続します。

The Simulink model is connected to Stateflow.

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

The Display blocks show the results of simulation.

MATLAB 関数を使用するチャートからのコードの生成

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

参考

(Simulink)

トピック