Main Content

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

For Each Subsystem

入力信号またはマスク パラメーターの各要素またはサブ配列で実行を繰り返し、結果を連結するサブシステム

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

    HDL Coder / Ports & Subsystems

  • For Each Subsystem block

説明

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

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

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

特定のモデルの場合、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 Subsystem ブロック自身ではなく) サブシステム内の For Each ブロックの MultithreadedSim パラメーターを 'off' に設定します。

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

モデル内のすべての For Each Subsystem についてマルチコア実行を抑止するには、モデル コンフィギュレーション パラメーター MultithreadedSim'off' に設定します。

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

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

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

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 内のバスまたはバス信号の配列のログを直接記録できない。

次のいずれかの方法を使用します。

  • Bus Selector ブロックを使用してログ記録する信号を選択し、ログ記録用に信号をマークします。

  • その信号を Outport ブロックに付加し、For Each Subsystem の外部で信号のログを記録します。

次のいずれかの条件が成立する場合、For Each Subsystem 内にある参照モデル内の信号のログを記録することができない。

  • For Each Subsystem が、ラピッド アクセラレータ モードでシミュレート中のモデル内にある場合。

  • For Each Subsystem 自体が Model ブロックによってアクセラレータ モードで参照されているモデル内にある場合。

1 つ目の条件については、アクセラレータ モードを使用してください。

2 つ目の条件については、ノーマル モードまたはラピッド アクセラレータ モードを使用してください。

For Each Subsystem 内のブロックの状態のログを記録することはできない。

シミュレーション状態を保存し、元に戻します。

For Each Subsystem 内の Model ブロックをシミュレートするのに、ノーマル モードが使用できない。

アクセラレータ モードまたはラピッド アクセラレータ モードを使用してください。

入力信号と出力信号がベクトル (1 次元か 2 次元の行ベクトルまたは列ベクトル) である場合、内容が同じ 2 つの For Each Subsystem に対して再利用可能コードが生成される。n 次元の入力信号と出力信号の場合、再利用可能なコードが生成されるのは、信号が分割される次元が最も高い次元であるときだけである。

信号次元を並べ替えて、分割次元と連結次元を n 次元信号の最も高い大きさが 1 でない次元に変換します。

For Each Subsystem ブロックでは以下の機能はサポートされません。

  • For Each Subsystem 内に以下のブロックや S-Function を含めることはできません。

    • Data Store Memory ブロック、Data Store Read ブロック、または Data Store Write ブロック

    • 入力が Structure with Time で、時間フィールドが空の場合の From Workspace ブロック

    • ブロックを保存する To Workspace データと To File データ

    • サブシステム境界を越える Goto ブロックと From ブロック

    • シミュレーション モードがノーマルに設定された参照モデル

    • シャドウ Inport

    • ERT S-Function

    For Each Subsystem をサポートするブロックの完全なリストを確認するには、MATLAB コマンド ラインで「showblockdatatypetable」と入力します。

  • 以下の信号のタイプは使用できません。

    • システム内での外部ストレージ クラスがある信号

    • サブシステムの入力境界と出力境界でのフレーム信号

    • 可変サイズの信号

  • サブシステム内での線形化点の作成

  • サブシステム内のブロックのヤコビアン フラグの伝播。J.Mi.BlockAnalyticFlags.jacobian を使用すれば、MATLAB でこの状態を確認できます。このとき、J がヤコビアン オブジェクトです。For Each Subsystem ブロックのヤコビアンの正確性を検証するには、次を実行します。

    • For Each Subsystem のヤコビアンのタグを調べます。“not_supported” の場合、ヤコビアンは正しくありません。

    • For Each Subsystem から各ブロックを移動して、そのヤコビアンを計算します。いずれかのブロックが "not_supported" の場合、または警告タグが含まれている場合は、For Each Subsystem のヤコビアンは正しくありません。

  • 以下の種類のコード生成は実行できません。

    • Simulink Coder S-Function ターゲットの生成

    • 次の両方の条件を満たす Simulink Coder コード生成

      • Stateflow® または MATLAB Function ブロックがサブシステム内にある場合。

      • このブロックが、Data Store Memory ブロックや ExportedGlobal ストレージ クラスの Simulink.Signal オブジェクトなどのサブシステム外のグローバル データにアクセスしようとしている場合。

    • PLC コード生成

端子

入力

すべて展開する

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

モデルの例

ブロックの特性

データ型

Boolean[a] | bus[a] | double[a] | enumerated[a] | fixed point[a] | half[a] | integer[a] | single[a]

直接フィードスルー

いいえ

多次元信号

限定的[a]

可変サイズの信号

いいえ

ゼロクロッシング検出

いいえ

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

拡張機能

R2010a で導入