Main Content

可変サイズの信号の基礎

Simulink® の信号となるのはスカラー、ベクトル (1 次元)、行列 (2 次元) または N 次元の行列です。Simulink の可変サイズの信号は、モデル シミュレーション実行中に、値だけではなくサイズ (次元の要素数) も変更できる信号です。ただし、シミュレーション実行中に次元数を変更することはできません。この機能により、さまざまなリソース、制約、および環境のモデル システムを実現できます。

Simulink モデルに可変サイズの信号を作成するには、次のものを使用します。

  • 異なるサイズの固定サイズの信号をもつ異なる入力端子をもつ、Switch または Multiport Switch ブロック。出力は、可変サイズの信号です。

  • [開始と終了インデックス (端子)] インデックス オプションをもつ Selector ブロック。インデックス端子信号は、シミュレーションの進行中に可変サイズの出力信号を生成する、入力データ信号の異なるサブ領域を指定できます。

  • 可変サイズの信号を受け入れるよう設定された出力端子をもつ S-Function ブロック。出力には、値だけではなく信号の次元も含まれます。

  • 可変サイズの信号を受け入れるよう設定された出力をもつ MATLAB Function ブロック。

可変サイズの信号の伝播方法

Simulink 環境では、可変サイズの信号は、モデル実行中に次の 2 つの方法でサイズを変更できます。

  • モデル実行のステップごと

    モデル内のさまざまなブロックは、出力メソッドの実行中に信号サイズを変更することができます。

  • 条件付きで実行されるサブシステムの初期化中のみ

    サイズ変更は、Action、Enable、および Function-Call などのサブシステムの、異なるモード切り替えイベント中に発生します。

状態をもつ Discrete 2-Tap Filter ブロックを見ると、主な違いがわかります。

Discrete 2-Tap Filter

このフィルターの入力信号の次元が、シミュレーション実行中に 4 から 1 に変化すると仮定します。入力処理を継続するために Unit Delay ブロックの状態が 4 から 1 に変化するタイミングおよび状態はあいまいです。整合性を保つために、両方の Unit Delay ブロックは、その状態の動作を同期的に変更しなければなりません。あいまいさを回避するために、通常、Simulink は、実行中の任意のときに信号のサイズが変化する状況で、状態数が入力信号のサイズに依存するブロックを許可しません。

一方、Function-call Subsystem の同じ Discrete 2-Tap Filter ブロックを見てみましょう。このサブシステムが 2 番目の方法を使用して可変サイズの信号を伝播するものと仮定します。この場合、入力信号のサイズは、サブシステムの初期化のときにのみ 4 から 1 に変化します。初期化の間、サブシステムは (2 つの Unit Delay ブロックの状態を含む) すべての状態を初期値にリセットします。サブシステムをリセットすると、フィルターの入力信号に対する状態の割り当てがあいまいになることはありません。

モード依存の可変サイズ信号は、2 つの方法を使用し、補完的な方法で可変サイズの信号をモデルの複雑なシステムに伝播する様子を示します。

信号線が可変サイズかどうかの確認

次の例では、コマンド プロンプトまたはスクリプトでコマンドを使用して、信号線が可変サイズかどうかを確認する方法について説明します。サブシステムまたは参照モデルの大きなモデルまたは階層で、この手法を使用して上流ブロックにより信号が可変サイズであるかどうかを確認します。

このモデル例 sldemo_varsize_basic には、Switch ブロックの下流の信号 a が含まれています。

  1. モデル例を開きます

  2. 出力信号に a のラベルが付いている Sum ブロックを選択します。

  3. コマンド ウィンドウで以下を入力し、(ブロック線図の更新と同様に) モデルをコンパイルされた状態に設定します。

    sldemo_varsize_basic([],[],[],'compile')

  4. ブロック出力端子へのハンドルを取得します。

    portHandles = get_param(gcb,'portHandles');
    outPortHandle = portHandles.Outport;

  5. 出力端子のプログラム上のパラメーター CompiledPortDimensionsMode をクエリします。

    varSize = get_param(outPortHandle,'CompiledPortDimensionsMode')
    varSize =
    
         1

    変数 varSize の値は 1 で、信号 a が可変サイズであることを示します。

    0 は、信号が可変サイズではないことを示します。

  6. モデルのコンパイルを終了します。

    sldemo_varsize_basic([],[],[],'term')

空の信号

空の信号は、長さが 0 である信号です。たとえば、大きさが [0][0x3][2x0]、および [2x0x3] の信号はすべて空の信号です。Simulink では、空の信号および可変サイズの信号を許容し、ほとんどの要素単位の演算をサポートしています。ただし、Simulink は、信号次元を変更するブロックの空の信号はサポートしません。サポートされないブロックには、特定の次元の Reshape、Permute、および Sum が含まれます。

可変サイズ信号の Simulink ブロック サポート

Simulink ブロックのデータ型サポートの表には、可変サイズ信号をサポートするブロックの詳しい一覧が記載されています。

表を表示するには

  1. Simulink モデルを開きます。

  2. MATLAB® コマンド ラインで「showblockdatatypetable」と入力します。

    別のウィンドウで Simulink ブロック データ型サポート テーブルが表示されます。

