Simulink 를 사용하면서 shift register 가 필요한 경우가 종종 있는데 개인적으로는 unit delay 를 사용하여 shift register 를 구성하곤 합니다. 그런데 shift register 의 사이즈가 얼마 안된다면 그냥 노가다로도 만들수 있지만 그 사이즈가 커 진다면 이렇게 일일이 만들어서 사용하는것이 힘들더군요. 그래서 오늘은 unit delay 를 사용한 shift register 를 자동으로 만들어주는 스크립트를 소개하려 합니다.


shiftRegisterGeneration 함수를 만들었고 코드는 아래와 같습니다.



아래 명령어는 shiftRegisterGeneration 함수를 사용하여 15 사이즈의 shift register 를 만드는 명령어 입니다. MATLAB Command Window 에서 아래 명령을 실행하면

shiftRegisterGeneration(15)

아래와 같이 ShiftRegister15 라는 이름의 subsystem 이 만들어 지고~

해당 subsystem 을 들어가 보면 아래와 같이 unit delay 로 구성된 shift register 가 만들어 집니다.



MATLAB 은 일종의 소프트웨어 플랫폼이라고 볼 수가 있어서 매트랩 툴박스들은 MATLAB 위에서만 실행됩니다. 따라서 시뮬링크를 사용한다라고 해도 매트랩을 잘 다루어야 시뮬링크를 조금 더 효율적으로 사용할 수 있습니다.

요즘 저는 많은 차량용 로직들을 Simulink Stateflow 로 설계하고 Embedded Coder 를 사용하여 C 코드를 생성해서 개발 보드에 탑재하는 업무를 하고 있습니다. Simulink 를 사용하기 위해서는 샘플레이트를 비롯하여 다양한 configuration 을 하게 되고~ Embedded Coder 를 사용할 때 역시도 마찬가지로 설정 할 것들이 많이 있습니다.

이런 설정들은 그때그때 달라지기도 하지만 사용하는 MCU 가 동일하다면 그리 크게 달라지지는 않습니다. 따라서 한번만 설정하고 해당 설정을 저장해 놓고 사용하는 것이 효율적일 것입니다.

오늘은 MATLAB 스크립트를 사용하여 Simulink configuration 을 하는 방법을 소개하려 합니다. Simulink configuration은 Simulink 모델창에서 Simulation -> Model Configuration Parameters 를 선택하거나 Ctrl + E 를 누르면 실행 됩니다.

그 중에서 아래와 같이 All Parameters 탭에서 메뉴들을 검색 할 수 있는데~ 아래 그림과 같이 해당 메뉴에 대한 Command-Line Name 을 확인 할 수 있습니다. Simulink configuration 내용을 스크립트로 자동화 하고 싶은 경우에 Command-Line Name을 사용하면 됩니다.

Simulink 모델의 기본적인 설정값들은 아래 주소의 메뉴얼을 확인해 보시기 바랍니다.

https://kr.mathworks.com/help/simulink/slref/model-parameters.html

Embedded Coder 를 사용하여 코드 생성을 하기 위해서는 Simulink Solver 셋팅을 Fixed-step discrete (no continuous states) 로 설정하게 되는데~

해당 설정을 하기 위해서는 아래와 같이 명령어를 써주면 됩니다.

set_param(gcs, 'Solver', 'FixedStepDiscrete')

Code Generation 시 Embedded Coder 를 사용하기 위해서는 System target file 설정을 ert.tlc 로 하게 되는데~

이러한 과정을 MATLAB code 로 어떻게 설정하는지를 확인하기 위해서는 아래와 같이

“All Parameters” 에서 “target file” 등으로 검색을 해서 “Command-Line Name” 을 알아 낸 후에 설정해 주면 됩니다.

예로 든 Embedded Coder 를 사용하기 위한 설정은 아래와 같습니다.

set_param(gcs, 'SystemTargetFile', 'ert.tlc')

해당 MATLAB 명령어 설정을 해 본 후에 Simulink configuration 창을 확인 해보면 해당 설정들이 바뀐 것을 확인 할 수 있습니다.



요즘 자동차 분야에서 제어기를 설계할때 MATLAB 의 Simulink 제품을 많이들 사용합니다. 제어기 사양서는 state machine 으로 구성되기 때문에 주로 Stateflow 를 사용하여 설계되고 Embedded Coder 등을 사용하면 시뮬레이션 후에 코드 생성까지 되기 때문에 기존에 시뮬레이션 후 C 코드를 다시 작성하고 하는 번거로움을 줄일 수 있습니다.

저도 회사에서 과제를 하면서 MATLAB 으로 알고리즘 시뮬레이션을 하고 Embedded Coder 를 사용하여 C 코드를 생성해서 사용한 경험이 있고~ 나름 신뢰할만한 코드가 나와서 편리하다는 생각을 많이 합니다.

