주요 콘텐츠

Stateflow 차트에서 사용자 지정 구조체 통합하기

이 예제에서는 Stateflow® 차트에서 사용자 지정 코드의 구조체를 사용하는 방법을 보여줍니다. C 코드에서 구조체 유형의 데이터를 정의하고, 이를 Stateflow 구조체 및 Simulink® 버스와 통합할 수 있습니다. 사용자 지정 코드와 데이터를 공유하면 Stateflow에서 지원하는 기능을 향상하고, 기존 코드를 활용할 수 있습니다. 자세한 내용은 Reuse Custom Code in Stateflow Charts 항목을 참조하십시오.

이 예제에서 Stateflow 차트는 하나의 Simulink 버스에서 오는 데이터를 처리하고 그 결과를 다른 Simulink 버스로 출력합니다. 입력 버스와 출력 버스는 모두 Simulink.Bus (Simulink) 객체 COUNTERBUS에 의해 정의됩니다. 차트에서 Simulink 버스는 Stateflow 구조체 inbusoutbus와 상호 작용합니다. 차트는 사용자 지정 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_structoutbus로 주소를 전달합니다.

counterbusFcn(&counterbus_struct, u2, &outbus, &y2);

함수는 차트 입력 u2의 값과 로컬 구조체 counterbus_struct의 값을 읽어옵니다. 함수는 차트 출력 y2와 출력 구조체 outbus에 씁니다.

사용자 지정 코드의 버스 제한 사항

사용자 지정 코드에 정의된 버스에 다차원 배열이 포함된 경우 해당 버스를 가져올 수 없습니다.

사용자 지정 코드에 있는, 다차원 배열이 포함된 버스를 사용하려면 Stateflow에서 버스를 정의하고 버스를 사용자 지정 코드로 전달합니다.

참고 항목

(Simulink)

도움말 항목