MATLAB 은 1 년에 두 번 업데이트를 진행하고 이에 따라 a, b 버전을 release 합니다.

 

2016 년에는 2016a, 2016b 버전이 나왔죠.

 

2012a 버전부터 Simulink 모델 파일의 확장자가 MDL 에서 SLX 형태로 변경 됐습니다.

 

최신 버전에서는 하위 호환을 위해 MDL, SLX 를 둘 다 지원하고 있습니다.

 

그냥 MDL 파일을 그대로 사용해도 되지만 기왕이면 최신 버전으로 사용하기 위해 저는 과거에 만들었던 MDL 파일을 SLX 로 변환해서 사용하고 있습니다.

 

단순히 MDL 확장자를 SLX 로 변경하는건 탐색기를 통해서도 가능 하겠지만 이렇게 변환한 경우에는 해당 모델 파일이 정상적으로 동작하지 않습니다. 단순히 확장자만 바뀐게 아니기 때문이죠.

 

MDL 파일을 SLX 로 변경 할 때는 Simulink 에서 모델을 연 다음에 다른 이름으로 저장하기에서 확장자를 바꿔 줘도 되지만

 

다음과 같이 스크립트를 작성해서 변환하는게 훨씬 더 효율적입니다.

 

아래 스크립트는 현재 폴더내의 MDL 파일을 모두 SLX 파일로 변경하는 코드 입니다.

 

mdlFiles = dir('*.mdl');

 

for n=1:length(mdlFiles)

    modelName = strrep(mdlFiles(n).name, '.mdl', '')

    newName = strrep(mdlFiles(n).name, '.mdl', '.slx')

      

    load_system(modelName)

    save_system(modelName, newName)    

    close_system(modelName)

end

 

위 코드를 조금만 바꾸면 SLX 파일을 MDL 로 바꾸는 것도 그리 어렵지 않게 하실 수 있을 겁니다.


Simulink 는 많은 경우 MATLAB script 를 사용하여 자동화를 할 수가 있습니다. 


당연히 MATLAB 코딩을 잘해야 Simulink를 자유자재로 다룰 수 있을 겁니다.


물론 그냥 노가다로 Simulink를 구현 할 수도 있지만 이렇게 하면 무수한 클릭질에 Simulink 설계가 정말 싫어 질 겁니다.


암튼 오늘은 Simulink 블록의 존재 유무를 MATLAB Command Window 에서 확인 하는 방법에 대해 소개 하려 합니다. 


Simulink 블록의 존재 유무를 확인하기 위해서는  getSimulinkBlockHandle() 함수를 사용하면 됩니다.


함수의 이름을 보면 알겠지만 Simulink 블록의 handle 을 구하는 함수 입니다.


getSimulinkBlockHandle() 함수에 대한 메뉴얼은 아래 주소에서 확인 할 수 있고~ 


https://kr.mathworks.com/help/simulink/slref/getsimulinkblockhandle.html


getSimulinkBlockHandle()을 사용하는 경우 블록이 존재하면 블록의 handle 을 return 하고, 존재하지 않으면 -1 을 return 합니다. 


따라서 아래와 같이 사용 할 수 있을 겁니다.


if (getSimulinkBlockHandle('modelname/sysname') == -1)

 % block does not exist

else

 % block exists

end


블록의 path 를 확인하는 방법은 블록을 클릭하고 MATLAB command window 에 gcb 라고 타이핑 하면 됩니다. 


아래와 같은 모델(NewModel.slx)에서 Scope 를 선택한 후에 MATLAB command window 에 gcb 라고 타이핑 하면~ 다음과 같이 path 가 나옵니다.

NewModel/Scope 

위 path 에 대해 getSimulinkBlockHandle() 함수를 사용해 보면~ 아래와 같이 handle 값이 나오는 것을 확인 할 수 있습니다.

>> getSimulinkBlockHandle('NewModel/Scope')

ans =

   1.6290e+03

  

그럼 위 모델에 없는 블록 이름을 하나 테스트 해 보죠~ 아래 결과를 보면 위 설명대로 -1 이 나오는 것을 확인 할 수 있습니다.

>> getSimulinkBlockHandle('NewModel/Scope 1')

ans =

    -1



+ Recent posts