在 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.配置 Stateflow 图以包含自定义 C 代码,如Configure Custom Code中所述。
4.编译并运行您的模型。
将 Stateflow 结构体传递给自定义代码
当您调用接受结构体指针作为参量的自定义代码函数时,请按地址传递 Stateflow 结构体。要将一个 Stateflow 结构体的地址或其中一个字段传递给自定义函数,请使用 &
运算符和圆点表示法:
&outbus
提供 Stateflow 结构体outbus
的地址。&outbus.inputsignal
提供结构体outbus
的子结构体inputsignal
的地址。&outbus.inputsignal.input
提供子结构体outbus.inputsignal
的字段input
的地址。
有关详细信息,请参阅对 Stateflow 结构体进行索引并赋值。
例如,此示例包含自定义 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
。
另请参阅
Simulink.Bus
(Simulink)