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の場合は、各信号オブジェクトに MATLABtimetableオブジェクトの 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)
Simulink® エディターで、For Each Subsystem1 ブロックを開きます。そのサブシステムの中の For Each Subsystem2 ブロックを開きます。

モデルのシミュレーションを実行します。
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: [1×1 Simulink.SimulationData.BlockPath]
PortType: 'outport'
PortIndex: 1
Values: [2×3 timeseries]
Methods, Superclasses
nestedDelay オブジェクトの値を返します。
logsout.get('nestedDelay').Values(1,3) timeseries
Common Properties:
Name: 'nestedDelay'
Time: [5x1 double]
TimeInfo: [1x1 tsdata.timemetadata]
Data: [1x1x5 double]
DataInfo: [1x1 tsdata.datametadata]
More properties, Methods
For Each Subsystem におけるバスのログ記録
この例では、信号ログを使用して For Each Subsystem 内の 2 つのバス LIMITBUS と COUNTERBUS のログを記録します。LIMITBUS の要素は For Each Subsystem 内で個別にログ記録されます。COUNTERBUS のデータは For Each Subsystem の外部でログ記録されます。
ex_for_each_log_bus モデルを開きます。
mdl = "ex_for_each_log_bus";
open_system(mdl)
Simulink® エディターで、For Each Subsystem ブロックを開きます。
LIMITBUS の要素は For Each Subsystem 内で個別にログ記録するため、バスを Bus Selector ブロックに接続しています。さらに、個々の信号をログ記録用にマークしています。
COUNTERBUS は For Each Subsystem の外部でログ記録するため、Outport ブロックを使用してバス データが最上位モデルに出力されます。さらに、OutsideForEach バスを最上位モデルでログ記録用にマークしています。バスがサブシステムの境界を越えられるように、COUNTERBUS を作成する Bus Creator ブロックの [出力データ型] パラメーターを [Bus: COUNTERBUS] に設定し、[非バーチャル バスとして出力] チェック ボックスをオンにしてあります。

モデルのシミュレーションを実行します。
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: [1×1 Simulink.SimulationData.BlockPath]
PortType: 'outport'
PortIndex: 2
Values: [3×1 timeseries]
Methods, Superclasses
lowerLimTS.Values
3×1 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: [1×1 Simulink.SimulationData.BlockPath]
PortType: 'outport'
PortIndex: 1
Values: [3×1 struct]
Methods, Superclasses
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: [1×1 Simulink.SimulationData.BlockPath]
PortType: 'outport'
PortIndex: 2
Values: {3×1 cell}
Methods, Superclasses
lowerLimTT.Values
ans=3×1 cell array
{1×1 timetable}
{1×1 timetable}
{1×1 timetable}
outsideTT = out2.logsout{1}outsideTT =
Simulink.SimulationData.Signal
Package: Simulink.SimulationData
Properties:
Name: 'OutsideForEach'
PropagatedName: ''
BlockPath: [1×1 Simulink.SimulationData.BlockPath]
PortType: 'outport'
PortIndex: 1
Values: [3×1 struct]
Methods, Superclasses
outsideTT.Values
ans=3×1 struct array with fields:
data
limits