Main Content

制御フロー ロジックの使用

制御フロー サブシステムとは

"制御フロー サブシステム" は、制御フロー ブロックによって有効にされている場合、現在のタイム ステップで 1 回以上実行されます。制御フロー ブロックは、プログラミング言語の制御フロー ステートメントに似た制御ロジックを実装しています (たとえば、if-thenwhile-doswitchfor など)。

等価な C 言語ステートメント

ブロック線図を使用すると、次の C プログラミング言語ステートメントと等価な制御フロー ロジックをモデル作成できます。

  • for

  • if-else

  • switch

  • while

条件付き制御フロー ロジック

次のブロックを使用すると、条件付き制御フロー ロジックを実行できます。

C ステートメント等価なブロック

if-else

If, If Action Subsystem

switch

Switch Case, Switch Case Action Subsystem

If-Else 制御フロー

次のブロック線図は、if-else 制御フローを表します。

Control flow digram when using if-else conditions

if-else 制御流れ図は、次のようにして作成します。

  1. If ブロックにデータ入力を指定して、if-else 条件を作成します。

    If ブロック パラメーターのダイアログ ボックスで、If ブロックへの入力を設定します。内部的には、これらの入力は u1, u2,..., un と指定され、出力条件を作成するのに使用します。

  2. If ブロック パラメーターのダイアログ ボックスで、If ブロックに対し出力端子の if-else 条件を設定します。

    If ブロック パラメーターのダイアログ ボックスで、出力端子を設定します。このダイアログ ボックスの if、elseif および else 条件フィールド用の各条件を示すには、入力値 u1, u2, ..., un を使用します。これらのフィールドのうち if フィールドだけが必須です。複数の elseif 条件を入力し、チェック ボックスをオンにして elseif 条件を有効にすることもできます。

  3. 各条件出力端子を Action Subsystem に接続します。

    If ブロック上の各 if、elseif および else 条件出力端子は、この端子の Case が true ならば実行されるようにサブシステムに接続します。

    Action Port ブロックをサブシステムに配置して、これらのサブシステムを作成します。これにより、Action という端子名をもつ Atomic Subsystem が作成されます。このサブシステムはさらに If ブロック上の条件に接続されます。

    いったん接続されると、このサブシステムは接続先となる条件の ID を取り、Enabled Subsystem のように動作します。

詳細は、「If ブロック」と「Action Port ブロック」を参照してください。

メモ

If ブロックまたは Switch Case ブロックによって駆動される Action サブシステム内のブロックはいずれも、駆動ブロックと同じレートで実行しなければなりません。

Switch 制御フロー

次のブロック線図は、switch 制御フローを表します。

Control flow diagram when using Switch Case conditions

switch 制御フロー文は、次のようにして作成します。

  1. Switch Case ブロックの引数入力にデータ入力を指定します。

    Switch Case ブロックへの入力は、switch 制御フロー文への引数です。実行される適切な Case はこの値が決定します。端子への非整数入力は切り捨てられます。

  2. 引数入力の数値に基づいて Switch Case ブロックに Case を追加します。

    Switch Case ブロックのパラメーター ダイアログ ボックスを使用して、Case を Switch Case ブロックに追加します。追加する Case は、1 つの値でも複数の値でも構いません。また、オプションの default ケースを追加することもできます。この Case は、他の Case がいずれも true でない場合に true になります。いったん追加された Case は、Switch Case ブロック上の出力端子として表示されます。

  3. Switch Case ブロックの各 Case 出力端子を Action Subsystem に接続します。

    端子の Case が true であれば、Switch Case のブロックの各 Case 出力は、実行対象となるサブシステムに接続されます。Action Port ブロックをサブシステムに配置して、これらのサブシステムを作成してください。これにより、Action という端子名をもつ Atomic Subsystem が作成されます。このサブシステムはさらに Switch Case ブロック上の条件に接続されます。いったん接続されると、このサブシステムは条件の ID を取り、Enabled Subsystem のように動作します。この Case に対して実行されるすべてのブロック プログラミングを、このサブシステムに配置してください。

詳細については、Switch Case ブロックと Action Port ブロックのドキュメンテーションを参照してください。

メモ

特定の Case に対してサブシステムを実行した後、switch 制御フロー文を完全に終了する暗黙ブレークが実行されます。Simulink® switch 制御フロー文の実装では、C の switch ステートメントのように "フォール スルー" の動作にはなりません。

while および for ループ

次のブロックを使用して、while ループと for ループを実行します。

C ステートメント等価なブロック

do-while

While Iterator Subsystem

for

For Iterator Subsystem

while

While Iterator Subsystem

While ループ

次のブロック線図は、while ループを示しています。

Control flow digram when using While loop

この例で、Simulink は、While Iterator ブロックによって指定された条件が満たされるまで、各タイム ステップで While Iterator Subsystem の内容を繰り返し実行します。特に、While Iterator ブロックによって指定されるループの反復ごとに、Simulink は While Subsystem のすべてのブロックの update および output メソッドを、それらが反復されない Atomic Subsystem にある場合に呼び出されるのと同じ順番で呼び出します。

メモ

シミュレーション時間は、While Subsystem の反復実行中には進みません。それにもかかわらず、While Subsystem 内のブロックは、各反復をタイム ステップとして扱います。その結果、While Subsystem の状態をもつブロック (出力が前回の入力に依存するブロック) の出力は、while ループの前の反復で入力の値を反映します。出力は、そのブロックの前のシミュレーション タイム ステップでの入力は "反映しません"。たとえば、While Subsystem の Unit Delay ブロックは、前のシミュレーション タイム ステップの値ではなく、while ループの前の反復で入力の値を出力します。

