シミュレーション データ アンサンブルの生成と使用
この例では、故障パラメーターを変化させながら機械の Simulink® モデルをシミュレートすることにより、予知保全アルゴリズム設計のためのデータ アンサンブルを生成する方法を説明します。その後、シミュレーション アンサンブル データストアを操作する方法をいくつか示します。例ではデータストアから MATLAB® ワークスペースにデータを読み取り、データを処理して派生変数を計算し、新しい変数をデータストアに書き戻す方法を説明します。
この例のモデルは、Simulink を使用した故障データの生成で説明されているギアボックス モデルの簡易版です。Simulink モデルを読み込みます。
mdl = 'TransmissionCasingSimplified';
open_system(mdl)
この例では、故障モードが 1 つだけモデル化されています。ギア歯の故障は Gear Tooth fault
サブシステムでの外乱としてモデル化されます。外乱の大きさは、モデル変数 ToothFaultGain
によって制御されます。ここで、ToothFaultGain = 0
はギア歯の故障がない状態 (健全動作) に対応します。
シミュレーション データのアンサンブルの生成
故障データのシミュレーション アンサンブル データストアを生成するには、generateSimulationEnsemble
を使用して、モデルを -2 ~ 0 の範囲にある異なる ToothFaultGain
値でシミュレートします。この関数は、指定した Simulink.SimulationInput
オブジェクトの配列の各エントリにつきモデルを 1 回シミュレートします。各シミュレーションは別個のアンサンブル メンバーを生成します。こうした配列を作成し、setVariable
を使用して実行ごとにギア歯の故障のゲイン値を割り当てます。
toothFaultValues = -2:0.5:0; % 5 ToothFaultGain values for ct = numel(toothFaultValues):-1:1 tmp = Simulink.SimulationInput(mdl); tmp = setVariable(tmp,'ToothFaultGain',toothFaultValues(ct)); simin(ct) = tmp; end
この例では、モデルが Vibration
と Tacho
の特定の信号値をログに記録するよう既に構成されています (信号ログを使用した信号データの保存 (Simulink)を参照)。関数 generateSimulationEnsemble
は、モデルをさらに次のように構成します。
ログ データを指定のフォルダー内のファイルに保存する
信号のログに
timetable
形式を使用する各
Simulink.SimulationInput
オブジェクトを対応するログ データとともに保存ファイル内に格納する
生成されるデータの場所を指定します。この例では、現在のフォルダー内の Data
というフォルダーにデータを保存します。シミュレーションがすべてエラーなしで完了した場合、関数はインジケーター出力 status
に true
を返します。
mkdir Data location = fullfile(pwd,'Data'); [status,E] = generateSimulationEnsemble(simin,location);
[21-Jul-2024 12:09:08] Running simulations... [21-Jul-2024 12:09:17] Completed 1 of 5 simulation runs [21-Jul-2024 12:09:19] Completed 2 of 5 simulation runs [21-Jul-2024 12:09:21] Completed 3 of 5 simulation runs [21-Jul-2024 12:09:23] Completed 4 of 5 simulation runs [21-Jul-2024 12:09:25] Completed 5 of 5 simulation runs
status
status = logical
1
Data
フォルダー内でファイルの 1 つを確認します。各ファイルは次の MATLAB 変数を含む MAT ファイルです。
SimulationInput
— ファイル内のデータを生成するためにモデルの構成に使用されたSimulink.SimulationInput
オブジェクト。これを使用して、このシミュレーションが実行された状態 (故障か健全かなど) に関する情報を抽出できます。logsout
— Simulink モデルがログに記録するよう構成されている対象データをすべて含むDataset
オブジェクト。PMSignalLogName
— ログ データを含む変数の名前 (この例では'logsout'
)。simulationEnsembleDatastore
コマンドはこの名前を使用してファイル内のデータを解析します。SimulationMetadata
— ファイル内に記録されたデータを生成したシミュレーションに関するその他の情報。
これで、生成されたデータを使ってシミュレーション アンサンブル データストアを作成することができます。結果の simulationEnsembleDatastore
オブジェクトは生成されたデータを指します。オブジェクトはアンサンブル内のデータ変数をリストし、既定ではすべての変数が読み取り対象として選択されています。
ensemble = simulationEnsembleDatastore(location)
ensemble = simulationEnsembleDatastore with properties: DataVariables: [4x1 string] IndependentVariables: [0x0 string] ConditionVariables: [0x0 string] SelectedVariables: [4x1 string] ReadSize: 1 NumMembers: 5 LastMemberRead: [0x0 string] Files: [5x1 string]
ensemble.DataVariables
ans = 4x1 string
"SimulationInput"
"SimulationMetadata"
"Tacho"
"Vibration"
ensemble.SelectedVariables
ans = 4x1 string
"SimulationInput"
"SimulationMetadata"
"Tacho"
"Vibration"
アンサンブル メンバーからのデータの読み取り
目的の解析を行うには、Vibration
データと、各メンバーがシミュレートされた状態を記述する Simulink.SimulationInput
オブジェクトのみが必要であると仮定します。ensemble.SelectedVariables
を設定して読み取る変数を指定します。すると read
コマンドは、ソフトウェアにより決定された最初のアンサンブル メンバーからこれらの変数を抽出します。
ensemble.SelectedVariables = ["Vibration";"SimulationInput"]; data1 = read(ensemble)
data1=1×2 table
Vibration SimulationInput
_________________ ______________________________
{589x1 timetable} {1x1 Simulink.SimulationInput}
data.Vibration
は、シミュレーション時間を格納する timetable
行 1 つと、それに対応する振動信号を含む cell 配列です。これで、このデータを必要に応じて処理することができます。たとえば、table から振動データを抽出してプロットします。
vibdata1 = data1.Vibration{1};
plot(vibdata1.Time,vibdata1.Data)
title('Vibration - First Ensemble Member')
アンサンブルの LastMemberRead
プロパティは、最後に読み取られたメンバーのファイル名を含んでいます。このアンサンブルに対し read
を次に呼び出すと、ソフトウェアはアンサンブルの次のメンバーに進みます (詳細については、状態監視と予知保全のためのデータ アンサンブルを参照)。選択した変数をアンサンブルの次のメンバーから読み取ります。
data2 = read(ensemble)
data2=1×2 table
Vibration SimulationInput
_________________ ______________________________
{603x1 timetable} {1x1 Simulink.SimulationInput}
data1
と data2
に異なるアンサンブル メンバーからのデータが含まれることを確認するため、変化するモデル パラメーター ToothFaultGain
の値を調べます。各アンサンブルで、この値は SimulationInput
変数の Variables
フィールドに格納されています。
SimInput1 = data1.SimulationInput{1}; SimInput1.Variables
ans = Variable with properties: Name: 'ToothFaultGain' Value: -2 Workspace: 'global-workspace' Context: '' Description: ""
SimInput2 = data2.SimulationInput{1}; SimInput2.Variables
ans = Variable with properties: Name: 'ToothFaultGain' Value: -1.5000 Workspace: 'global-workspace' Context: '' Description: ""
この結果から、data1
は ToothFaultGain
= –2 のアンサンブルから、data2
は ToothFaultGain
= –1.5 のアンサンブルからのものであることが確認されます。
アンサンブル メンバーへのデータの追加
各アンサンブル メンバー内の ToothFaultGain
値を、ギア故障の有無を示すバイナリ インジケーターに変換すると仮定します。さらに、システムの使用経験から、ギア歯故障のゲイン値の大きさが 0.1 より小さい場合は健全動作と見なすのに十分であることがわかっているとします。前節で読み取ったアンサンブル メンバーのゲイン値を、–0.1 < ゲイン < 0.1 の場合は 0 (故障なし)、そうでない場合は 1 (故障あり) のインジケーターに変換します。
sT = (abs(SimInput2.Variables.Value) < 0.1);
新しいギア歯故障のインジケーターを、対応するアンサンブル データに追加するには、まずアンサンブル内のデータ変数のリストを拡張します。
ensemble.DataVariables = [ensemble.DataVariables;"ToothFault"];
ensemble.DataVariables
ans = 5x1 string
"SimulationInput"
"SimulationMetadata"
"Tacho"
"Vibration"
"ToothFault"
その後、writeToLastMemberRead
を使用して、アンサンブルの最後に読み取られたメンバーに新しい変数の値を書き込みます。
writeToLastMemberRead(ensemble,'ToothFault',sT);
すべてのアンサンブル メンバーからのデータのバッチ処理
実際には、歯の故障インジケーターをアンサンブルのすべてのメンバーに追加することが望まれます。そのためには、アンサンブルを未読の状態にリセットして、次回の読み取りが最初のアンサンブル メンバーから開始されるようにします。その後、すべてのアンサンブル メンバーをループ処理して各メンバーの ToothFault
を計算し、これを追加します。
reset(ensemble); sT = false; while hasdata(ensemble) data = read(ensemble); SimInputVars = data.SimulationInput{1}.Variables; TFGain = SimInputVars.Value; sT = (abs(TFGain) < 0.1); writeToLastMemberRead(ensemble,'ToothFault',sT); end
最後に、新しい歯の故障インジケーターをアンサンブル内に状態変数として指定します。この指定を使用して、メンバー データが生成された状態を表す変数をアンサンブル データ内で追跡および参照することができます。
ensemble.ConditionVariables = "ToothFault";
ensemble.ConditionVariables
ans = "ToothFault"
これで、各アンサンブル メンバーには、元の未処理のデータと、データが収集された故障状態を示す追加の変数が含まれるようになります。実際には、故障の検出と診断に使用できる状態インジケーターの候補を特定するために、生の振動データから導出した他の値を計算して追加することもあります。simulationEnsembleDatastore
オブジェクトに格納されているデータを操作し解析するための他の方法を示す詳細な例は、Simulink を使用した故障データの生成を参照してください。
複数のメンバーを一度に読み取る
必要な処理を行ううえで効率的または有用な場合には、一度に複数のメンバーからデータを読み取るようにアンサンブルを構成することができます。これを行うには、ReadSize
プロパティを使用します。read
コマンドはこのプロパティを使用して、一度に読み取るアンサンブル メンバーの数を決定します。たとえば、一度に 2 つのメンバーを読み取るようにアンサンブルを構成します。
ensemble.ReadSize = 2;
また、ReadSize
の値を変更すると、アンサンブルは未読の状態にリセットされます。したがって、次回の読み取り操作は最初の 2 つのアンサンブル メンバーを読み取ります。read
は ReadSize
と等しい行数をもつ table を返します。
ensemble.SelectedVariables = ["Vibration";"ToothFault"]; data3 = read(ensemble)
data3=2×2 table
Vibration ToothFault
_________________ __________
{589x1 timetable} false
{603x1 timetable} false
アンサンブルの LastMemberRead
プロパティには、この操作で読み取られたすべてのアンサンブル メンバーのファイル名が含まれます。
ensemble.LastMemberRead
ans = 2x1 string
"/tmp/Bdoc24b_2679053_60527/tp195fa1d6/predmaint-ex54897023/Data/TransmissionCasingSimplified_log_1.mat"
"/tmp/Bdoc24b_2679053_60527/tp195fa1d6/predmaint-ex54897023/Data/TransmissionCasingSimplified_log_2.mat"
ReadSize
が 1 より大きいアンサンブル データストアにデータを追加する場合、読み取るときと同数のアンサンブル メンバーを書き込まなければなりません。したがって、たとえば ReadSize
が 2 の場合、writeToLastMemberRead
には 2 行の table を渡します。
参考
simulationEnsembleDatastore
| generateSimulationEnsemble
| read
| writeToLastMemberRead