Main Content

Simulink モデルでの可変サイズ信号の検証

可変サイズの信号の生成および操作

この例のモデルは、複数の固定サイズ信号および単一データ信号から可変サイズの信号を作成する方法を示します。可変サイズの信号に適用できる、いくつかの操作も示します。

可変サイズ信号をサポートしているブロックの完全な一覧については、可変サイズ信号の Simulink ブロック サポートを参照してください。

  1. MATLAB® コマンド ウィンドウで以下のように入力します。

    openExample('sldemo_varsize_basic')
    varSize = get_param(outPortHandle,'CompiledPortDimensionsMode')

  2. Simulink® エディターの [デバッグ] タブで、[情報のオーバーレイ][信号の次元] を選択します。シミュレーションを実行するか、Ctrl - D キーを押します。

    Simulink エディターによって、信号次元とラインのスタイルが表示されます。信号線のスタイルの説明は、信号の基礎を参照してください。

  3. モデル内でブロックの名前を表示できるように、[書式設定] タブで、[自動][自動ブロック名の非表示] をオフにします。

固定サイズ信号からの可変サイズ信号の作成

可変サイズの信号を作成する 1 つの方法は、Switch ブロックの使用です。Switch ブロックの入力信号の次元数およびサイズには、さまざまなものがあります。

Switch ブロックの出力は、最大サイズが 3x2 である 2 次元の可変サイズ信号です。Switch ブロックで [異なるデータの入力サイズを許可する] パラメーターを選択する場合、Simulink は、Constant1 ブロックからスカラー値を拡張しません。

可変サイズ信号データの保存

To Workspace ブロックを、Switch ブロックからの出力に追加することができました。モデルには既に To Workspace ブロックがあるため、2 番目の To Workspace ブロックは、simout2 という信号配列にデータを保存します。values フィールドには、実際の信号値が記録されます。記録された信号データが最大サイズより小さい場合、値は NaN または適切な値で桁が揃えられます。これらの信号値を取得するには、次を入力します。

simout2.signals.values

ans(:,:,1) =

     1    -1
    -2     2
    -3     3


ans(:,:,2) =

     1    -1
    -2     2
    -3     3


ans(:,:,3) =

     0   NaN
   NaN   NaN
   NaN   NaN

valueDimensions フィールドは、可変サイズ信号の次元を記録します。次元を取得するには、次を入力します。

simout2.signals.valueDimensions

最初の 3 つのタイム ステップの信号次元が示されます。

ans =

     3     2
     3     2
     1     1

単一データ信号からの可変サイズ信号の作成

データ信号 (Constant5) は、3x4 行列です。パルス発生器は、開始および終了のインデックス値 ([1 2] または [1 3]) を選択する制御信号を示します。Selector ブロックはインデックス値を使用して、各タイム ステップで各部のデータ信号を選択し、可変サイズ信号を出力します。

信号サイズの変更の表示

Selector ブロックからの出力は、2x2 または 3x3 行列です。可変サイズの信号の最大次元はデータ信号の 3x4 行列であるため、記録された出力信号は、NaN を使用して桁が揃えられます。

可変サイズ信号の現在の次元および幅を確認するには、Probe または Width ブロックを使用します。また、To Workspace ブロックを使用し、Scope ブロックの可変サイズ信号を表示したり、可変サイズ信号をワークスペースに保存したりできます。

可変サイズ信号の処理

モデルの残りの部分は、可変サイズ信号で利用できるさまざまな演算を示しています。演算には、Gain ブロック、Sum ブロック、Math Function ブロック、Matrix Concatenate ブロックの使用が含まれます。可変サイズ信号は、From ブロック、Goto ブロック、Bus Assignment ブロック、Bus Creator ブロック、Bus Selector ブロックに接続できます。

可変サイズの信号長の調整

この例のモデルは、モデルが信号の長さを時間と共に適応させる仮のシステムに対応しています。長さの適応は、制御信号の値に基づきます。3 つの事前定義範囲の 1 つに制御信号が入る場合、固定サイズの元の信号は可変サイズ データ信号に変わります。

可変サイズ信号は処理ブロックに接続され、可変サイズ信号をサポートするブロックは演算を実行します。可変サイズの入力信号および出力信号が含まれる MATLAB Function ブロックは、可変サイズ信号をサポートする他のブロックよりも高い柔軟性を実現します。可変サイズ信号の Simulink ブロック サポートを参照してください。

例のモデルを開くには、MATLAB コマンド ウィンドウで以下を入力します。

openExample('sldemo_varsize_dataLengthAdapt')

モデル内でブロックの名前を表示できるように、[書式設定] タブで、[自動][自動ブロック名の非表示] をオフにします。

データ信号の長さの適応による、可変サイズ信号の作成

このモデルはデータ信号を生成し、その信号を可変サイズ信号に変換します。信号のサイズは、制御信号の値に基づきます。元のデータ信号は、19 の値をもつ列ベクトルです。

[1:9].'

ans =
     1
     2
     3
     4
     5
     6
     7
     8
     9
Size Selection サブシステムは、データ信号の特性を判定し、特性値 (1、2、または 3) を出力します。この値は、Length Adaptation サブシステムのデータ信号の長さを選択するのに役立ちます。

Length Adaptation サブシステムでは、Size Selection サブシステムの特性値 (In2) に基づき、Signal Size サブシステムがインデックスを生成します。Data Selector ブロックは開始および終了のインデックスを使用し、データ信号の長さを適応し (In1)、可変サイズ信号を出力します。

