Stateflow 차트에서 사용자 지정 구조체 통합하기
이 예제에서는 Stateflow® 차트에서 사용자 지정 코드의 구조체를 사용하는 방법을 보여줍니다. C 코드에서 구조체 유형의 데이터를 정의하고, 이를 Stateflow 구조체 및 Simulink® 버스와 통합할 수 있습니다. 사용자 지정 코드와 데이터를 공유하면 Stateflow에서 지원하는 기능을 향상하고, 기존 코드를 활용할 수 있습니다. 자세한 내용은 Reuse Custom Code in Stateflow Charts 항목을 참조하십시오.
이 예제에서 Stateflow 차트는 하나의 Simulink 버스에서 오는 데이터를 처리하고 그 결과를 다른 Simulink 버스로 출력합니다. 입력 버스와 출력 버스는 모두
객체 Simulink.Bus
(Simulink)COUNTERBUS
에 의해 정의됩니다. 차트에서 Simulink 버스는 Stateflow 구조체 inbus
및 outbus
와 상호 작용합니다. 차트는 사용자 지정 C 함수를 호출하여 출력 구조체 outbus
에 씁니다.
C 코드에서 사용자 지정 구조체 정의하기
1. C 코드에서 사용자 지정 헤더 파일을 만들어 구조체를 정의합니다. 헤더 파일에는 사용자 지정 구조체의 속성을 정의하는 typedef
선언이 포함되어 있습니다. 예를 들어 이 모델에서 헤더 파일 counterbus.h
는 다음 세 가지 사용자 지정 구조체를 선언합니다.
... typedef struct { int input; } SIGNALBUS;
typedef struct { int upper_saturation_limit; int lower_saturation_limit; } LIMITBUS;
typedef struct { SIGNALBUS inputsignal; LIMITBUS limits; } COUNTERBUS; ...
2. 유형 편집기에서 각 사용자 지정 구조체 typedef
선언과 일치하는 Simulink.Bus
객체를 정의합니다. 각 Simulink.Bus
객체의 헤더 파일 필드에서 일치하는 typedef
선언을 포함하는 헤더 파일의 이름을 입력합니다.
3. Configure Custom Code 항목에 설명된 대로 사용자 지정 C 코드를 포함하도록 Stateflow 차트를 구성합니다.
4. 모델을 만들고 실행합니다.
Stateflow 구조체를 사용자 지정 코드에 전달하기
구조체 포인터를 인수로 받는 사용자 지정 C 함수를 호출할 때, Stateflow 구조체를 주소 형태로 전달합니다. Stateflow 구조체 또는 그 필드 중 하나의 주소를 사용자 지정 함수로 전달하려면 다음과 같이 &
연산자와 점 표기법을 사용합니다.
&outbus
는 Stateflow 구조체outbus
의 주소를 제공합니다.&outbus.inputsignal
은 구조체outbus
의 하위 구조체inputsignal
의 주소를 제공합니다.&outbus.inputsignal.input
은 하위 구조체outbus.inputsignal
의 필드input
의 주소를 제공합니다.
자세한 내용은 Index and Assign Values to Stateflow Structures 항목을 참조하십시오.
예를 들어 이 예제에는 구조체 포인터를 인수로 받는 사용자 지정 C 함수 counterbusFcn
이 포함되어 있습니다. 사용자 지정 헤더 파일 counterbus.h
에는 다음 함수 선언이 포함되어 있습니다.
extern void counterbusFcn(COUNTERBUS *u1, int u2, COUNTERBUS *y1, int *y2);
차트는 다음 함수 호출을 사용하여 Stateflow 구조체 counterbus_struct
와 outbus
로 주소를 전달합니다.
counterbusFcn(&counterbus_struct, u2, &outbus, &y2);
함수는 차트 입력 u2
의 값과 로컬 구조체 counterbus_struct
의 값을 읽어옵니다. 함수는 차트 출력 y2
와 출력 구조체 outbus
에 씁니다.
사용자 지정 코드의 버스 제한 사항
사용자 지정 코드에 정의된 버스에 다차원 배열이 포함된 경우 해당 버스를 가져올 수 없습니다.
사용자 지정 코드에 있는, 다차원 배열이 포함된 버스를 사용하려면 Stateflow에서 버스를 정의하고 버스를 사용자 지정 코드로 전달합니다.
참고 항목
Simulink.Bus
(Simulink)