Main Content

シミュレーション データ アンサンブルの生成と使用

この例では、故障パラメーターを変化させながら機械の 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

この例では、モデルが VibrationTacho の特定の信号値をログに記録するよう既に構成されています (信号ログを使用した信号データの保存 (Simulink)を参照)。関数 generateSimulationEnsemble は、モデルをさらに次のように構成します。

  • ログ データを指定のフォルダー内のファイルに保存する

  • 信号のログに timetable 形式を使用する

  • Simulink.SimulationInput オブジェクトを対応するログ データとともに保存ファイル内に格納する

生成されるデータの場所を指定します。この例では、現在のフォルダー内の Data というフォルダーにデータを保存します。シミュレーションがすべてエラーなしで完了した場合、関数はインジケーター出力 statustrue を返します。

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')

Figure contains an axes object. The axes object with title Vibration - First Ensemble Member contains an object of type line.

アンサンブルの LastMemberRead プロパティは、最後に読み取られたメンバーのファイル名を含んでいます。このアンサンブルに対し read を次に呼び出すと、ソフトウェアはアンサンブルの次のメンバーに進みます (詳細については、状態監視と予知保全のためのデータ アンサンブルを参照)。選択した変数をアンサンブルの次のメンバーから読み取ります。

data2 = read(ensemble)
data2=1×2 table
        Vibration               SimulationInput        
    _________________    ______________________________

    {603x1 timetable}    {1x1 Simulink.SimulationInput}

data1data2 に異なるアンサンブル メンバーからのデータが含まれることを確認するため、変化するモデル パラメーター 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: ""

この結果から、data1ToothFaultGain = –2 のアンサンブルから、data2ToothFaultGain = –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 つのアンサンブル メンバーを読み取ります。readReadSize と等しい行数をもつ 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 を渡します。

参考

| | |

関連するトピック