Main Content

시스템을 다시 시작할 때 RUL 모델 상태를 보존하는 코드 생성하기

이 예제에서는 예측 알고리즘이 중지되었다가 다시 시작될 때 RUL 모델의 상태를 보존하는 잔여 수명(RUL) 예측 코드를 생성하는 방법을 보여줍니다. 이 예제는 잔여 수명 예측을 위한 코드 생성하기에 표시된 워크플로를 기반으로 합니다.

이 예제의 워크플로는 성능 저하 기반 RUL 모델인 linearDegradationModelexponentialDegradationModel에 유용합니다. 이러한 모델에 대해, 데이터가 수신됨에 따라 RUL 예측 업데이트하기에 설명된 대로 update 명령을 사용하여 시스템 작동 중에 들어오는 데이터로 RUL 모델을 업데이트할 수 있습니다. 배포된 예측 알고리즘으로 이러한 업데이트를 수행할 경우, 작업 중에 모델에 적용한 업데이트 내용이 시스템 종료 시 손실될 위험이 있습니다. 이 예제에서는 진입점 함수를 작성하여 런타임에 모델에 적용된 업데이트를 보존하는 방법을 보여줍니다. 이를 위해 readState 명령과 restoreState 명령을 진입점 함수에 통합합니다.

RUL 모델 피팅하기

RUL 예측을 위한 코드를 생성하기 전에 과거 데이터를 사용하여 RUL 모델을 피팅해야 합니다. 이 예제에서는 linTrainTables.mat의 데이터를 불러옵니다. 이 파일에는 시간 경과에 따라 측정된 상태 지표의 측정값이 "Time""Condition"이라는 열 레이블을 갖는 테이블 형태로 포함되어 있습니다. 이 데이터를 사용하여 선형 성능 저하 모델을 훈련시킵니다. (이 유형의 RUL 모델을 구성하고 훈련시키는 방법에 대한 자세한 내용은 linearDegradationModel 항목을 참조하십시오.)

load('linTrainTables.mat')

mdl = linearDegradationModel;
fit(mdl,linTrainTables,"Time","Condition")

코드 생성을 위한 모델 준비하기

잔여 수명 예측을 위한 코드 생성하기에 설명된 대로, 코드 생성을 위한 모델을 준비하기 위해 saveRULModelForCoder를 사용하여 RUL 모델을 MAT 파일에 데이터 구조체로 저장합니다. 나중에 진입점 함수에서 loadRULModelForCoder를 사용하여 linearDegradationModel 객체를 불러와 재구성합니다.

saveMATfilename = 'savedModel.mat';
saveRULModelForCoder(mdl,saveMATfilename);

선택적으로, 훈련 데이터 이후에 수집한 추가 데이터를 사용하여 모델 파라미터를 업데이트할 수 있습니다. 이 예제에서는 시간 값과 상태 지표 값으로 구성된, 121행을 갖는 테이블인 linTestData1을 불러옵니다. 이 테이블의 처음 두 요소를 사용하여 모델을 업데이트합니다.

load('linTestData.mat','linTestData1')
updateData = linTestData1(1:2,:);
update(mdl,updateData);

다음으로, readState를 사용하여 모델 상태를 읽어옵니다. 이 명령은 RUL 모델 객체를 입력 인수로서 진입점 함수에 전달할 수 있는 구조체로 변환합니다.

savedState = readState(mdl);

진입점 함수 정의하기

진입점 함수는 코드를 생성하려는 함수입니다. 이 예제에서는 아래에 표시된 것처럼 진입점 함수 degradationRULPreserveState.m을 만듭니다.

type degradationRULPreserveState.m
function [estRULOut,ciOut,newState] = degradationRULPreserveState(data,restoreStateFlag,savedState)
%#codegen

persistent mdl

% Load the model the first time function is called
if isempty(mdl)
   mdl = loadRULModelForCoder('savedModel');  
end

% Restore the saved model parameters if needed
if restoreStateFlag
   restoreState(mdl,savedState);
end

% Update model and prediction with new data
threshold = 60;
update(mdl,data);
[estRULOut,ciOut] = predictRUL(mdl,threshold);

% Read the updated model parameters 
newState = readState(mdl);

end