그래서 일단 오늘은 Simulink 를 시작하는 방법에 대해 소개하려 합니다.

1. Simulink 실행

Simulink 를 사용하기 위해서는 당연히 MATLAB 과 Simulink가 설치되어 있어야 겠고 MATLAB 명령창에서 simulink 라고 명령하면 Simulink Start Page 가 나오게 됩니다. MATLAB 은 대소문자를 구별하므로 소문자로 명령어를 입력하시기 바랍니다. 물론 요즘은 툴이 좋아져서 정정 제안도 해주기 때문에 실수를 해도 별 문제가 없습니다.

위 소개처럼 명령어를 사용하는 방법 말고도 UI 를 클릭해서 실행하는 방법이 있는데 아래 그림과 같이 Simulink 버튼을 클릭해 주면 마찮가지로 Simulink Start Page 가 나오게 됩니다.

2. 어떤 어플을 설계 하느냐에 따라 다양한 방식으로 새 프로젝트를 시작할 수 있는데 저는 그냥 예전 스타일로 보통 Blank Model 로 시작하는 편입니다.

이렇게 Blank Model 을 만들었으면 이제 Simulink Library Browser 를 열어서 각 구성 요소들을 가져다 사용하면 됩니다. Simulink Library Browser 를 열기 위해서는 아래 그림과 같이 View -> Library Browser 를 클릭하거나 Ctrl+Shift+L 단축키를 눌러주거나 또는 MATLAB 명령창에 slLibraryBrowser 라는 명령어를 타이핑 해도 됩니다.

3. Simulink Library Browser 에서 사용하고자 하는 Block 들을 찾아서 배치해야 되는데~ 목록을 하나 하나 클릭하면서 어떤 Block 이 있는지를 확인하고 배치 할 수도 있고 블록의 대략적인 이름을 아는 경우에는 아래와 같이 검색을 통해 블록을 선택할 수도 있습니다.

위와 같이 Simulink Library Browser 에서 검색을 통해 모델을 일일이 찾아서 Drag & Drop 해서 붙이는 경우 노력이 많이 들기 때문에 Simulink 모델링에 익숙하신 분들은~

아래와 같이 model 창에서 블록을 놓고 싶은 위치를 클릭한 후에 블록명을 타이핑 하면 해당 이름의 블록 목록이 나오고

클릭하면 바로 모델창에 해당 블록이 입력 됩니다.

지금까지 수동으로 Simulink 시작하는 방법에 대해 소개를 했는데 ~ MATLAB 제품들은 굉장히 많은 부분들을 자동화 할 수 있는 방법들을 제공해 줍니다. 아래 포스팅에서 소개한 바와 같이 MATLAB 코드를 사용하여 Simulink 모델링을 자동화 할 수 있습니다.

http://iamaman.tistory.com/1482

Simulink 를 조금더 편리하게 사용하기 위해서는 이러한 자동화 방법에 대해 공부를 해 보시는 것도 좋을 것 같네요.



많은 공학도 분들이 MATLAB 의 사용법에 대해서 공부하실 거라고 생각합니다. MATLAB 은 아시는 바와 같이 매우 비싼 툴이고 업데이트를 위한 라이센스 유지비용 역시도 1년에 20~30 % 정도를 내는 걸로 알고 있습니다. 저는 학교에서 MATLAB 수업 과목의 조교를 했었고~ 이런 경험을 바탕으로 MATLAB 사용 방법을 소개하기 위해서 본 블로그를 만들었습니다. 개인적으로도 회사에서 MATLAB 을 사용한 업무를 하지만, 일반적으로 학생들이 학교에서 배우는 MATLAB 을 사용한 알고리즘 개발까지는 사실 MATLAB을 사용할 필요가 없다고 생각합니다.

제 블로그에서 소개했었던 Python, Scilab, Octave 를 비롯해서 매틀랩을 대신하여 알고리즘을 개발해 볼 수 있는 오픈소스 또는 프리웨어 소프트웨어들은 정말 많이 있습니다. 그렇다면 매틀랩을 쓸 수 밖에 없는 경우는 무엇이냐라고 한다면 제가 경험한 바로는 C, RTL 등의 코드 생성 분야와 Simulink 나 Stateflow 를 사용한 MBD(Model Based Design) 분야라고 볼 수 있을 것 같습니다. 학교에서는 Python, Octave 를 비롯한 오픈소스 소프트웨어들을 주로 사용하다가 회사에 와서 MATLAB 을 사용해도 늦지 않다고 생각합니다. 또한 MATLAB 만 잘하는 것 보다는 Python 과 같은 언어를 먼저 잘하는게 범용성과 실용주의적인 관점에서 더 낫다고도 생각합니다.

저는 요즘 아래 주소의 인프런(inflearn) 이라는 사이트에서 딥러닝 관련된 강좌를 보고 있는데 최근에 들어가보니 MATLAB 강좌도 있더군요.