可変サイズ信号の処理

モデルの中央部分は、可変サイズ信号を処理します。MATLAB Function ブロックは、信号のアップサンプリングと同様の方法で、データ値の間にゼロを追加します。信号の次元は、9 から 18 に変わります。Math Function ブロックは、可変サイズ信号で使用できるさまざまな操作を行います。

可変サイズ信号の可視化

モデルの右の部分は、信号の幅 (サイズ) を判定し、スコープを使用して幅および処理済みデータ信号を可視化します。

モード依存の可変サイズ信号

この例のモデルは、3 つの演算モードを備えたシステムを示します。モードによって、処理するデータ信号のサイズは異なります。

このモデルの Process サブシステムは可変サイズ信号を受け取ります。信号のサイズは、システムの演算モードによって異なります。モードの変更ごとに、Stateflow® チャート、Mode Control Logic は、データ信号のサイズの変化を検出します。その後で、Process サブシステムのブロックをリセットするための関数呼び出しを生成します。

モデルを開くには、MATLAB コマンド ウィンドウで以下を入力します。

openExample('sldemo_varsize_multimode')

モデル内でブロックの名前を表示できるように、[書式設定] タブで、[自動][自動ブロック名の非表示] をオフにします。

モードに基づく可変サイズ信号の作成

Mode Selection サブシステムは、データ信号の処理モードを判定し、モード値 (1、2、または 3) を出力します。この値は、Size Selection サブシステムと Data サブシステムを使用してデータ信号の長さを選択するのに役立ちます。

Size Selection サブシステムはモード値からインデックス値を作成します。この例では、インデックス値は、[1 3][1 2]、および [1 1] です。

Data サブシステムはデータ信号 (Constant ブロック) を取得し、モードに基づいてデータ信号の部分を選択します。出力は、最大サイズが 3x32x2、および 1x1 である可変サイズ信号です。

元のデータ信号 (Constant ブロック) の次元は、3x3 です。To Workspace ブロックを信号線に接続した後、次のように入力すると、MATLAB コマンド ウィンドウで信号を表示できます。

simout.signals.values

ans(:,:,1) =

     1     4     7
     2     5     8
     3     6     9

Data サブシステムから生成された可変サイズ信号も、3x3 行列です。桁が短い行は、NaN による桁揃えが行われます。

simout.signals.values

ans(:,:,1) =

     1   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN


ans(:,:,2) =

     1     4   NaN
     2     5   NaN
   NaN   NaN   NaN


ans(:,:,3) =

     1     4     7
     2     5     8
     3     6     9

条件付き実行サブシステムでの可変サイズ信号の処理

Process サブシステムには Delay ブロックが含まれているため、サブシステムはタイム ステップごとに信号をリセットして再伝播します。このモデルは、Stateflow チャートを使用し、信号サイズ変更を検出し、Process サブシステムをリセットします。

Function ブロックのダイアログの [可変サイズの信号のサイズを伝播] リストから、[イネーブルのときのみ] を選択します。モデルがこのサブシステムをイネーブルにしている場合、このオプションを選択すると、Simulink は、条件付き実行サブシステム内の可変サイズ信号を伝播します。信号サイズは、ディセーブルからイネーブルに切り替わるときにのみ変化します。状態を含むブロックでの信号サイズの変化の処理方法の詳細は、可変サイズの信号の伝播方法を参照してください。

Stateflow チャートは、信号のサイズに変化があるかどうかを判断します。関数 size_detect はタイム ステップごとに可変サイズ信号の幅を計算し、現在の幅と以前の幅とを比較します。信号サイズが変更された場合、Process サブシステム内の信号サイズをリセットして再伝播する、関数呼び出し出力イベントがグラフに出力されます。

データの可視化

Probe ブロックを使用し、信号のサイズおよび次元を可視化します。

信号は、n x n 行列であるため、信号の次元のラインはスコープ表示でオーバーラップします。

Display ブロックと Simulink デバッガーを使用すると、タイム ステップごとに信号値を可視化できます。

可変サイズ信号を使用する S-Function

可変サイズ信号を使用する Level-2 MATLAB S-Function

出力端子の DimensionsModeVariable に設定する場合、Level-2 MATLAB S-Function および C S-Function は、可変サイズ信号をサポートします。また、入力および出力の更新メソッドの入力信号および出力信号の現在の次元も考慮する必要があります。

この例のモデルを開くには、MATLAB コマンド ウィンドウで以下を入力します。

msfcndemo_varsize

Enabled Subsystem には、リセットまで状態を保持するブロックを実装する方法を示す、Level-2 MATLAB S-Function が含まれます。このブロックには状態が含まれていて入力信号を遅らせるため、リセット発生時に入力サイズが変化することがあります。

Expand ブロックは、スカラー入力を取得し、入力値により示された長さのベクトルを出力する、Level-2 MATLAB S-Function です。出力は 1:n です。ここで、n は入力値です。

可変サイズ信号を使用する C S-Function

この例のモデルを開くには、MATLAB コマンド ウィンドウで以下を入力します。

sfcndemo_varsize

Enabled Subsystem には、2 つの S-Function が含まれます。

  • sfun_varsize_holdStatesUntilReset は、状態をもち、入力信号のサイズが変化したときに必ずリセットするための DWorks ベクトルを必要とする C S-Function です。

  • sfun_varsize_concat1D は、方向性をもたない 2 つのベクトルの連結を実装する C S-Function です。この関数は、Enabled Subsystem 内で単独で使用できます。

関連するトピック