スクリプトとモデルを使用した 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 1
C をアクション言語として使用した実行
チャート 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