https://www.inflearn.com

‘MATLAB으로 시작하는 프로그래밍’ 이라는 강좌이고 MATLAB 을 처음 접하시는 분들에게 유용할 강좌인것 같습니다. 비용도 무료이므로 부담없이 수강하실 수 있을 것 같습니다.

https://www.inflearn.com/course/matlab-%EC%8B%9C%EC%9E%91-programming/

다음으로 아래 주소의 tutorialspoint 사이트에서도 MATLAB 관련 Tutorial 들이 있더군요.

https://www.tutorialspoint.com/matlab/index.htm

영어 자료이긴 하지만 예제들도 굉장히 잘 정리가 되어 있어서 MATLAB 공부하는데 굉장히 좋은 자료로 보입니다. 공부하시는데 참조하시기 바랍니다.



20대 후반에 ‘남성의 MATLAB LOG’ 블로그를 만들었습니까~ 벌써 제 블로그도 8년 이상이 되었습니다.  뭐 특별한 목적이 있었다기보다는 그 당시에 제가 매우 좋아했던 MATLAB 이라는 프로그램의 사용 방법에 대해서  기록하기 위한 용도로 만들었습니다. 그래서 그런지 저는 회사에서도 MATLAB 을 사용한 개발을 많이 해 왔던 것 같습니다.   가장 최근에 다녔던 회사는 자동차 부품 개발 관련 회사 였고 MBD(Model Based Design) 일을 했었습니다. Simulink Stateflow 제품을 많이 사용하였었고  타겟 보드에 올리기 위해서 Embedded Coder 를 사용하여 C 코드 생성을 했었습니다.


언제인지 잘은 모르겠지만 블로그를 운영하면서  수익을 낼 수 있다라는 것을 알게 되었습니다. 좋아하는 것도 기록하고  수익도 낼 수 있으면 좋으니까 저도 애드센스 광고를 달게 되었습니다.


수익을 목적으로 블로그를 운영하는 경우도 많이 있는 것 같은데~ 예전에 제 블로그에도 어떤 분이 블로그를 사겠다고  댓글을 달았던 적이 있습니다. 다른 사람들에게는 어떻게 보일지 모르겠지만 저에게는 무척이나 애착이 가는 블로그라서  당연히 팔지 않았습니다. 블로그가 수익과 연관이 되다 보니 블로그 분석하는 사이트들이 많이 생겨나고 있는 것 같습니다.


오늘 하고 싶은 얘기는 제가 뭐를 하는 사람이냐에 대한 얘기가 아니라 제가 들어가 봤던 블로그 관련사이트들에 대해서  소개하려합니다.


아래 사이트에서는 블로그 운영과 관련하여 많은 고수들의 이야기들을 볼 수가 있습니다. 운영 방법에 대해서 유료 강의도 하는 것 같더군요.

http://www.blogermoney.com/


정말  고수이신분들은 수익 공개도 하시는데 정말 후덜덜한 수익을 내는 분들이  많이 계시더군요. 아래 주소에서 수익공개 하시는 분들을 보면 50대 이상의 어르신분들도 계신 것 같더군요. 블로그 운영 열심히 해봐야 되겠다는 자극이 되는 것 같습니다.


http://www.blogermoney.com/community/community_list.asp?code=BD10

어쨌든 블로거머니에서는 블로그와 관련된 질문도  할 수 있고 자신의 블로그를 소개 할 수도 있고  수익 인증도 할 수 있습니다.


다음으로  아래의 블로그차트라는 홈페이지에서는  블로그 지수를 확인할 수가 있습니다. 어떤 기준으로 블로그 지수가 매겨지는지는 모르겠지만 방문자가 많은 블로거들은 어떻게 생겼는지 확인을 해 볼 수가 있습니다.  고수의 블로그들을 들어가면서 해당 블로그를 벤치마킹 해 보는 것도 블로그 운영하는데 도움이 될 거라고 생각됩니다.


http://www.blogchart.co.kr

블로그차트 홈페이지에 가입을 하고 블로그 인증을 한 후에, ‘내블로그 분석’  탭에 들어가 보면 자신의 블로그 순위를 확인할 수 있습니다. 제 블로그는 97548 위 네요. ㅋㅋㅋㅋㅋ 그냥 까마득하네요.


역시나 개발 관련된 글들을 주로 쓰다 보니 유효키워드가 거의 없네요. 유효 키워드가 뭔지는 정확하게 모르겠지만 그냥 돈이 되는 키워드가 아닐까요?


아무튼 블로그를 운영하면서  위와 같은 사이트에서 다른 사람들은 어떻게 블로그 운영을 하는지 구경하는 것도 재미있는 거 같습니다.



요즘은 굉장히 다양한 오픈소스 프로그램들이 있습니다. 


