スクリプトとモデルを使用した Stateflow チャート オブジェクトの実行
スタンドアロンの Stateflow® チャートは、有限ステート マシンの動作を定義する MATLAB® クラスです。スタンドアロンのチャートは、MATLAB をアクション言語として Classic チャートのセマンティクスを実装します。Simulink® でのコード生成が制限されている関数を含めて、MATLAB のすべての機能を使用してチャートをプログラミングできます。詳細については、MATLAB オブジェクトとして実行する Stateflow チャートの作成を参照してください。
この例では、MATLAB スクリプトまたは Simulink モデルを使用してスタンドアロンの Stateflow チャートを実行する方法を説明します。
通貨の両替方法のカウント
ファイル sf_change.sfx は、特定の金額に何通りの両替方法があるかをカウントするスタンドアロンの Stateflow チャートを定義します。チャートには以下のデータ オブジェクトが含まれています。
xは両替する金額です。既定値は 100 です。coinValuesは、昇順に並べた硬貨の額面金額のベクトルです。coinNamesは、対応する硬貨の名前の配列です。既定値は、標準的な米国の硬貨 (pennies (ペニー、1 セント硬貨)、nickels (ニッケル、5 セント硬貨)、dimes (ダイム、10 セント硬貨)、quarters (クオーター、25 セント硬貨)) を表します。tallyは、有効な両替銭の構成の数です。tabulaは、さまざまな有効な両替銭の構成を含む配列です。chg、done、iおよびnは、両替カウント アルゴリズムで使用するローカル データです。textWidthとquietModeは、チャートでの結果の表示方法を制御するローカル データです。

チャートはまず、インデックス 1 で指定される、最低額の硬貨のみから成る両替銭の構成から始まります。実行ステップごとに、ステート exchange は、次の 2 つのうちいずれかの方法でこの構成を変更します。
サブステート
move_upは、最低額の硬貨の一部を、インデックスiで指定された、より高額の硬貨に両替します。
サブステート
move_downは、額面金額がインデックスiで指定されているすべての硬貨を最低額の硬貨に両替します。次に、move_upが、最低額の硬貨の一部を、額面金額がインデックスi+1以上で指定されている硬貨に両替します。
両替銭の構成が有効になるのは、最低額の硬貨で表されるセント数が、その種類の硬貨の額面金額で割り切れる場合です。新しい有効な構成に遭遇すると、チャートは tally をインクリメントし、その新しい構成を tabula に追加します。
硬貨をそれ以上両替できない状態になると、ステート stop がアクティブになります。このステートは、計算の結果を表示し、tabula の内容を table に変換して、done の値を true に設定します。
MATLAB スクリプトでのスタンドアロンのチャートの実行
両替カウント アルゴリズムを最後まで実行するには、スタンドアロンのチャートを複数回実行しなければなりません。たとえば、MATLAB スクリプト sf_change_script.m は、チャート オブジェクト chartObj を作成して、ローカル データ x の値を 27 に初期化します。構成オプション '-warningOnUninitializedData' (false に設定されているスクリプト) は、新しいチャート オブジェクト内の tabula が空の配列であるという警告を回避します。while ループは、ローカル データ done が true になるまで、チャートを実行します。最終的に、スクリプトは tabula の値を表示します。
chartObj = sf_change('-warningOnUninitializedData',false,x=27); while ~chartObj.done step(chartObj); end disp(chartObj.tabula)
sf_change_script
.............
There are 13 ways to make change for 27 cents.
Pennies Nickels Dimes Quarters
_______ _______ _____ ________
27 0 0 0
22 1 0 0
17 2 0 0
12 3 0 0
7 4 0 0
2 5 0 0
17 0 1 0
12 1 1 0
7 2 1 0
2 3 1 0
7 0 2 0
2 1 2 0
2 0 0 1
別の金額の両替方法の数を特定する場合や、別の通貨制度を使用する場合は、x と coinValues の値を変更します。たとえば、英国の通貨を使用する場合は、coinValues を [1 2 5 10 20 25 50] に初期化します。
Simulink モデルを使用したスタンドアロンのチャートの実行
スタンドアロンの Stateflow チャートは、Simulink モデル内から実行できます。たとえば、モデル sf_change_model に含まれている 2 つの Stateflow チャートは、スタンドアロンのチャート sf_change を使用して、2 つの異なる通貨制度で 27 セントを両替する方法の数をカウントします。このモデルをシミュレートすることはできますが、スタンドアロンのチャートを実行する関数は、コード生成をサポートしていません。

各チャートには以下のステートが含まれています。
Initializeは、入力値xに対する両替カウント アルゴリズムを実装するローカル チャート オブジェクトchartObjを作成します。
Executeは、関数stepを呼び出してスタンドアロンのチャートを実行し、結果を出力データtallyとして保存します。
Finishは、アルゴリズムの結果を [診断ビューアー] ウィンドウに表示し、出力データdoneの値をtrueに設定します。
両方のチャートがそれぞれの Finish ステートに到達すると、モデルのシミュレーションが停止し、Display ブロックに 2 つの tally の最終値が表示されます。
MATLAB をアクション言語として使用した実行
チャート MATLAB syntax では MATLAB をアクション言語として使用します。スタンドアロンの Stateflow チャートを実行するには、このチャートは以下のガイドラインに従わなければなりません。
チャート オブジェクトへのハンドルを含むローカル変数
chartObjの型はInherit: From definition in chartです。
チャート オブジェクトを作成する前に、
Initializeステートは関数coder.extrinsicを呼び出し、Simulink でのコード生成が制限されている外部関数としてsf_changeを宣言します。Stateflow チャートでの外部 MATLAB 関数の呼び出しを参照してください。
ExecuteステートとFinishステートは、関数getを呼び出すことにより、スタンドアロンのチャートのローカル データにアクセスします。

入力を x = 27 としてこのチャートをシミュレートすると、Display ブロック Olde English には tally が 4 として表示されます。[診断ビューアー] ウィンドウには次の結果が表示されます。
Pennies Shillings Florins
_______ _________ _______
27 0 0
15 1 0
3 2 0
3 0 1C をアクション言語として使用した実行
チャート C syntax では C をアクション言語として使用します。スタンドアロンの Stateflow チャートを実行するには、このチャートは以下のガイドラインに従わなければなりません。
チャート オブジェクトへのハンドルを含むローカル変数
chartObjの型はmlです。
Initializeステートは、関数mlを呼び出してチャート オブジェクトを作成します。
ExecuteステートとFinishステートは、ml名前空間演算子を使用して関数step、getおよびdisplにアクセスし、スタンドアロンのチャートの実行、そのローカル データへのアクセス、アルゴリズムの結果の表示を行います。
詳細については、C チャート内の MATLAB 関数およびワークスペース データへのアクセスを参照してください。

入力を x = 27 としてこのチャートをシミュレートすると、Display ブロック Modern American には tally が 13 として表示されます。[診断ビューアー] ウィンドウには次の結果が表示されます。
Safety FieldGoal TouchDown
______ _________ _________
12 1 0
9 3 0
6 5 0
3 7 0
0 9 0
10 0 1
7 2 1
4 4 1
1 6 1
5 1 2
2 3 2
3 0 3
0 2 3