Contents
[개요]

 현재 이 글을 작성하는데 사용한 Matlab 버전은 R2025a, Home License 입니다.

 

 개인적인 취미로 활용도가 무궁무진한 Matlab을 공부해 보고자 Home License까지 구매를 했는데 시작부터 막혔던 S-Function 기능을 사용하는 방법에 대해 정리해보고자 합니다.

 

[본문]

1. S-Function에 대한 간략한 기능 설명

S-Function [1]은 C언어 or 기타 프로그래밍 언어로 작성한 자신의 알고리즘을 Simulink 내부의 다른 모델들과 상호 연동되어 구동될 수 있도록 하는 기능을 의미한다고 생각합니다. PSIM에서 C-Block or DLL Block 유사한 기능이라고 볼 수 있겠습니다. :D

 

Fig. S-Function 기능 테스트 모델링

 

우선 위에 SFT라고 적혀진 붉은색 박스가 S-Function 모델이며 입력측으로는 AC Voltage Source로 240[V]를 Measurement를 이용해 입력시켜두었고 SFT 내부 연산으로 2개의 출력을 내보내는데 하나는 240[V]를 그대로 Bypass, 하나는 반전시켜서 출력을 해보고자 합니다.

 

앞서 S-Function의 Hyper Link를 따라가면 timestwo.c라는 이름의 C MEX S-Function 예제 소스코드가 작성되어 있습니다. 

Fig. timestwo.c (S-Function 관련 예제 소스코드) 발췌

 

우선 뭔가 mdlinitialize... 로 시작하는 여러 정적 함수들이 나열되어있는데 결론적으로는 mdlOutputs 함수 안에 사용자의 알고리즘을 작성하면 된다는 것을 알 수 있습니다.

 

Fig. S-Function Callback methods

 

이부분에 대해 C MEX S-Function [2]이라는 페이지에서 좀 더 상세하게 설명되어 있습니다.

 

2. S-Function Compile 하는 방법

Fig. Compile 하는 과정에 대한 사진

 

S-Function이 인식할 수 있도록 사용자의 알고리즘을 컴파일을 통해 생성된 Out File과 연동이 필요하다. 

 

우선 앞서 Matlab에서 제공하는 예제인 timestwo.c 라는 파일을 그대로 똑같이 작성하고 (작성자는 SFT.c 라는 파일이름으로 만들었음) 이러한 소스코드를 Compile하는 명령어는 mex 이다.

 

위와 같이 mex timestwo.c 라고 m 파일에 작성하고 실행하면 Command Window에 MEX completed successfully. 라는 문구가 현시되면서 소스코드 이름과 동일한 mexw64 확장자의 결과 파일이 생성될 것이다. 

 

만약 timestwo.c 파일과 완전 동일한 소스코드로 Compile이 진행이 되지 않는다면 mex -setup [3]이라고 작성하고 실행해보자, Compiler 설정 오류로 인한 문제일 수도 있으며 처음에 한번만 수행하면 이후부터는 정상적으로 결과 파일이 생성될 것이다.

 

또한 만약에 아래와 같이 Unable to run file Error가 발생한다면 이는 mex Compile을 수행하는 .m 파일과 사용자의 Source Code .c 파일의 명칭이 동일해서 발생하는 문제이다.

 

3. Unable to run file. 이라는 Error가 Pop-up 되었을 때 대처 방법 

Fig. Unable to run file. Error

 

작성자는 SFT.c, SFT.m 으로 파일을 만들었다가 위와 같은 팝업창이 발생해서 SFT.c, SFT_Init.m 으로 명칭을 변경해서 해결했다.

 

4. 복수개의 입, 출력 포트 설정 방법 

Fig. Total number of input and output elements are not valid

 

이제 예제 파일(입력 1 포트, 출력 1 포트) 동작까지는 확인되었고 여러 채널의 입, 출력 포트를 설정하는 방법을 확인하고자 한다. 

 

Fig. ssSetInputPortWidth, ssSetOutputPortWidth

 

위와 같이 ssSetInputPortWidth [4], ssSetOutputPortWidth 를 활용하면 될 듯하다.

 

Fig. Input, Output Port 설정

 

 

ssSetOutputPortWidth 함수의 마지막 인자인 Width에 출력하고자하는 Port의 수를 기재하고 동작시켜보니 정상적으로 동작함을 확인할 수 있었다.

 

번외로 ssSetInputPortDirectFeedThrough(S, 0, 1); 이 부분은 더 깊게 확인하지는 못했고 테스트 과정에서 주석 처리를 해봤었는데 굉장히 재미없어진다. Matlab이 튕겨버림... :(

 

5. 결론

Fig. S-Function 출력 2 포트 정상 동작 결과 파형

 

이제 S-Function에 복수개의 입, 출력 포트를 설정하는 방법을 알게 되었다...

 

[참고 자료]

 

[1] https://kr.mathworks.com/help/releases/R2025a/simulink/slref/sfunction.html

 

S-Function - Include S-function in model - Simulink

The S-Function block allows you to integrate your S-function or system function algorithms written in C, C++, or Fortran, known as C MEX S-functions, into Simulink models.

kr.mathworks.com

[2] https://kr.mathworks.com/help/simulink/sfg/example-of-a-basic-c-mex-s-function.html

 

Create and Implement a Basic C MEX S-Function - MATLAB & Simulink

Construct the code to create an S-function.

kr.mathworks.com

[3] https://kr.mathworks.com/help/matlab/matlab_external/changing-default-compiler.html

 

Change Default Compiler - MATLAB & Simulink

How and when to change the default compiler.

kr.mathworks.com

[4] https://kr.mathworks.com/help/simulink/sfg/sssetinputportwidth.html?searchHighlight=ssSetInputPortWidth&s_tid=srchtitle_support_results_1_ssSetInputPortWidth

 

ssSetInputPortWidth - Specify the width of an input port - MATLAB

SimStruct that represents an S-Function block.

kr.mathworks.com

 

+ Recent posts