이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
시뮬레이션된 데이터 앙상블 생성 및 사용하기
이 예제에서는 결함 파라미터를 바꾸면서 기계의 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
폴더에 데이터를 저장합니다. 모든 시뮬레이션이 오류 없이 완료되면 함수는 지표 출력값 status
에 true
를 반환합니다.
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')
앙상블의 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
명령은 이 속성을 사용하여 한 번에 몇 개의 앙상블 멤버를 읽어야 할지 확인합니다. 예를 들어, 앙상블이 한 번에 두 개의 멤버를 읽도록 구성합니다.
ensemble.ReadSize = 2;
ReadSize
의 값을 변경하면 앙상블이 읽지 않음 상태로 재설정됩니다. 따라서 다음번 읽기 작업은 처음 두 개의 앙상블 멤버를 읽습니다. read
는 ReadSize
와 동일한 행 개수를 갖는 테이블을 반환합니다.
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개 행을 가진 테이블을 제공해야 합니다.
참고 항목
simulationEnsembleDatastore
| generateSimulationEnsemble
| read
| writeToLastMemberRead