Main Content

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

For Each Subsystem

入力信号またはマスク パラメーターの個々の要素またはサブ配列にアルゴリズムを適用

  • ライブラリ:
  • Simulink / Ports & Subsystems

    HDL Coder / Ports & Subsystems

  • For Each Subsystem block

説明

For Each Subsystem ブロックは、シミュレーション タイム ステップ中に入力信号またはマスク パラメーター配列の各要素またはサブ配列で実行を繰り返すサブシステムを作成するための開始点として事前構成されている Subsystem ブロックです。

For Each Subsystem block icon, displayed alongside contents of For Each subsystem, consisting of a For Each block, an Inport block, and an Outport block.

メモ

ローカル ソルバーを使用するモデルは For Each Subsystem 内に配置できません。

サブシステム内のブロックのセットは、元の信号またはマスク パラメーター配列の 1 つの要素またはサブ配列に適用されるアルゴリズムを表します。このサブシステム内では、状態をもつ各ブロックは、処理対象の各要素またはサブ配列ごとに独立した状態セットを維持します。したがって、このサブシステムの操作は動作の点で、元の入力信号またはマスク パラメーター配列の各要素についてサブシステムの内容をコピーし、そのコピーを使用して各要素を処理することに似ています。サブシステム内のブロック セットが要素またはサブ配列を処理するとき、サブシステムは結果を連結して出力信号を形成します。

サブシステムの設定

For Each Subsystem ブロックには、このサブシステムの制御ブロックとして機能する For Each ブロックが含まれます。For Each ブロックのパラメーターを指定して、サブシステム入力またはマスク パラメーターを要素またはサブ配列に分解する処理、および個別の結果を連結して出力信号にする処理を設定します。ブロック パラメーター [分割次元] および [分割幅] で、入力信号またはマスク パラメーター配列をスライスする次元と各スライスの幅をそれぞれ指定します。行ベクトルを分割するには、[分割次元]2 に指定します。列ベクトルを分割するには、[分割次元]1 に指定します。パラメーター [分割オフセット] を使用して、分割の間のギャップまたはオーバーラップを指定します。データのサブセットに対する処理を制限するには [反復回数] を指定します。このブロック パラメーターの詳細については、For Each を参照してください。

入力信号のサブシステムへの分割

各反復に分割する入力信号を For Each Subsystem で指定するには、For Each ブロックのダイアログ ボックスの [入力分割] タブを使用します。分割する信号を指定するときは、[分割次元] パラメーター、[分割幅] パラメーター、[分割オフセット] パラメーターを指定します。

サブシステムのマスク パラメーターの分割

For Each Subsystem ブロックのマスク パラメーターは分割できます。分割は、システムの構造は変えずにパラメーターの値を変えて反復処理する場合に便利です。この場合、パラメーターごとにモデルを変更して追加の入力信号を分割する方法では煩雑になります。代わりに、For Each Subsystem にマスク パラメーターを追加します。詳細については、簡単なマスクの作成を参照してください。分割するマスク パラメーターを選択するには、For Each ブロックのダイアログ ボックスの [パラメーターの分割] タブを使用します。詳細については、以下の分割パラメーターの選択を参照してください。

出力の連結

結果を連結する次元を定義するには、[出力連結] タブで [連結の次元] を指定します。

サブ配列ごとにブロックによって生成された結果は、連結次元に沿って積み上げられます。既定では、次元 1 (y 軸) が使用され、結果が垂直に積み上げられることを意味します。ただし、連結の次元を 2 に指定すると、結果は水平方向 (x 軸) に連結されます。したがって、行ベクトルが処理されると、連結された結果は、最初のケースは行列になり、2 番目のケースは行ベクトルになります。

分割パラメーターの選択

分割する入力信号またはサブシステムのマスク パラメーターを選択するときは、それらを各反復用に要素またはサブ配列に分解する方法を指定しなければなりません。[分割次元] パラメーターと [分割幅][分割オフセット] パラメーターで整数値を設定します。

例として、次の形式の入力信号行列 A について考えてみます。

A 3-by-3 matrix A with all nine elements displayed, showing d1 as the vertical dimension and d2 as the horizontal dimension

ラベル d1 と d2 は、それぞれ次元 1 と次元 2 を定義します。分割次元と分割幅の両方に対して既定の設定 1、分割オフセットに 0 が保持されると、Simulink® は分割幅に等しい幅つまり 1 要素分の幅で分割次元 1 に対して直角にスライスします。

A 3-by-3 matrix A, with all nine elements showing, partitioned into rows

行列 A は、次の 3 つの行ベクトルに分解されます。

A 3-by-3 matrix A, decomposed into three 3-element row vectors

代わりに分割次元 2 を指定すると、Simulink は次元 2 に対して直角にスライスして、次の 3 つの列ベクトルを形成します。

A 3-by-3 matrix A, decomposed into three 3-element column vectors

[分割次元]2 に設定する以外に、[分割幅]2 および [分割オフセット]-1 に設定すると、Simulink は 2 つのオーバーラップする 3 行 2 列の分割を処理に使用します。

A 3-by-3 matrix A, decomposed into two overlapping 3-by-2 matrices

[分割オフセット] パラメーターの使用例については、モデル slexForEachOverlapExample を開いてください。

既定では、入力信号またはマスク パラメーターのすべての分割が処理されます。分割のサブセットを処理するには、処理する分割数を [反復回数] として入力します。上記の行列の例では、[分割オフセット]0 (既定の設定) に、[反復回数]2 に設定すると、入力行列 A の最初の 2 行または 2 列のみが処理されます。

メモ