수치 분석에 주로 MATLAB 을 사용하곤 했지만 요즘은 MATLAB 을 꼭 써야 하는 것들이 아니라면 Python 을 주로 사용하고 있습니다.


회사에서는 차량용 MBD(Model Based Development) 개발을 위해 Simulink 환경에서 Stateflow 툴박스를 주로 활용하는데


모델링의 일부는 Stateflow API 를 사용하여 MATLAB 스크립트를 통해 자동으로 모델을 구성하는 작업을 하곤 합니다.


모델링 구성후에는 당연히 simulation 을 수행하고 simulation 을 마치면 Embedded Coder 를 사용하여 MATLAB 알고리즘/Simulink 모델에 대해 C 코드 생성후 타겟 보드에서 테스트를 진행 합니다.


위와 같은 작업들은 MATLAB/simulink 를 꼭 써야 하는 작업이므로 사용을 하지만, 제어기 로직 설계 하는 것 이외의 다른 분야들에서는 주로 Python 을 사용하고 있습니다.


Python과 같은 프로그램들은 오픈소스 프로그램이라 누구나 사용할 수 있으니 협업시에도 편한것 같네요.


Python 에서도 MATLAB 과 같이 예쁜 그래프들을 표현 할 수 있는데 matplotlib 모듈을 사용하시면 됩니다.


matplotlib 모듈의 홈페이지는 아래와 같습니다. 


https://matplotlib.org/gallery/index.html


위 주소에 들어가 보시면 다양한 그래프 예제들이 있습니다.


하니씩 실행해 보시는것도 재미 있을 겁니다. MATLAB 에 익숙하신 분들은 코드를 이해하는것도 조금더 편할 것 같네요.


matplotlib 는 Anaconda 를 설치하면 기본적으로 설치가 됩니다. 예전에 아래 포스팅에서는 각 모듈들을 하나하나 찾아가며 설치 했었는데


http://iamaman.tistory.com/377


그냥 간편하게 Anaconda 를 설치해서 사용하시는게 정신건강에 이롭더군요.


저도 그래프 하나 그려 봤는데~~ 다음과 같이 코딩을 하면 그래프를 쉽게 그릴수 있습니다.


MATLAB 에서 그래프 그리는것과 유사하죠~ savefig() 함수를 사용하면 아래와 같이 그림으로 저장도 할 수 있습니다. 

matplotlib 의 메뉴얼은 아래 주소에서 확인 할 수 있습니다. 


https://matplotlib.org/tutorials/index.html


Simulink 에서 테스트 진행시 Signal Builder 를 사용하여 test case 를 만들곤 하는데

signal builder 의 출력은 double 값으로 나오기 때문에 해당 출력을 입력으로 사용하는 블록과 데이터 타입을 맞춰주는 과정이 필요 합니다. 

이렇게 데이터 타입을 맞춰주기 위해 Simulink 에서는 Data Type Conversion 블록을 사용하는데 

Signal 이 여러 개가 되는 경우 일일이  Data Type Conversion 블록을 붙여주는 것도 고된 잡업이더군요. 

그래서 여러개의 Data Type Conversion 블록을 자동으로 생성하도록 하는 MATLAB 코드를 만들어 봤습니다.

코드는 다음과 같습니다. 

dataTypeConversionMake  함수를 사용하기 위해 입력 argument 로 signal 의 갯수를 넣어 줍니다.

아래 코드는 8 개의 signal 에 대한 Data Type Conversion  블록을 만드는 명령 입니다. 

 dataTypeConversionMake(8)

위 명령어를 실행하면 다음과 같이 Simulink 모델이 만들어 집니다. 


해당 모델을 열어 보면 8 개의  Data Type Conversion 블록 연결이 있는 걸 볼 수가 있습니다.


아래 포스팅에서도 소개한적이 있지만 요즘 Simulink 에서는 MDL 확장자 대신에 SLX 를 주로 사용합니다. 


MDL 파일의 경우 에디터에서 열어서 확인 해 볼 수가 있었는데 SLX 파일의 경우 에디터에서 열어 볼 수가 없더군요. 

그래서 오늘은 SLX 파일을 텍스트 에디터에서 확인 하는 방법에 대해 소개해 보려 합니다.

SLX 파일은 JAR 와 같이 아카이브 파일 형태라고 합니다.

test.slx 파일이 잇다면 파일의 확장자를 test.zip 으로 변경합니다.

다음과 같은 메시지가 나오는데 예를 클릭합니다.


test.zip 파일을 압축 프로그램을 사용하여 압축 해제 합니다. 저는 반디집을 사용했습니다.

압축을 해제 하고 폴더에 들어가 보면 아래 그림과 같이 xml 파일이 나타납니다.


Simulink 폴더에 들어가면 아래 그림과 같은 파일들이 나타나고


blockdiagram.xml 파일에는 Simulink블록도 정보가 나타나고

stateflow.xml 에는 stateflow 의 정보가 포함되어 있습니다.

