ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

For Each Subsystem

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

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

    HDL Coder / Ports & Subsystems

説明

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

サブシステム内のブロックのセットは、元の信号の 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 回呼び出されることになります。これらのケースのそれぞれに対して、入力信号の要素はそれぞれ異なる値をもちます。

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 のユーザー データ内でキャッシュしないでください。

  • mdlStart から mdlTerminate まで、S-Function の各実行メソッドは For Each Subsystem ブロックにあるとき、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 MemoryData Store Read、および Data Store Write の各ブロック

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

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

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

    • シミュレーション モードが Normal に設定された Model Reference ブロック

    • シャドウ 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 コード生成

端子

入力

すべて展開する

Inport ブロックをサブシステム ブロック内に配置することで、ブロックへの外部入力端子が追加されます。端子ラベルは Inport ブロックの名前と一致します。

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

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

出力

すべて展開する

Outport ブロックをサブシステム ブロック内に配置することで、ブロックの出力端子が追加されます。サブシステム ブロック上の端子ラベルは Outport ブロックの名前です。

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

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

モデルの例

ブロックの特性

データ型

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

直接フィードスルー

いいえ

多次元信号

限定的[a]

可変サイズの信号

いいえ

ゼロクロッシング検出

いいえ

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

拡張機能

R2010a で導入