while ループは、次のようにして作成します。

  1. While Iterator ブロックをサブシステムに配置します。

    ホスト サブシステムのラベルは、while {...} に変わり、while ループをモデル化していることを示します。これらのサブシステムは、Triggered Subsystem のように動作します。また、このサブシステムは、While Iterator ブロックで反復を実行するブロック プログラミングのホストになります。

  2. While Iterator ブロックの初期条件データ入力端子にデータ入力を指定します。

    While Iterator ブロックは、その最初の反復が実行されるときに (IC というラベルの付いた) 初期条件データ入力を要求します。この初期条件データ入力は、While Subsystem の外部から行わなければなりません。この値が 0 でない場合には、最初の反復が起こります。

  3. While Iterator ブロックの条件端子にデータ入力を指定します。

    残っている反復に対する条件は、cond というラベルの付いたデータ入力端子に渡されます。この端子への入力は、While Subsystem の内部で行わなければなりません。

  4. (オプション) While Iterator ブロックを、プロパティ ダイアログを使ってその反復値を出力するように設定します。

    反復値は、最初の反復が実行されるときは 1 で、その後で実行される反復のときには 1 だけ増加します。

  5. (オプション) While Iterator ブロックの反復を、そのプロパティ ダイアログを使って do-while に変更します。

    これにより、ホスト サブシステムのラベルが do {...} while に変更されます。do-while 反復により、While Iteration ブロックは初期条件 (IC) 端子をもたなくなります。これは、(cond というラベルの付いた) 条件端子がチェックされる前にサブシステム内のすべてのブロックが 1 回実行されるためです。

  6. サブシステムの出力を定義するサブシステムにブロック線図を作成します。

    メモ

    ブロック線図は、連続状態をもつブロック (たとえば、Continuous ブロック ライブラリのブロック) を含むことはできません。また、すべてのブロックのサンプル時間は、継承 (-1) または定数 (inf) のいずれかでなければなりません。

詳細は、「While Iterator ブロック」を参照してください。

for ループのモデル化

次のブロック線図は、for ループを表しています。

Control flow diagram when using For loop

この例では、Simulink は、For Iterator Subsystem の内容を各タイム ステップで複数回実行します。この反復回数は For Iterator ブロックへの入力によって指定されます。for ループの反復ごとに、Simulink は For Subsystem のすべてのブロックの update および output メソッドを、それらが反復されない Atomic Subsystem にある場合に呼び出されるのと同じ順番で呼び出します。

メモ

シミュレーション時間は、For Subsystem の反復実行中には進みません。それにもかかわらず、For Subsystem 内のブロックは、各反復をタイム ステップとして扱います。その結果、For Subsystemの状態をもつブロック (出力が前回の入力に依存するブロック) の出力は、for ループの前の反復で入力の値を反映します。出力は、そのブロックの前のシミュレーション タイム ステップでの入力は "反映しません"。たとえば、For Subsystem の Unit Delay ブロックは、前のシミュレーション タイム ステップの値ではなく、for ループの前の反復で入力の値を出力します。

for ループは、次のようにして作成します。

  1. For Iterator Subsystem ブロックを、ライブラリ ブラウザーまたはライブラリ ウィンドウからユーザー モデルへとドラッグします。

  2. (オプション) 実行される反復の回数に対応した外部入力または内部入力を取るように For Iterator ブロックを設定します。

    For Iterator ブロックのプロパティ ダイアログを使って、N というラベルの付いた端子を通して、反復回数に対応した入力を取るように For Iterator ブロックを設定することができます。この入力は、For Iterator Subsystem の外部から行わなければなりません。

    また、このプロパティ ダイアログで、反復回数を直接設定することもできます。

  3. (オプション) For Iterator Subsystem のブロック プログラミングで使用するために、For Iterator ブロックをその反復値を出力するように設定します。

    反復値は、最初の反復が実行されるときは 1 で、その後で実行される反復のときには 1 だけ増加します。

  4. サブシステムの出力を定義するサブシステムにブロック線図を作成します。

    メモ

    ブロック線図は、連続状態をもつブロック (たとえば、Continuous ブロック ライブラリのブロック) を含むことはできません。また、すべてのブロックのサンプル時間は、継承 (-1) または定数 (inf) のいずれかでなければなりません。

Assignment ブロックと連携した For ループの使用

For Iterator ブロックは、Assignment ブロックと連携して、ベクトルまたは行列で値を再度割り当てます。以下の例では、For Iterator ブロックの使用例を示します。渡されるデータの行列の次元に注意してください。

For Iterator subsystem containing Assignment block

Reassign values in a matrix iteratively using a For loop

上記の例では、Assignment ブロックを含む For サブシステムを使って 2 行 5 列 からなる入力行列の正弦値が出力されます。手順は次のとおりです。

  1. 2 行 5 列が Selector ブロックと Assignment ブロックに入力されます。

  2. Selector ブロックは、For Iterator ブロックの現在の反復値が示す列の値において入力行列から 2 行 1 列を取り除きます。

  3. 2 行 1 列の正弦値が取られます。

  4. 2 行 1 列の正弦値が Assignment ブロックに渡されます。

  5. (入力の 1 つとして 2 行 5 列を取る) Assignment ブロックは、反復値が示す列の位置において元の行列に 2 行 1 列を割り当て直します。

    上記の例で示した Assignment ブロックのプロパティ ダイアログで再割り当て用に指定された行は、[1,2] です。元の行列には 2 つの行しか存在しないため、すべての行について -1 と指定することもできます。

    メモ

    Trigonometric Function ブロックは既に行列の正弦値を取ることが可能です。上記の例では、Assignment ブロックと For Iterator ブロックを連携させて行列の各要素を変更する例としてだけ Trigonometric Function ブロックを使用しています。

参考

| | | | |