에디터에서 Simulink정보를 수정한 경우에는 폴더를 압축한후 파일명을 slx 로 만들어 준 후에 Simulink에서 열면 될 것입니다.

막상 파일을 텍스트 에디터에서 열었더니 XML 의 각 태그의 의미가 어떻게 되는건지 정확히 모르겠네요.

텍스트 에디터를 통해 SLX 파일을 수정 할 때는 XML 파일의 구조를 완벽히 파악 한 후에 작업해야 할 것으로 생각되네요.



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



Simulink 를 사용하다 보면 여러 Scope 를 여는 경우가 종 종 있습니다.

 

이러한 경우 한번에 Scope 를 다 닫는 명령어가 있나 해서 찾아보니 아래 주소에 그 방법이 나와 있더군요.

 

https://kr.mathworks.com/matlabcentral/answers/94334-how-can-i-programmatically-close-simulink-scope-windows-in-simulink-7-1-r2008a

 

위 주소의 코드를 활용하여 아래와 같이 Simulink Scope 를 다 닫는 함수를 만들어서 사용한다면 편리 할 것 같네요.

 

function scopeCloseAll

shh = get(0,'ShowHiddenHandles');

set(0,'ShowHiddenHandles','On');

hscope = findobj(0,'Type','Figure','Tag','SIMULINK_SIMSCOPE_FIGURE');

close(hscope);

set(0,'ShowHiddenHandles',shh);

end


오늘은 좀 독특한 언어에 대해 소개해 드리려 합니다.

 

해당 언어의 이름은 DRAKON editor 라고 하고 홈페이지는 아래 주소와 같습니다.

 

http://drakon-editor.sourceforge.net/

 

DRAKON editor는 아래 그림과 같이 그래프를 사용해서 코딩을 하는 툴이라 할 수 있습니다.

 

홈페이지에서도 visual language 라고 되어 있네요. 홈페이지에는 러시아 우주 프로그램에 사용되었다고 하는데~ 요즘 자동차 쪽에서 이슈인 MBD(Model Based Design)와 비슷한 컨셉으로 보였습니다.

 

그런데 약간 사용을 해보니 완전 그렇지는 않은 게 MBD의 경우 MATLAB Simulink 등을 통해 그래프를 그리면 코드가 나오는 형태임에 반해 DRAKON editor 는 그래프를 그리고 해당 부분에 코드를 넣어줘야 하는 형태였습니다.

 

그래도 그래프를 통해 코드를 작성하니 코드의 흐름이 굉장히 명확해 져서 좋은 것 같다고 생각했습니다. DRAKON editor 에서는 C/C++, C#, Java, Erlang, Python, Tcl, Lua 에 대한 코드 생성이 가능했습니다.

 

아래 주소를 통해 다운로드 후에 설치 가능합니다.

 

http://drakon-editor.sourceforge.net/editor.html#downloads

 

DRAKON editor는 Tcl 로 만들어 졌고 Windows, Mac, Linux 에서 동작하는 Cross Platform 툴 입니다.

 

저는 현재 Windows 64비트를 사용하고 있는데 아래 그림에서와 같이 Active Tcl 을 다운로드 받아서 설치를 하고 drakon_editor1.26.zip 를 다운로드 받아서 압축을 푼 후에 drakon_editor.tcl 파일을 실행했습니다.

 

압축을 풀면 examples 폴더에 다양한 언어에 대한 예가 나와 있습니다.

 

DRAKON editor 를 실행해보면 다음과 같은 창이 나타납니다.

 

위 그림에 나와 있는 바와 같이 DRAKON editor 는 Save 버튼이 없습니다. 그래서 무조건 파일부터 만들고 실행을 해야 합니다. 파일에 수정 되는 부분들은 자동으로 저장이 됩니다.

 

저는 업무상 C 로직을 주로 구성하므로 아래 페이지의 tutorial 을 봤습니다.


http://drakon-editor.sourceforge.net/cpp/c.html

 

C 언어에서 흔히 사용하는 if, switch, 반복 문 등에 대해 구성이 가능 하고~

 

CTRL + B 를 누르거나 Generate Code 을 눌러서 코드를 생성 할 수 있습니다.

 

위 루프 문에 대해 PrintStringsFrom.c, PrintStringsFrom.h 파일이 생성됩니다. 생성된 파일을 열어 보면~~

 

for 문으로 구성 될 거라 생각했었는데~ 다음과 같이 goto 문으로 반복문이 구성되더군요.

 

지금까지 C 코딩을 하면서 이런 식으로 루프를 구성해 본적은 없었던 터라 첨에는 이게 뭔가 했었는데

 

이렇게도 할 수 있구나 생각하니 재미 있더군요. 글쎄…… For 로 구성하는 것과 goto 로 구성하는 것 중 어떤게 더 좋은 코딩 방식인지는 잘 모르겠네요.

 

