Main Content

スクリプトとモデルを使用した 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 は、さまざまな有効な両替銭の構成を含む配列です。

  • chgdonei および n は、両替カウント アルゴリズムで使用するローカル データです。

  • textWidthquietMode は、チャートでの結果の表示方法を制御するローカル データです。

チャートはまず、インデックス 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 ループは、ローカル データ donetrue になるまで、チャートを実行します。最終的に、スクリプトは tabula の値を表示します。

chartObj = sf_change('-warningOnUninitializedData',false,x=27);

while ~chartObj.done
    step(chartObj);
end

disp(chartObj.tabula)
このスクリプトを実行すると、スタンドアロンのチャートは、標準的な米国の硬貨を使用して 27 セントを両替する方法が何通りあるかを計算します。
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    

別の金額の両替方法の数を特定する場合や、別の通貨制度を使用する場合は、xcoinValues の値を変更します。たとえば、英国の通貨を使用する場合は、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 名前空間演算子を使用して関数 stepget および 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

関連するトピック