Main Content

For Each Subsystem における信号のログ記録

For Each Subsystem 内の信号をログ データに記録するために使用するアプローチは、信号が以下のいずれであるかによって異なります。

  • 非バス信号 — For Each Subsystem 内で直接ログを記録します。

  • バスまたはバス配列 — 以下のいずれかのアプローチを使用してください。

    • Bus Selector ブロックを使用してログ記録する信号を選択し、ログ記録用に信号をマークします。このアプローチは、多くのモデルでうまくいきます。

    • その信号を Outport ブロックに付加し、For Each Subsystem の外部で信号のログを記録します。このアプローチは、バス全体をログ記録する場合で、そのバスに多くのバス要素が含まれている場合に使用します。

メモ

For Each Subsystem にバスのログを直接記録することはできません。

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

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

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

For Each Subsystem 内でログ記録される各信号のデータは、別々の Dataset 要素に Simulink.SimulationData.Signal オブジェクトとして保存されます。ログ記録された信号データの形式は、[データセットの信号形式] コンフィギュレーション パラメーターの設定に応じて異なります。

  • 設定が timeseries の場合、各信号オブジェクトには MATLAB® timeseries オブジェクトの配列が含まれます。この配列は、異なる For Each 反復からのデータを個別に保持します。

  • 設定が timetable の場合は、各信号オブジェクトに MATLAB timetable オブジェクトの cell 配列が含まれます。この配列の次元は For Each の反復回数と一致します。たとえば、For Each Subsystem の反復回数が 3 回の場合、ログ データには timeseries オブジェクトまたは timetable オブジェクトの 3x1 配列が含まれます。入れ子にされた For Each Subsystem を使用する場合、入れ子の各層でログ データに別の次元が追加されます。

入れ子にされた For Each Subsystem 内の信号のログ記録

モデル ex_loginsideforeach_nested を開きます。

mdl = "ex_loginsideforeach_nested";
open_system(mdl)

The ex_loginsideforeach_nested model has a 2x3 constant block connected to a for-each subsystem connected to a Terminator block.

Simulink® エディターで、For Each Subsystem1 ブロックを開きます。そのサブシステムの中の For Each Subsystem2 ブロックを開きます。

Inside the For Each Subsystem2 block the input is connected to a Unit Delay block which is connected to an Outport block. The signal is named nestedDelay.

モデルをシミュレートします。

sim(mdl);

トップ サブシステムの 1 回目の反復とボトム サブシステムの 3 回目の反復に関する信号ログ データを確認します。2x3 timeseries は、最初の For Each レベルで反復が 2 回、2 番目の (入れ子にされた) レベルで反復が 3 回行われた結果です。

logsout.get('nestedDelay')
ans = 
  Simulink.SimulationData.Signal
  Package: Simulink.SimulationData

  Properties:
              Name: 'nestedDelay'
    PropagatedName: ''
         BlockPath: [1x1 Simulink.SimulationData.BlockPath]
          PortType: 'outport'
         PortIndex: 1
            Values: [2x3 timeseries]

nestedDelay オブジェクトの値を返します。

logsout.get('nestedDelay').Values(1,3)
  timeseries

  Common Properties:
            Name: 'nestedDelay'
            Time: [5x1 double]
        TimeInfo: tsdata.timemetadata
            Data: [1x1x5 double]
        DataInfo: tsdata.datametadata

For Each Subsystem におけるバスのログ記録

この例では、信号ログを使用して For Each Subsystem 内の 2 つのバス LIMITBUSCOUNTERBUS のログを記録します。LIMITBUS の要素は For Each Subsystem 内で個別にログ記録されます。COUNTERBUS のデータは For Each Subsystem の外部でログ記録されます。

ex_for_each_log_bus モデルを開きます。

mdl = "ex_for_each_log_bus";
open_system(mdl)

The top-model has a Constant block connected to a For Each Subsystem connected to a Terminator block.

Simulink® エディターで、For Each Subsystem ブロックを開きます。

LIMITBUS の要素は For Each Subsystem 内で個別にログ記録するため、バスを Bus Selector ブロックに接続しています。さらに、個々の信号をログ記録用にマークしています。