아래 포스팅에서 간단하게 LMS 알고리즘에 대해 소개한 적이 있습니다.

 

http://iamaman.tistory.com/221


오늘은 하드를 뒤지다 보니 예전에 한 LMS 테스트 자료가 있어서 공개하려 합니다.

 

이번에는 Simulink 를 사용한 자료이며

 

보시면 아시겠지만 역시 LMS 는 참 간단하면서도 효율적인 알고리즘이라는 생각이 드네요.



 

FIR 필터 identification 을 수행했으며 필터 탭은 [0.5 2 1 0.3 0.1 0.05 0 0 0 ] 로 설정했습니다.

 

위 필터를 identification 하기 위해 LMS 필터 탭은 13 탭을 사용했고 Gain은 보시다시피 0.04 로 줬습니다.

 

잡음이 안 들어갔으니 뭐…. 잘 될 수 밖에 없죠~

 

수식이나 코드로 보는 것 보다는 훨씬 쉽게 이해 하실 수 있을 거라는 생각이 드네요.

 

Vector Scope 를 통해 그래프를 확인 할 수 있고 값은 display 블록을 통해 확인 할 수 있습니다.

 

파일 올리니 궁금하신 분들은 돌려 보시죠. 2010 년 정도에 만든 자료이니 2010 버전 이상에서는 정상적으로 동작 할 겁니다.

LMS_model.mdl

 


요즘 MATLAB 많이들 사용하시나요?

 

산업계뿐만 아니라 학교에서도 이 비싼 MATLAB 을 가르치니 학생들도 MATLAB 을 많이들 사용하는 것 같네요.

 

아래 tiobe 사이트에서도 비싼 툴임에도 불구하고 MATLAB 이 14위에 랭크 되어 있는 걸 보면 MATLAB 이 요즘 잘 나가고 있다는 건 확실 한 듯 하네요.

 

 

그래서 일까~ 아래 포스팅에도 소개 했지만 MATLAB 과 유사한 오픈 소스 프로그램들도 굉장히 많이 있습니다. 사실 스크립트만 활용한다면 MATLAB 을 굳이 살 필요는 없다는 생각이 드네요.

 

http://iamaman.tistory.com/639

http://iamaman.tistory.com/1427

 

그런데 요즘은 MBD(Model Based Design) 과 같은 이슈들로 Simulink 를 많이 활용하면서 다시 인기가 높아지는 게 아닐까요?

 

MATLAB 을 대체 할만한 툴은 많은 것 같은데 Simulink 를 대체할 만한 좋은 툴은 아직 보이지 않는 것 같네요. Scilab 에 Scicos 가 있긴 한데 아직은 우리나라에서 그리 많이 활용되고 있진 않은 것 같습니다.

 

아무튼 오늘은 또 다른 MATLAB 프로그램을 소개하려 하는데요. 이건 설치 프로그램이 아니라 cloud 프로그램 입니다. Freematlab 이라 해야 할지 mathclouds 라고 해야 할지 잘 모르겠네요.

 

홈페이지는 아래와 같고 두 사이트가 동일한 사이트 입니다.

 

http://www.freematlab.com

http://www.mathclouds.org

 

홈페이지는 아래와 같이 생겼는데~

 

Getting Started 페이지에 들어가면 Example 들도 잘 되어 있고 기존 MATLAB 사용자들은 바로 사용 가능 할 것 같습니다.

Help 페이지를 확인하니 대부분의 함수들이 MATLAB 과 동일 하네요.

 

또 하나의 좋은 툴을 알게 돼서 기분이 좋네요.


  1. jaegimania 2018.01.17 17:19

    기계관련 엔지니어 업무를 하고 있는 1人입니다.
    우연찮게 홈페이지 글 잘 읽었습니다. 감사합니다.
    Test 수치를 도식화 할 필요가 있어 깔끔한 프로그램을 찾던중 여기까지 오게됬는데요
    위 본문에서 말씀하신 freematlab의 경우 회사에서 사용시 무료가 아니네요...

    그래도 다른 본문에서 언급하신 FreeMat을 알게되어 기쁩니다.
    주인장님 아니였음 이런 프로그램이 있는줄도 몰랐을겁니다ㅎㅎ

    • 남성 2018.01.17 17:25 신고

      포스팅 시점에는 위 캡쳐 화면과 같이 그냥 쓸수 있었는데 오늘 님 댓글 보고 사이트 방문해 보니 사용료가 생긴것 같군요. freemat 이나 octave 를 사용해 보시길 추천 합니다. 파이썬을 사용하면 더욱 더 좋구요.
      아님 요즘 개발되는 언어로 julia 라는 언어가 있습니다. MATLAB 처럼 공학용 언어인데 속도도 빠르다고 하네요.

      http://iamaman.tistory.com/1479

Simulink 사용시 보통 마우스를 사용하여 모델을 구성하곤 합니다.

 

