Main Content

在 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.配置 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_structoutbus

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

该函数读取图输入 u2 和局部结构体 counterbus_struct 的值。它写入图输出 y2 和输出结构体 outbus

另请参阅

(Simulink)

相关主题