Main Content

コンポーネント配列のインデックス付け

基となるコンポーネントの配列をもつブロックがモデルに含まれている場合、個々の配列メンバーにアクセスして、それらの操作点ターゲットを設定することや、特定のノードに関してログに記録されたシミュレーション データをプロットすることが必要になる場合があります。これを行うには、コマンド ライン インターフェイスを使用してコンポーネントの配列にインデックスを付け、その特定メンバーのデータ ログ ノードまたは操作点ターゲットへのパスを構成します。

以下のルールが適用されます。

  • 配列メンバーには、MATLAB® の行列インデックス手法を使用してアクセスする。詳細については、配列インデックス付けを参照してください。

  • スカラー要素には、通常のパス (ドット区切りまたはスラッシュ区切り) インデックスによってアクセスする。

  • パス インデックスが非スカラー要素と交差することはできない。

  • パス インデックスを行列インデックスと組み合わせることはできない。

最後の 2 つのルールは、以下の例で示すように、中間変数を定義することによってパスを複数の手順で構成する必要が生じる場合があるということを意味します。

コンポーネント配列メンバーのログに記録されたシミュレーション データのプロット

基となるコンポーネントの配列をもつブロックがモデルに含まれている場合、Simscape™ 結果エクスプローラーまたはシミュレーション データ インスペクターを使用して、ログに記録された個々の配列メンバーのシミュレーション データを表示できます。詳細については、Log Data for Component Arraysを参照してください。

また、コマンド ライン インターフェイスを使用してコンポーネントの配列にインデックスを付け、たとえば、ログに記録された特定の配列メンバーのシミュレーション データをプロットすることなどもできます。

サブシステム BatteryPack を含むモデル CompArrayExample があり、その中に、基となる resistor コンポーネントの配列をもつ ResistorArray という名前のブロックがあるとします。配列内の 2 番目の抵抗器を通る電流をプロットします。

図では、Simscape 結果エクスプローラーに、ログに記録されたシミュレーション データのツリー構造 (左側のペイン) と、2 番目の抵抗器を通る電流 i のプロット (右側のペイン) が表示されています。

同じノードにプログラムによってアクセスするには、インデックスを使用してノードへのパスを構成しなければなりません。パス インデックスは配列を横断できないため、まず、ドット インデックスを使用して抵抗器配列へのパスを構成します。

r = simlog.BatteryPack.ResistorArray.resistor
r = 

  1×5 Node array with properties:

    id
    savable
    exportable

次に、行列インデックスを使用して、配列の 2 番目のコンポーネントにアクセスします。

r2 = r(2)
r2 = 

  Node with properties:

                  id: 'resistor'
             savable: 1
          exportable: 0
    power_dissipated: [1×1 simscape.logging.Node]
                   i: [1×1 simscape.logging.Node]
                   v: [1×1 simscape.logging.Node]
                   p: [1×1 simscape.logging.Node]
                   n: [1×1 simscape.logging.Node]

最後に、ドット インデックスを再度使用して、2 番目の抵抗器を通る電流 i のノードにアクセスします。

i = r2.i
i = 

  Node with properties:

            id: 'i'
       savable: 1
    exportable: 0
        series: [1×1 simscape.logging.Series]

ノードをプロットします。

plot(i)

コンポーネント配列メンバーの操作点ターゲットの設定

前の例コンポーネント配列メンバーのログに記録されたシミュレーション データのプロットで説明したモデルに関して、個々の配列メンバーの操作点ターゲットを取得して設定します。

シミュレーション開始の 5 秒後にログに記録されたシミュレーション データから、op という名前の OperatingPoint オブジェクトを作成します。

op = simscape.op.create(simlog, 5)
op = 

  OperatingPoint with children:

  OperatingPoints:

   ChildId                 Size
   ______________________  ____

   'AC Voltage Source'      1x1
   'BatteryPack'            1x1
   'Current Sensor'         1x1
   'Electrical Reference'   1x1
  -----------------------------

配列内で 2 番目の抵抗器の正のノード p において、電圧 v に対し新しい操作点ターゲットを設定するには、前の例の説明と同様の手順に従い、一時オブジェクトを使用してデータ ツリーを通るパスを構築します。

まず、抵抗器の配列の操作点データを抽出します。

r = get(op, 'BatteryPack/ResistorArray/resistor')
r = 

  1×5 OperatingPoint array with properties:

    Identifier
    ChildIds
    Children
    Attributes

次に、電圧のターゲットを取得します。行列インデックスを使用して配列の 2 番目のコンポーネントにアクセスし、そのコンポーネントからターゲットへの通常のスラッシュ区切りパス構成にアクセスします。

t = get(r(2), 'p/v')
t = 

  Target with fields:

        Value: 2.8228e-12 : V
     Priority: None
   Attributes: containers.Map
  Description: Voltage

ターゲットに新しい値を設定します。

V1 = simscape.Value(2.0000e-12, 'V');
t.Value = V1
t = 
  Target with fields:

        Value: 2.0000e-12 : V
     Priority: None
   Attributes: containers.Map
  Description: Voltage

最後に、処理を逆にして、モデル全体の操作点オブジェクトに新しいターゲットを設定します。

r(2) = set(r(2), 'p/v', t);
op = set(op, 'BatteryPack/ResistorArray/resistor', r);

新しい操作点からモデルを初期化します。前の例と比較して、シミュレーション結果が変化したことを確認します。

参考

| |

関連するトピック

外部の Web サイト