하지만 이런 GUI 방식은 자동화를 위해서는 그리 좋은 방법은 아닙니다.

 

대량의 시스템 구성시 GUI 을 사용한 구성방식은 한없는 노가다일 수 있습니다.

 

단순 반복적인 작업들은 당연히 자동화를 해야 하고 이를 위해서는 Script 가 필수라고 할 수 있죠.

 

simulink 를 구성하기 위한 MATLAB 명령어들로는 add_block, add_line, new_system, open_system, delete_line, delete_block, replace_block, set_param 와 같은 명령어들이 있습니다.

 

new_system() 을 사용하여 Simulink 블록을 구성하고 open_system 명령어를 사용하여 해당 파일을 열 수 있습니다.

 

다음으로 add_block, add_line 함수를 활용하여 블록과 라인을 구성하고 delete_line, delete_block 함수를 활용하여 라인과 블록을 지울 수 있습니다.

 

다음으로 블록을 교체 하기 위해서는 replace_block 함수를 활용합니다.

 

위에 명령어들만 알면 기본적으로 Simulink 블록을 구성하는건 대부분 다 할 수 있을 것 같더군요.

 

마지막으로 set_param 함수를 사용하면 블록의 세세한 파라미터들을 설정 할 수 있습니다.

 

simulink 블록을 시뮬레이션 하는 명령어는 Sim() 이라는 명령어를 사용합니다.

 

아래 참고사이트에 나와 있는 예제를 실행해보면~ 아래 코드와 같습니다. Simulink 모델을 저장하기 위해 save_system 함수를 사용했습니다.



 

save_system 함수를 사용하여 모델을 저장하면 testModel.slx 라는 모델 파일이 만들어집니다.

 

위 코드를 실행해 보면 다음과 같은 Simulink 모델과 ~

 

다음과 같은 그래프를 MATLAB figure 그래프를 확인 할 수 있습니다.

 

참고 사이트

http://blogs.mathworks.com/seth/2010/01/21/building-models-with-matlab-code/

http://www.goddardconsulting.ca/simulink-creating-using-matlab-code.html


MATLAB BER simulation 관련 검색을 하다가 아래 주소의 글을 발견했습니다.

 

http://www.mathworks.com/matlabcentral/fileexchange/22316-communication-systems-reference-curves

 

위 파일에서 설명하는 내용은 아래와 같습니다.

 

- PSK and QAM over AWGN Channel (BER and SER)

- BPSK over Rayleigh fading channel (BER)

- Convolutional Coded BPSK over AWGN (BER)

 

일단 BER 이나 SER 시뮬레이션을 어떻게 해야 할 지 모르는 분들이 보기에 참 좋은 코드라는 생각이 들더군요.

 

위 주소에 들어가서 아래 그림과 같이 Download Submission 버튼을 누르면 파일을 다운로드 할 수 있습니다.

 

위 코드가 실행되기 위해서는 MATLAB 뿐만 아니라 Simulink, Communications Toolbox, Communications Blockset 이 필요 합니다.

 

다운로드 받은 Submit_v2.zip 파일을 압축해제 하고~ RunMe.m 파일을 실행시키면 아래 그림과 같이 웹 화면이 나옵니다.

 

웹 화면에서 뒤로 가기를 누르면 정상적으로 실행 안 되는 경우가 있으므로 이전 페이지의 내용을 다시 돌려 보고 싶다는 분들은 RunMe.m 파일을 다시 실행하고 들어가서 실행시키면 됩니다.

 

다양한 내용들이 있는데~ 저는 그 중에서 Rayleigh Flat Fading Channel Bit Error Rate curves 만 한번 실행해 봤습니다.

 

아래 그림과 같이 Simulink 파일이 실행되면서 시뮬레이션이 진행 됩니다.

 

시뮬레이션이 진행 될 때마다~ 아래 그림과 같이 BER 그래프에 결과가 하나씩 추가되며~

 

맨 마지막에는 다음과 같은 결과를 확인 할 수 있습니다.

 

BER 또는 SER 시뮬레이션을 해 보려고 하시는 엔지니어 분들이나 디지털 통신을 공부하시는 학생 분들에게 대단히 좋은 예가 될 것 같네요~


Simulink 에서 소스데이터를 발생시키는 방법은 다양하게 있겠지만, 덤프 받은 데이터 등을 사용할 때 From/To workspace 블록을 주로 사용합니다.

 

From workspace 블록은 말 그대로 workspace 상의 변수를 simulink 상으로 불러 오는 것을 말하고 ~ To workspace블록은 반대로 Simulink 상에서 MATLAB workspace 로 값을 내보내는 것을 말하죠~

 

아래 예는 간단하게 Fixed step solver 에서 간단하게 Sin, cosine 값을 읽어 들여서 두 배 해서 a 라는 변수로 내보내는 예인데요.

 

 