COUNTERBUS は For Each Subsystem の外部でログ記録するため、Outport ブロックを使用してバス データが最上位モデルに出力されます。さらに、OutsideForEach バスを最上位モデルでログ記録用にマークしています。バスがサブシステムの境界を越えられるように、COUNTERBUS を作成する Bus Creator ブロックの [出力データ型] パラメーターを [Bus: COUNTERBUS] に設定し、[非バーチャル バスとして出力] チェック ボックスをオンにしてあります。

The for-each subsystem model

モデルをシミュレートします。

out1 = sim('ex_for_each_log_bus');

信号ログ出力 logsout を調べます。信号ログでは、データが Dataset 形式でログ記録されます。既定では、それぞれの信号またはバス要素のログ データが Dataset オブジェクトに timeseries として格納されます。

out1.logsout
ans = 
Simulink.SimulationData.Dataset 'logsout' with 3 elements

                         Name                      BlockPath                                
                         ________________________  ________________________________________ 
    1  [1x1 Signal]      OutsideForEach            ex_for_each_log_bus/For Each Subsystem  
    2  [1x1 Signal]      <lower_saturation_limit>  ...g_bus/For Each Subsystem/Bus Selector
    3  [1x1 Signal]      <upper_saturation_limit>  ...g_bus/For Each Subsystem/Bus Selector

  - Use braces { } to access, modify, or add elements using index.

For Each Subsystem 内でログ記録された <lower_saturation_limit> オブジェクトにアクセスし、中かっこを使用して Dataset オブジェクト logsout の 2 番目の要素を取得します。

lowerLimTS = out1.logsout{2}
lowerLimTS = 
  Simulink.SimulationData.Signal
  Package: Simulink.SimulationData

  Properties:
              Name: '<lower_saturation_limit>'
    PropagatedName: ''
         BlockPath: [1x1 Simulink.SimulationData.BlockPath]
          PortType: 'outport'
         PortIndex: 2
            Values: [3x1 timeseries]

lowerLimTS.Values
  3x1 timeseries array with properties:

    Events
    Name
    UserData
    Data
    DataInfo
    Time
    TimeInfo
    Quality
    QualityInfo
    IsTimeFirst
    TreatNaNasMissing
    Length

For Each Subsystem の外部でログ記録された OutsideForEach オブジェクトにアクセスし、中かっこを使用して Dataset オブジェクト logsout の最初の要素を取得します。

outsideTS = out1.logsout{1}
outsideTS = 
  Simulink.SimulationData.Signal
  Package: Simulink.SimulationData

  Properties:
              Name: 'OutsideForEach'
    PropagatedName: ''
         BlockPath: [1x1 Simulink.SimulationData.BlockPath]
          PortType: 'outport'
         PortIndex: 1
            Values: [3x1 struct]

outsideTS.Values
ans=3×1 struct array with fields:
    data
    limits

Dataset 信号形式が timetable の場合、それぞれの信号またはバス要素のログが Dataset オブジェクトに timetable として格納されます。Dataset 信号形式を timetable と指定します。次に、モデルのシミュレーションを再度実行します。

out2 = sim('ex_for_each_log_bus','DatasetSignalFormat','timetable');

この場合、<lower_saturation_limit> オブジェクトと OutsideForEach オブジェクトのデータが timetable として格納されます。

lowerLimTT = out2.logsout{2}
lowerLimTT = 
  Simulink.SimulationData.Signal
  Package: Simulink.SimulationData

  Properties:
              Name: '<lower_saturation_limit>'
    PropagatedName: ''
         BlockPath: [1x1 Simulink.SimulationData.BlockPath]
          PortType: 'outport'
         PortIndex: 2
            Values: {3x1 cell}

lowerLimTT.Values
ans=3×1 cell array
    {1x1 timetable}
    {1x1 timetable}
    {1x1 timetable}

outsideTT = out2.logsout{1}
outsideTT = 
  Simulink.SimulationData.Signal
  Package: Simulink.SimulationData

  Properties:
              Name: 'OutsideForEach'
    PropagatedName: ''
         BlockPath: [1x1 Simulink.SimulationData.BlockPath]
          PortType: 'outport'
         PortIndex: 1
            Values: [3x1 struct]

outsideTT.Values
ans=3×1 struct array with fields:
    data
    limits

参考

ブロック

関数

関連するトピック