While Iterator Subsystem および For Iterator Subsystem を使用した反復サブシステムの実行
While Iterator Subsystem や For Iterator Subsystem などの "反復サブシステム" は、論理的に実行されるサブシステムの 1 つで、サブシステム ブロックの内部の制御ブロックに応じてタイム ステップ中に 1 回以上実行されます。制御ブロックは、プログラミング言語の while
ループや for
ループなどの構造によって表現されるのと同様の制御ロジックを実装します。
入力信号やマスク パラメーターを個々の要素またはサブ配列に分割してそれぞれにアルゴリズムを適用する For Each Subsystem の詳細については、For Each Subsystemを参照してください。
メモ
While Iterator Subsystem ブロックと For Iterator Subsystem ブロックは、連続状態をもつブロック (たとえば、Continuous ブロック ライブラリのブロック) を含むことはできません。サンプル時間は、サブシステム内のすべてのブロックについて、継承 (-1
) または定数 (inf)
のいずれかでなければなりません。
While 構造を含むモデル
While Iterator Subsystem ブロックは、論理 (Boolean) 式が true の間、シミュレーション タイム ステップ中に実行を繰り返すサブシステムを作成するための開始点として事前構成されている Subsystem ブロックです。
boolean 式が true の場合にブロックの実行を繰り返す
この例では、最大値に達するまでサブシステムを実行する方法を示します。
モデル ex_while_iterator_block
を開きます。
While Iterator サブシステムを開きます。
While Iterator ブロックへの入力が 1
(true
) の場合にサブシステムがアクティブになります。各タイム ステップで、最大合計値に達するまで、現在の反復回数が累計に加算されます。
このモデルの "while" 構造は、次のような疑似コードで表すことができます。
maximum_sum = 10 sum = 0 iteration_number = 1 condition = TRUE
WHILE (condition is TRUE) AND (iteration_number <= maximum_iterations) sum = sum + iteration_number IF (sum > maximum_sum) THEN condition = FALSE END IF iteration_number = iteration_number + 1 END WHILE
While 構造を含むモデルの作成
このモデル例を作成するには、次の手順を使用します。
Simulink® エディターで While Iterator Subsystem ブロックを配置します。サブシステム ブロックをダブルクリックして内容を表示します。
While Iterator ブロックをダブルクリックしてブロック パラメーター ダイアログ ボックスを開きます。[最大反復回数] を
20
に設定し、[開始時の状態] を[リセット]
に設定します。[反復回数の端子を表示] チェック ボックスをオンにします。Memory、Relational Operator および Sum ブロックを追加します。ブロックを次のように接続します。Memory ブロックで [サンプル時間を継承] チェック ボックスをオンにします。
合計が Inport ブロック 1 からの最大合計値以上になるまで、While Iterator ブロックの出力からの反復回数が前の値に加算されます。
モデルの最上位レベルに移動します。
Constant ブロックを入力端子 2 に接続します。このブロックは While Iterator ブロックの "初期論理条件" の値を提供します。[定数値] を 0 以外の任意の数値に設定します。
While Iterator ブロックは、最初の反復を開始するために初期論理条件 (
IC
というラベルが付いた入力端子) を必要とします。これは While Iterator Subsystem ブロックをイネーブルにする信号であり、サブシステムの外部からの信号でなければなりません。この値が 0 でない場合には、最初の反復が起こります。2 つ目の Constant ブロックを入力端子 1 に接続します。このブロックは反復アルゴリズムの最大値を提供します。アルゴリズムでは、この最大値に達するまで連続する整数を加算していきます。
Display ブロックを出力端子 1 に接続します。このブロックは While Iterator ブロックの出力端子からの反復回数を表示します。
シミュレーションを実行します。
単一のタイム ステップで、最初から 4 回目までの反復回数が累計に加算されます (
10
)。5 回目の反復で、合計 (15
) が最大合計値 (10
) を超えて反復が停止し、次のタイム ステップまでブロックが待機状態になります。
メモ
シミュレーション時間は While Iterator Subsystem ブロックの反復の実行中は進みません。それにもかかわらず、サブシステム内のブロックは、各反復をタイム ステップとして扱います。その結果、While Iterator Subsystem ブロックでは、状態をもつブロック (出力が前回の入力に依存するブロック) の出力は、while
ループの前の反復で入力の値を反映します。出力は、ブロックの前のシミュレーション タイム ステップでの入力は "反映しません"。たとえば、While Iterator Subsystem の Unit Delay ブロックは、前のシミュレーション タイム ステップの値ではなく、while
ループの前の反復で入力の値を出力します。
For 構造を含むモデル
For Iterator Subsystem ブロックは、指定した反復回数に達するまでシミュレーション タイム ステップ中に実行を繰り返すサブシステムを作成するための開始点として事前構成されている Subsystem ブロックです。
ブロックの実行を指定された回数繰り返す
この例では、シミュレーション タイム ステップ中に指定された反復回数だけ実行を繰り返すサブシステムを示します。
モデル ex_for_iterator_block
を開きます。
For Iterator サブシステムを開きます。
この反復回数は For Iterator ブロックへの入力によって指定されます。各タイム ステップで、5
回目の反復まで、現在の反復回数が累計に加算されます。
このモデルの "for" 構造は、次のような疑似コードで表すことができます。
number_of_iterations = 5 sum = 0
FOR iteration_number = 1 TO number_of_iterations sum = sum + iteration_number END FOR
For 構造を含むモデルの作成
このモデル例を作成するには、次の手順を使用します。
Simulink エディターで For Iterator Subsystem ブロックを配置します。サブシステム ブロックをダブルクリックして内容を表示します。
For Iterator ブロックをダブルクリックしてブロック パラメーター ダイアログ ボックスを開きます。[開始時の状態] を
[リセット]
に設定し、[反復制限元] を[外部]
に設定します。Memory、Sum および Outport ブロックを追加します。ブロックを次のように接続します。Memory ブロックで [サンプル時間を継承] チェック ボックスをオンにします。
合計が Inport ブロック 1 から指定される反復回数に達するまで、For Iterator ブロックの出力からの反復回数が前の値に加算されます。
モデルの最上位レベルに移動します。
Constant ブロックを入力端子 1 に接続します。このブロックは For Iterator ブロックの反復回数を提供します。[定数値] を
5
に設定します。Display ブロックを出力端子 1 と出力端子 2 に接続します。これらのブロックは For Iterator ブロックの出力端子からの反復回数と Memory ブロックからの合計を表示します。
シミュレーションを実行します。
各タイム ステップで、最初から 5 回目までの反復回数が累計に加算されます (
15
)。
参考
While Iterator Subsystem | While Iterator | For Iterator Subsystem | For Iterator | Subsystem