From Workspace 창을 열어서 읽어보면 아시겠지만, 1차원 데이터에 대해서는 matrix 형태로 읽어 들여도 되지만, Multi-dimentsion 신호의 경우에는 구조체의 형태로 읽어 들여야 합니다.

 

다음과 같이 sin, cosine 값을 m 파일로 만들고 실행 시켜서 workspace 에 변수가 생성 되도록 합니다.

 

t=linspace(0,2*pi,100);

y=sin(t);

y2=cos(t);

 

time_v=0.1*[0:length(y)-1]; % 시간

 

% 구조체 부분

sin_v2.time= time_v; % time

sin_v2.signals.values=[y(:) y2(:)];        % sin,cosine 신호

sin_v2.signals.dimensions=2;               % 2 차원

 

그 담에 아래 그림처럼 From Workspace 블록을 설정해 줬습니다. Extrapolation 으로 설정 할 때는 intrerpolate data 부분에 꼭 체크를 해야 합니다. 그리고 위 코드에서 신호 구조체를 만들 때 신호의 시간을 설정 해줘야 에러가 안 납니다.

 

 

To workspace 블록은 간단하게 아래 그림처럼 설정했구요.

 

 

이제 결과로 나온 a 변수를 command 창에서 그려보면 아래 그림처럼 나옵니다. 신호의 맨 끝의 두 점을 이용하여 extrapolation 을 하기 때문에 발산하는 형태의 그림이 나오게 되죠~

 

 

그럼 이제 From workspace 블록을 Cyclic repetition 으로 설정해 볼까요? Cyclic repetition으로 설정 할 때는 일단 interpolate data 의 체크를 해제 해 줘야 합니다. 그런데 이 상태에서는 아래와 같은 에러 메시지를 받게 됩니다.

 

 

잘 읽어보면 아시겠지만, 구조체의 시간 field 를 empty time vector로 설정하라고 나옵니다.

 

즉 위 코드에서 time field 를 다음과 같이 고친 다음에 Cyclic repetition 옵션으로 실행 시켜야 에러가 나지 않습니다.

 

sin_v2.time= []; % time

 

요렇게 고치고~ 실행 시킨 후에 command 창에서 그려 보면 아래와 같은 그래프를 얻을 수가 있습니다.

 



Simulink 를 사용하면서 종종 Algebraic Loop Error를 만나게 되는데요.

 

오늘은 이 Algebraic Loop에 대해 알아보려고 합니다.

 

Algebraic Loop 에 대해 이해하기 위해서는 Simulink 의 Direct feedthrough 에 대한 이해가 선행 되어야 합니다.

 

Direct feedthrough 란 어떤 블록의 출력이 결정되는데 현재의 입력이 영향을 미치는 것을 의미합니다.

 

예를 들면 Add, Gain 과 같은 블록은 현재의 입력이 있어야 출력을 알 수가 있을 테니깐 이런 블록들이 바로 direct feedthrough 한 블록들인 것입니다.

 

Algebraic Loop 란 이런 direct feedthrough 한 블록의 출력이 입력에 연결 되었을 때 발생을 합니다.

 

어떻게 보면 당연한 얘기지만 Algebraic Loop 가 있는 구조는 구현 불가능 블록입니다.

 

이유는 time 에 있습니다.

 

t1 이라는 특정 시점에 블록의 현재 출력이 현재의 입력에 들어간다면 물리적으로 불가능 한 거죠.

 

C 나 MATLAB m 파일 작성 시에도 평소에 이런 구현 불가능한 코딩은 지양 해야겠다고 생각됩니다.

 

그럼 간단하게 흔히 실수를 저지르는 Simulink 블록의 구조에 대해 알아보죠.

 

아래 Simulink 블록은 간단한 누적기 입니다.

 

 

입력 소스로 카운터를 두고 계속 누적 하도록 한 거죠.

 

위와 같은 구조의 블록을 실행 시키면 다음과 같은 algebraic loop error 가 발생하게 됩니다.

 

 

Simulink 는 기본적으로 Configuration parametersdiagnostics à solver 설정에서 algebraic loop 설정이 warning 으로 설정되어 있습니다.

 

그럼 이러한 algebraic loop 를 피하는 방법은 어떻게 될까요?

 

해결 방법은 간단 합니다.

 

위 블록의 feedback path 의 중간에 적절한 delay 블록을 넣어 주는 겁니다.

 

에러가 나지 않는 구조는 다음과 같습니다.

 

 

위 모델을 실행 시키면 다음과 같은 정상적인 결과를 얻을 수 있습니다.

 

 


'programming language > MATLAB' 카테고리의 다른 글

MATLAB varargin, varargout  (6) 2012.03.12
MATLAB GUI 창 크기 조절  (4) 2012.03.03
MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20
MATLAB, end 를 이용한 데이터 추가  (1) 2011.11.18

+ Recent posts