[可変サイズ サポート] 列の X は、そのブロックがサポートされていることを示します。

ヒント

また、コマンド プロンプトで「showblockdatatypetable」と入力することでも表を表示できます。

可変サイズの信号のサブシステム初期化

条件付き実行サブシステムの Outport ブロックからの初期信号のサイズは、ユーザーが選択したパラメーターによって異なります。

親サブシステムの [可変サイズの信号のサイズを伝播] パラメーターを [実行中] に設定する場合、Output ブロックの [初期出力] パラメーターは、入力端子の最大サイズを超えてはなりません。[初期出力] パラメーターと初期出力信号サイズとの関係は、次のとおりです。

[初期出力] パラメーター初期出力信号のサイズ
非スカラー行列初期出力信号のサイズは、[初期出力] パラメーターのサイズです。
スカラー初期出力信号のサイズは、スカラーです。
既定の []初期出力信号のサイズは、空の信号 (次元はすべてゼロ) です。

親サブシステムの [可変サイズの信号のサイズを伝播] パラメーターを [イネーブルのときのみ] に設定する場合、Output ブロックの [初期出力] パラメーターは、スカラー値でなければなりません。

  • Outport ブロックの入力についてサイズが再伝播される場合、スカラー パラメーター値のスカラー拡張を使用して初期出力値が設定されます。

  • [初期出力] パラメーターが既定値 [] である場合、Simulink は初期出力を安定した値として扱います。

  • 開始時 (t = 0) にモデルが親サブシステムを有効にしない場合、Outport ブロックに対応するサブシステム出力の現在のサイズは、最大サイズに設定されます。

  • 親サブシステムが信号サイズを再伝播する場合、サブシステムの可変サイズの出力信号の値も初期出力パラメーター値にリセットされます。

条件付き実行サブシステムのブロック

制御端子ブロックは、条件付き実行サブシステムに含まれます。これらのブロックの [可変サイズの信号のサイズを伝播] パラメーターは、[During execution]、[Only when execution is resumed] (Action Port)、および [Only when enabling] (Enable および Trigger または Function-Call) に設定できます。

Switch ブロック

Switch ブロックは、異なるサイズの入力信号を許可し、入力信号サイズを出力信号に伝播することにより、可変サイズ信号をサポートします。これらのブロックについて、[信号属性] ペインの [異なるデータの入力サイズを許可する] パラメーターをオンまたはオフに設定できます。

可変サイズ信号の制限

次の表は、可変サイズ信号の制限について説明します。

制限回避方法
配列形式のログは、可変サイズの信号をサポートしません。可変サイズの信号のログには、[構造体][時間付き構造体]、または [データセット] を使用します。
可変サイズ信号は、離散サンプル時間をもたなければなりません。
Embedded Coder® は、ERT S-Function、カスタム ストレージ クラス、関数プロトタイプ コントロール、AUTOSAR モデル インターフェイス、C++ インターフェイス、および ERT 再利用可能コード インターフェイスでの可変サイズ信号の使用をサポートしません。
Simulink は、可変サイズのパラメーターまたは DWork ベクトルをサポートしません。
ラピッド アクセラレータ モードは、可変サイズの信号を使用するルートレベルの入力端子をもつモデルをサポートしません。
参照モデルへの入力または参照モデルからの出力として使用するバーチャル バス (Model ブロック) は可変サイズの信号をサポートしません。バス信号を非バーチャルとして設定します。バスを参照モデルへの入力または参照モデルからの出力として使用する方法の詳細については、モデル インターフェイスでのバスの使用を参照してください。バーチャル バスを制御する方法の詳細については、合成インターフェイスのガイドラインを参照してください。
ローカル ソルバーを使用するように構成された参照モデルでは、モデル インターフェイスにおける可変サイズの信号の使用はサポートされません。
初期条件を MATLAB 構造体として指定するブロックでは、可変サイズの信号はサポートされません。
バス配列では、ノーマル シミュレーション モードでのみ、可変サイズの信号がサポートされています。

一部のシミュレーション モードでは、可変サイズの信号をもつバス配列については信号のログはサポートされません。

信号のログを使用して可変サイズの信号をもつバス配列をログに記録するには、ノーマル モードでモデルのシミュレーションを実行します。 (R2023a 以降)

一部のシミュレーション モードでは、可変サイズの信号をもつ非バーチャル バスについては信号のログはサポートされません。

次のログを記録するには、ノーマル モードまたはアクセラレータ モードでモデルのシミュレーションを実行します。

  • 可変サイズの信号を直接含んでいるか、入れ子のバスに含んでいる非バーチャル バス

  • 可変サイズの信号を含んでいる非バーチャル バスが入れ子になっているバス

(R2023a 以降)

入れ子の非バーチャル バス内に含まれていない可変サイズの信号をもつバーチャル バスでは、信号のログはサポートされません。
ブロックに入る信号が可変サイズの場合、ストレージ クラスをルートレベルの Outport ブロックに適用できません (C Data Code Interface Configuration for Model Interface Elements (Simulink Coder)を参照)。ストレージ クラスを Outport ブロックではなく、信号線に適用します。

関連するトピック