本文最后更新于 2026年6月16日。
不一定,但在绝大多数实际工程和代码生成(Embedded Coder)场景中,给 Outport 绑定 Bus(总线)是最标准、最推荐的做法。
如果你想让 Simulink 生成的 C 代码中,输出变量是一个标准的 C 语言 struct,你其实有几种不同的实现路径。下面为你梳理最常用的几种方法和它们的区别:
方法一:给 Outport 绑定 Bus 对象(最推荐)
这是最正统的方法。通过在 Outport 模块上配置数据类型为 Bus: YourBusName,Simulink 在生成 C 代码时,会直接将该 Outport 映射为结构体的一个成员,或者作为一个独立的结构体指针输出。
-
实现方式:
-
在 MATLAB 基础工作区(Base Workspace)或 Data Dictionary 中定义一个
Simulink.Bus对象。 -
内部添加你需要的各路信号(Elements),并指定它们的数据类型。
-
将 Outport 的 Data type 改为
Bus: 你的总线名。
-
-
代码效果: 生成的
.h文件中会自动定义对应的struct,.c文件中的输出信号就是该结构体类型。
方法二:使用 Mux 信号 + 存储类(Storage Class)配置
如果你不想显式创建 Bus 对象,但在生成代码时又希望它变成结构体,可以通过配置信号的存储类来实现。
-
实现方式:
-
使用 Mux 模块或者多维信号将多路数据组合在一起,引出到 Outport。
-
打开 Model Explorer 或使用 Code Mappings 窗口。
-
找到该 Outport 的信号,将其 Storage Class 设置为
Struct(或者自定义的特定的结构体类型,如Bitfield等,具体取决于你的定制需求)。
-
-
代码效果: 编译器会强制将这个端口的代码组织成一个结构体形式输出。
方法三:通过外部 C 代码桥接(如 S-Function 或 Stateflow)
如果你在模型内部使用了 S-Function、MATLAB Function 或者是 Stateflow,你可以在这些模块内部直接定义和使用 C 结构体。
-
实现方式: 在 MATLAB Function 中使用
Simulink.Bus传递数据,或者在 S-Function 中直接用 C 语言的指针操作结构体,最后把结构体的指针或者成员输出。 -
代码效果: 结构体的定义完全由你手写的 C 代码或特定的自定义目标(Custom Target)决定。
💡 为什么大家都推荐绑定 Bus?
虽然方法二和方法三也能搞定,但绑定 Bus 有几个无法替代的硬资产:
-
强类型检查: 绑定 Bus 后,Simulink 在仿真阶段就会严格检查结构体内部各个成员的数据类型、维数和采样时间,避免把错误的数据类型硬塞进结构体。
-
代码可读性极高: 生成的 C 代码中,访问结构体成员会直接使用总线元素的名称(例如
output_struct.engine_speed),而不是像 Mux 数组那样变成毫无可读性的下标(例如output_array[0])。 -
维护方便: 如果以后结构体要增加或删除一个成员,你只需要修改
Bus对象,整个模型和生成的代码会自动同步,不容易漏改错改。
总结: 想输出 C 结构体,绑定 Bus 对象是标准答案。如果只是临时或者特殊的多维数组变结构体,可以考虑配置 Storage Class,但长远来看,Bus 方案更不容易翻车。