Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

反復サブシステムの実行

"論理的に実行されるサブシステム" ブロックは、"制御ブロック" によってイネーブルにされたときに現在のタイム ステップで 1 回以上実行されます。制御ブロックは、プログラミング言語のステートメント (if-then、switch、while、for など) によって表現されるのと同様の制御ロジックを実装します。

反復サブシステムは、論理的に実行されるサブシステムの 1 つで、サブシステム ブロックの内部の制御ブロックに応じてタイム ステップ中に 1 回以上実行されます。

メモ

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

While 構造を含むモデル

While Iterator Subsystem ブロックは、論理 (Boolean) 式が true の間、シミュレーション タイム ステップ中に実行を繰り返すサブシステムを作成するための開始点として事前構成されている Subsystem ブロックです。

次のモデルについて考えます。モデルを開くには、ex_while_iterator_block を参照してください。

While Iterator ブロックへの入力が 1 (true) の場合にサブシステムがアクティブになります。各タイム ステップで、最大合計値に達するまで、現在の反復回数が累計に加算されます。

このモデルの while 構造は、次のような疑似コードで表すことができます。

maximum_sum = 10;
sum = 0;
iteration_number = 0

condition = (maximum_sum > 0)
WHILE condition NOT EQUAL 0
	iteration_number = iteration_number + 1
	sum = sum + iteration_number
	IF (sum > maximum_sum OR iteration_number > maximum_iterations) THEN
		condition = 0
END WHILE

While 構造を含むモデルの作成

このモデル例を作成するには、次の手順を使用します。

  1. Simulink® エディターで While Iterator Subsystem ブロックを配置します。サブシステム ブロックをダブルクリックして内容を表示します。

  2. While Iterator ブロックをダブルクリックしてブロック パラメーター ダイアログ ボックスを開きます。[最大反復回数]20 に設定し、[開始時の状態][リセット] に設定します。[反復回数の端子を表示] チェック ボックスをオンにします。

  3. MemoryRelational Operator および Sum ブロックを追加します。ブロックを次のように接続します。Memory ブロックで [サンプル時間を継承] チェック ボックスをオンにします。

    合計が Inport ブロック 1 からの最大合計値以上になるまで、While Iterator ブロックの出力からの反復回数が前の値に加算されます。

  4. モデルの最上位レベルに移動します。

  5. Constant ブロックを入力端子 2 に接続します。このブロックは While Iterator ブロックの "初期論理条件" の値を提供します。[定数値] を 0 以外の任意の数値に設定します。

    While Iterator ブロックは、最初の反復を開始するために初期論理条件 (IC というラベルが付いた入力端子) を必要とします。これは While Iterator Subsystem ブロックをイネーブルにする信号であり、サブシステムの外部からの信号でなければなりません。この値が 0 でない場合には、最初の反復が起こります。

  6. 2 つ目の Constant ブロックを入力端子 1 に接続します。このブロックは反復アルゴリズムの最大値を提供します。アルゴリズムでは、この最大値に達するまで連続する整数を加算していきます。

  7. Display ブロックを出力端子 1 に接続します。このブロックは While Integrator ブロックの出力端子からの反復回数を表示します。

  8. シミュレーションを実行します。

    単一のタイム ステップで、最初から 4 回目までの反復回数が累計に加算されます (10)。5 回目の反復で、合計 (15) が最大合計値 (10) を超えて反復が停止し、次のタイム ステップまでブロックが待機状態になります。

メモ

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

For 構造を含むモデル

For Iterator Subsystem ブロックは、指定した反復回数に達するまでシミュレーション タイム ステップ中に実行を繰り返すサブシステムを作成するための開始点として事前構成されている Subsystem ブロックです。

次のモデルについて考えます。モデルを開くには、ex_for_iterator_block を参照してください。

この反復回数は For Iterator ブロックへの入力によって指定されます。各タイム ステップで、5 回目の反復まで、現在の反復回数が累計に加算されます。

このモデルの for 構造は、次のような疑似コードで表すことができます。

number_of_iterations = 5
sum = 0;
iteration_number = 0

FOR iteration_number = 0 TO number_of_iterations
    iteration_number = iteration_number + 1
    sum = sum + iteration_number
END FOR

For 構造を含むモデルの作成

このモデル例を作成するには、次の手順を使用します。

  1. Simulink エディターで For Iterator Subsystem ブロックを配置します。サブシステム ブロックをダブルクリックして内容を表示します。

  2. For Iterator ブロックをダブルクリックしてブロック パラメーター ダイアログ ボックスを開きます。[開始時の状態][リセット] に設定し、[反復制限元][外部] に設定します。

  3. MemorySum および Outport ブロックを追加します。ブロックを次のように接続します。Memory ブロックで [サンプル時間を継承] チェック ボックスをオンにします。

    合計が Inport ブロック 1 から指定される反復回数に達するまで、For Iterator ブロックの出力からの反復回数が前の値に加算されます。

  4. モデルの最上位レベルに移動します。

  5. Constant ブロックを入力端子 1 に接続します。このブロックは For Iterator ブロックの反復回数を提供します。[定数値]5 に設定します。

  6. Display ブロックを出力端子 1 と出力端子 2 に接続します。これらのブロックは For Integrator ブロックの出力端子からの反復回数と Memory ブロックからの合計を表示します。

  7. シミュレーションを実行します。

    各タイム ステップで、最初から 5 回目までの反復回数が累計に加算されます (15)。

Assignment ブロックの使用

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

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

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

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

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

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

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

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

    メモ

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

モデル例

参考

ブロック