Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

시뮬레이션된 데이터 앙상블 생성 및 사용하기

이 예제에서는 결함 파라미터를 바꾸면서 기계의 Simulink® 모델을 시뮬레이션하여 예측 정비 알고리즘 설계를 위한 데이터 앙상블을 생성하는 방법을 보여줍니다. 그런 다음 시뮬레이션 앙상블 데이터저장소와 상호 작용하는 몇 가지 방법을 보여줍니다. 이 예제에서는 데이터저장소에서 MATLAB® 작업 공간으로 데이터를 읽어 들인 다음 데이터를 처리하여 도출된 변수를 계산하고 새로운 변수를 다시 데이터저장소에 쓰는 방법을 보여줍니다.

이 예제에서 사용하는 모델은 Simulink를 사용하여 결함 데이터 생성하기에서 설명한 기어박스 모델을 단순화한 것니다. Simulink 모델을 불러옵니다.

mdl = 'TransmissionCasingSimplified';
open_system(mdl)

이 예제에서는 하나의 결함 모드만 모델링합니다. 기어 톱니 결함은 Gear Tooth fault 서브시스템에서 외란으로 모델링됩니다. 외란의 크기는 모델 변수 ToothFaultGain에 의해 제어됩니다. 여기서 ToothFaultGain = 0은 기어 톱니 결함이 없는 상태(정상 작동)에 해당합니다.

시뮬레이션된 데이터의 앙상블 생성하기

결함 데이터의 시뮬레이션 앙상블 데이터저장소를 생성하려면 generateSimulationEnsemble을 사용하여 -2~0 사이의 ToothFaultGain 값에서 모델을 시뮬레이션하십시오. 이 함수는 사용자가 제공한 Simulink.SimulationInput 객체로 구성된 배열의 각 요소에 대해 한 번씩 모델을 시뮬레이션합니다. 각 시뮬레이션은 서로 다른 앙상블 멤버를 생성합니다. 이러한 배열을 만든 다음 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 와 같은 특정 신호 값을 기록하도록 이미 구성되어 있습니다(Save Signal Data Using Signal Logging (Simulink) 참조). generateSimulationEnsemble 함수는 다음과 같은 작업을 수행하도록 모델을 추가로 구성합니다.

  • 기록된 데이터를 사용자가 지정하는 폴더의 파일에 저장

  • 신호 기록에 timetable 형식 사용

  • 저장된 파일에 각 Simulink.SimulationInput 객체와 이에 대응하는 기록된 데이터를 함께 저장

생성된 데이터의 위치를 지정합니다. 이 예제에서는 현재 폴더 내의 Data 폴더에 데이터를 저장합니다. 모든 시뮬레이션이 오류 없이 완료되면 함수는 지표 출력값 statustrue를 반환합니다.

mkdir Data
location = fullfile(pwd,'Data');
[status,E] = generateSimulationEnsemble(simin,location);
[04-Dec-2023 12:50:04] Running simulations...
[04-Dec-2023 12:50:23] Completed 1 of 5 simulation runs
[04-Dec-2023 12:50:27] Completed 2 of 5 simulation runs
[04-Dec-2023 12:50:31] Completed 3 of 5 simulation runs
[04-Dec-2023 12:50:35] Completed 4 of 5 simulation runs
[04-Dec-2023 12:50:40] Completed 5 of 5 simulation runs
status
status = logical
   1

Data 폴더에서 파일 중 하나를 검토합니다. 각 파일은 다음 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 행을 포함하는 셀형 배열입니다. 이제 이 데이터를 필요에 맞게 처리할 수 있습니다. 예를 들어, 테이블에서 진동 데이터를 추출하여 플로팅합니다.

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 명령은 이 속성을 사용하여 한 번에 몇 개의 앙상블 멤버를 읽어야 할지 확인합니다. 예를 들어, 앙상블이 한 번에 두 개의 멤버를 읽도록 구성합니다.

ensemble.ReadSize = 2;

ReadSize의 값을 변경하면 앙상블이 읽지 않음 상태로 재설정됩니다. 따라서 다음번 읽기 작업은 처음 두 개의 앙상블 멤버를 읽습니다. readReadSize와 동일한 행 개수를 갖는 테이블을 반환합니다.

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/Bdoc23b_2463843_998802/tpba3a031d/predmaint-ex54897023/Data/TransmissionCasingSimplified_log_1.mat"
    "/tmp/Bdoc23b_2463843_998802/tpba3a031d/predmaint-ex54897023/Data/TransmissionCasingSimplified_log_2.mat"

ReadSize > 1인 앙상블 데이터저장소에 데이터를 추가할 때는 읽어 들인 앙상블 멤버의 개수와 동일한 개수만큼을 써야 합니다. 따라서 예를 들어 ReadSize = 2이면 writeToLastMemberRead에 2개 행을 가진 테이블을 제공해야 합니다.

참고 항목

| | |

관련 항목