このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
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: [1x1 Simulink.SimulationData.BlockPath] PortType: 'outport' PortIndex: 1 Values: [2x3 timeseries] Methods, Superclasses
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 つのバス信号 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: [1x1 Simulink.SimulationData.BlockPath] PortType: 'outport' PortIndex: 2 Values: [3x1 timeseries] Methods, Superclasses
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] 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: [1x1 Simulink.SimulationData.BlockPath] PortType: 'outport' PortIndex: 2 Values: {3x1 cell} Methods, Superclasses
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] Methods, Superclasses
outsideTT.Values
ans=3×1 struct array with fields:
data
limits