このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
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
モデルを開きます。
open_system(docpath(fullfile(docroot,'toolbox','simulink',... 'examples','ex_loginsideforeach_nested.slx')))
Simulink® エディターで、その For Each Subsystem1
ブロックを開き、そのサブシステムの中の For Each Subsystem2
ブロックを開きます。
モデルをシミュレートし、トップ サブシステムの 1 回目の反復とボトム サブシステムの 3 回目の反復に関する信号ログ データを確認します。2x3
timeseries
は、最初の For Each レベルで反復回数が 2 回、2 番目の (入れ子にされた) レベルで反復回数が 3 回行われた結果です。
sim('ex_loginsideforeach_nested'); logsout.get('nestedDelay')
ans = Simulink.SimulationData.Signal Package: Simulink.SimulationData Properties: struct with fields: Name: 'nestedDelay' PropagatedName: '' BlockPath: [1×1 Simulink.SimulationData.BlockPath] PortType: 'outport' PortIndex: 1 Values: [2×3 timeseries]
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]
この例では、1 つの For Each Subsystem 内の 2 つのバス信号のログを記録します。一方のバス信号には Bus Selector ブロックを使用して、選択したそれぞれの信号のログを記録します。もう一方のバス信号には Outport ブロックを使用して、For Each Subsystem の外部でログを記録します。
ex_for_each_log_bus
モデルを開きます。
open_system(docpath(fullfile(docroot,'toolbox','simulink',... 'examples','ex_for_each_log_bus.slx')))
Simulink エディターで、For Each Subsystem
ブロックを開きます。
limits
バス信号内の信号のログを記録する場合、信号が Bus Selector ブロックに分岐され、各バス要素信号が信号ログ記録用にマークされます。
COUNTERBUS
信号全体のログを記録する場合、バス信号が Outport ブロックに接続されます。For Each Subsystem からの出力信号は、信号ログ記録用にマークされます。バス信号がサブシステムの境界を越えられるようにするには、COUNTERBUS
信号を生成する Bus Creator ブロックの [出力データ型] パラメーターが [Bus: COUNTERBUS]
に設定されており、[非バーチャル バスとして出力] チェック ボックスがオンになっている必要があります。
モデルをシミュレートし、信号ログ出力を検証します。For Each Subsystem 内でログ記録されたバス要素信号の 1 つと、For Each Subsystem 外でログ記録されたバス信号に注目します。
sim('ex_for_each_log_bus');
logsout
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.
lower_saturation_limit
オブジェクトの値を返します。
logsout{2}.Values
3×1 timeseries array with properties: Events Name UserData Data DataInfo Time TimeInfo Quality QualityInfo IsTimeFirst TreatNaNasMissing Length
OutsideForEach
オブジェクトの値を返します。
logsout{1}.Values
ans = 3×1 struct array with fields: data limits
Dataset
信号形式が timetable
の場合、出力は timetable
オブジェクトの cell 配列です。以下に例を示します。
out = sim('ex_for_each_log_bus','DatasetSignalFormat','timetable'); out.logsout{2}.Values
ans = 3x1 cell array {11x1 timetable} {11x1 timetable} {11x1 timetable}