이 함수는 새 입력 데이터와 함께 호출될 때마다 update 명령을 사용하여 RUL 예측 모델을 업데이트합니다. mdlpersistent 변수로 선언하면 함수가 메모리에 남아 있는 동안 호출 간에 업데이트된 모델 파라미터가 보존됩니다. 이 함수는 업데이트된 모델 파라미터를 출력 인수 newState에 씁니다. 이 값을 진입점 함수 외부에 저장하여 메모리에서 이 함수가 지워져도 업데이트된 모델 상태가 보존되도록 합니다. 따라서 예를 들어 시스템 종료 후 예측 알고리즘을 다시 시작할 때, restoreStateFlagtrue로 설정하고 가장 최근에 저장된 상태 값을 savedState로 전달하여 시스템이 가장 최근에 업데이트된 모델 파라미터를 사용하여 예측을 재개하도록 보장할 수 있습니다.

코드 생성하기

코드를 생성하려면 진입점 함수에 필요한 각 입력 인수의 데이터형과 형식을 갖는 샘플 데이터를 제공해야 합니다. 이 예제에서는 linTestData1에 있는 그다음 행을 사용합니다. 또한, restoreStateFlag를 논리값 true로 설정합니다.

sampleData = linTestData1(3,:);
restoreStateFlag = true;

이제 다음 codegen (MATLAB Coder) 명령을 사용하여 코드를 생성할 수 있습니다. 변수 목록 {sampleData,restoreStateFlag,savedState}는 함수가 시간과 숫자형 값으로 구성된 테이블 행, 논리값 및 readState에서 반환되는 savedState 형식의 구조체를 인수로 받는다는 것을 codegen 명령에 알려줍니다.

codegen degradationRULPreserveState -args {sampleData,restoreStateFlag,savedState} -nargout 3
Code generation successful.

이 명령은 MATLAB® 내에서 호출할 수 있는 실행 파일인 MEX 파일을 생성합니다. 이 예제와 유사한 절차를 사용하여 codegen이 지원하는 다른 모든 대상에 대한 코드를 생성할 수 있습니다. 또는, 잔여 수명 예측을 위한 코드 생성하기에 나와 있는 것처럼 MATLAB Coder™ 앱을 사용할 수 있습니다.

생성된 코드 검증하기

생성된 코드를 검증하려면 MATLAB 명령 프롬프트에서 샘플 데이터에 대해 MATLAB 진입점 함수를 실행합니다. 그런 다음, 생성된 MEX 파일을 동일한 데이터에 대해 실행하고 결과가 같은지 확인합니다.

[estRUL,ci,newState] = degradationRULPreserveState(sampleData,restoreStateFlag,savedState);
[estRUL_mex,ci_mex,newState_mex] = degradationRULPreserveState_mex(sampleData,restoreStateFlag,savedState);

예를 들어, MATLAB 함수를 사용하여 얻은 추정된 RUL 값과 생성된 MEX 파일을 사용하여 얻은 추정된 RUL 값을 비교합니다.

estRUL,ci
estRUL = 113.8920
ci = 1×2

   83.0901  172.5393

estRUL_mex,ci_mex
estRUL_mex = 113.8920
ci_mex = 1×2

   83.0901  172.5393

이제 생성된 코드를 배포된 시스템의 일부로 사용하여 잔여 수명을 예측할 수 있습니다. 시스템을 다시 시작해야 할 때 사용할 newState의 값을 저장합니다. 이 예에서는 linTestData1에 있는 그다음 데이터 점을 가져와서 이를 사용해, MEX 파일에 대한 이전의 호출에서 생성된 모델 상태인 newState_mex부터 시작하여 예측을 업데이트합니다.

nextData = linTestData1(4,:);
[estRUL2_mex,ci2_mex,newState2_mex] = degradationRULPreserveState_mex(nextData,restoreStateFlag,newState_mex);

estRUL2_mex,ci2_mex
estRUL2_mex = 104.4336
ci2_mex = 1×2

   77.8216  154.1263

참고로, MATLAB 함수와 MEX 파일은 각각 자신의 영속 변수를 관리합니다. 따라서 이제 mdl의 MEX 파일 값에 nextData의 업데이트가 포함되며, mdl의 함수 값에는 이 업데이트가 포함되지 않습니다. 이러한 영속 변수의 값을 재설정하려면 이 함수와 MEX 파일을 메모리에서 명시적으로 지우십시오.

clear degradationRULPreserveState
clear degradationRULPreserveState_mex

참고 항목

| | | | | | | | | |

관련 항목