Simulink で 1 次元と見なされるのは信号だけです。マスク パラメーターは、方向に応じて行ベクトルか列ベクトルのどちらかになります。行ベクトルを分割するには、分割次元を 2 (列方向) に指定します。列ベクトルを分割するには、分割次元を 1 (行方向) に指定します。

コード再利用のサポート

特定のモデルの場合、For Each Subsystem ブロックは、Simulink Coder™ 生成コードでのコードの再利用を向上させます。スカラー アルゴリズムが同じである、2 つの再利用可能な Atomic Subsystem ブロックを格納したモデルが、信号の各要素に適用されるとします。これらのサブシステムの入力信号次元が異なる場合、Simulink Coder 生成コードには 2 つの異なる関数が含まれます。これら 2 つのサブシステムを入力の各要素を同じアルゴリズムで処理するように設定された 2 つの同じ For Each Subsystem ブロックに置き換えることができます。この場合、Simulink Coder 生成コードは、入力信号の要素数でパラメーター化される 1 つの関数で構成されます。モデルの For Each Subsystem ブロックの一意のインスタンスごとに 1 回呼び出されるので、この関数は 2 回呼び出されることになります。これらのケースのそれぞれに対して、入力信号の要素はそれぞれ異なる値をもちます。

マルチコア実行のサポート

ラピッド アクセラレータ モードでモデルのシミュレーションを行う場合、Simulink は For Each Subsystem のより高速なシミュレーションのため、マルチコア実行を使用します。Simulink は、対象となる各 For Each Subsystem について、ラピッド アクセラレータ モードで実行される最初の 2 タイム ステップを自動的にプロファイリングして、並列実行時間と逐次実行時間を比較します。続いて、Simulink は、そうすることによって実行時間の速度が増すようであれば、シミュレーション実行の後続のタイム ステップにおいて、並列のマルチコア実行に For Each Subsystem を指定します。入れ子にされた For Each Subsystem の場合、マルチコア実行は最上位サブシステムにのみ適用されます。連続状態または Function Caller ブロックを含む For Each Subsystem にはマルチコア実行は適用されません。

特定の For Each Subsystem についてマルチコア実行を抑止するには、サブシステム内の For Each ブロックの MultithreadedSim パラメーターを 'off' に設定します。

set_param(ForEachBlockName,'MultithreadedSim','off')

For Each Subsystem ブロック自身ではなく、サブシステム内の For Each ブロックのパラメーターであることに注意してください。モデル内のすべての For Each Subsystem についてマルチコア実行を抑止するには、モデルの MultithreadedSim パラメーターを 'off' に設定します。

set_param(ModelName,'MultithreadedSim','off')

マルチコア実行を再度有効にするには、関連する MultithreadedSim パラメーターを既定値である 'auto' に設定します。

例については、For Each Subsystem を使用したマルチスレッド シミュレーションを参照してください。

メモ

ラピッド アクセラレータ モードでモデルのシミュレーションを行うかモデルからコードを生成する場合に、For Each Subsystem でマスク パラメーターを分割するときは、分割されたパラメーターを参照する For Each Subsystem 内のすべての式が調整可能な式である必要があります。調整可能な式の制限 (Simulink Coder)を参照してください。

S-Function のサポート

For Each Subsystem ブロックは、C-MEX S-Function と Level-2 MATLAB® S-Function の両方をサポートします。ただし、S-Function が次の手法のいずれかを使用して複数の実行インスタンスをサポートすることが条件です。

  • C-MEX S-Function は mdlSetWorkWidths メソッドで ssSupportsMultipleExecInstances(S, true) を宣言しなければなりません。

  • Level-2 MATLAB S-Function は、Setup メソッドで block.SupportsMultipleExecInstances = true を宣言しなければなりません。

これらの仕様を使用する場合:

  • DWork や Block I/O などの実行時データを、グローバル変数または永続変数を使用して、あるいは S-Function のユーザー データ内でキャッシュしないでください。

  • For Each Subsystem ブロックでは、mdlStart から mdlTerminate までの S-Function の各実行メソッドは、S-Function によって処理される各要素に対して 1 回呼び出されます。したがって、mdlTerminate に対する繰り返しの呼び出しで同じメモリを開放することのないように確認する必要があります。たとえば、mdlSetWorkWidths 内でランタイム パラメーターのメモリを割り当てる C-MEX S-Function について考えます。mdlTerminate でこのメモリを開放する必要があるのは 1 回だけです。解決策として、mdlTerminate をはじめて呼び出した後にポインターを空に設定します。

制限

For Each Subsystem ブロックの制限の詳細については、For Each Subsystem の制限を参照してください。

端子

入力

すべて展開する

Subsystem ブロックへの信号入力。スカラー、ベクトルまたは行列として指定します。Inport ブロックを Subsystem ブロック内に配置することで、ブロックへの外部入力端子が追加されます。端子ラベルは Inport ブロックの名前と一致します。

ローカル環境から信号を受信するには、Inport ブロックを使用します。

データ型: half | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | fixed point | enumerated | bus

出力

すべて展開する

Subsystem ブロックからの信号出力。スカラー、ベクトルまたは行列として返されます。Outport ブロックを Subsystem ブロック内に配置することで、ブロックへの外部出力端子が追加されます。端子ラベルは Outport ブロックの名前と一致します。

信号をローカル環境に送信するには、Outport ブロックを使用します。

データ型: half | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | fixed point | enumerated | bus

モデルの例

ブロックの特性

データ型

Booleana | busa | doublea | enumerateda | fixed pointa | halfa | integera | singlea

直達

いいえ

多次元信号

限定的a

可変サイズの信号

いいえ

ゼロクロッシング検出

いいえ

a 実際のデータ型または機能のサポートは、ブロックの実装に依存します。

拡張機能

バージョン履歴

R2010a で導入