【问题标题】:C/C++ Wrapper for SIMULINK modelsSIMULINK 模型的 C/C++ 包装器
【发布时间】:2013-06-25 00:01:52
【问题描述】:

我在 Visual Studio 和 Eclipse 中有一个非常大的 C/C++ 软件项目。有一些以 SIMULINK 模型形式存在的第三方软件。目前是否可以:

1) 为 SIMULINK 模型编写 C/C++ 包装函数? 2) 从外部环境(如 VS 或 Eclipse C/C++ 项目)中调用函数来执行集成和进一步的任务?

我知道您可以使用 MEX (MATLAB Exec.) 函数,这些函数是为 MATLAB 使用而封装的 C/C++ 或 FORTRAN。但这对我来说并不理想。

用例

我的用例基于建模和仿真,但我的子系统在数据格式方面非常多样化。 50% 在 C/C++ 中,35% 在 SIMULINK 模型中,其余的在二进制可执行文件、目标代码、符号数据等中。我正在做一些复杂的系统建模;抱歉,由于保护原因,无法进一步告诉您。

从我得到的答案看来,人们似乎热衷于使用 Mathworks 提供的功能。我的意图是得到更像是一个否定的答案,但到目前为止我也得到了很好的解释。

更新

我将不得不评估 SIMULINK 的嵌入式编码器,看看需要多少额外的努力来完善生成的代码。我读到 Embedded Coder 中有生产级代码生成工具;应该很有趣。

【问题讨论】:

  • 看来你不想使用任何主流方法来访问simulink生成的代码。你想做什么?
  • @macduff 仅仅因为有代码生成器并不意味着我必须使用它。我试图找出是否可以使用 C/C++ 包装器来调用 SIMULINK 模型。而我想做的是创建一个复杂的系统,其中子系统设计在 SIMULINK 模型、C/C++ 源代码、可执行应用程序、目标文件、二进制数据等中。如果你想要具体细节,抱歉我不能透露保密。
  • 您可以调用 Matlab 并使用 TCP/IP 或其他 IPC 进行协同仿真,以便在协同仿真期间与模型进行通信。但是,如果生成的 c 代码效率不够高,也可能缺少这种方法。
  • @macduff 很高兴您能理解!我很确定 MATLAB 的代码生成器不够好。 SIMULINK 的一个 - 我不确定,目前正在尝试中。我很想试试你所说的关于 TCP 通信的内容。那么,我应该“伪造”远程执行我的 .m 脚本吗?
  • 虽然这是可能的,但需要付出合理的努力。如果可能,请使用 Simulink 生成的代码。

标签: c++ matlab user-interface wrapper simulink


【解决方案1】:

根据您的具体要求,有两种选择:

  • 使用 Simulink Coder 将 Simulink 模型转换为 C。这有效地使您脱离了 Simulink 环境,因此将模型功能集成到您现有的环境中与合并任何其他 C 代码相同。当然,您需要访问 Simulink Coder 才能执行此操作。

  • 调用MATLAB Engine。请注意,您不能只调用 Simulink。您调用 MATLAB 并发出各种 MATLAB 命令来加载、执行和询问 Simulink 模型。

【讨论】:

  • 感谢您的回答。我已经知道 SIMULINK 编码器(ex RT Workshop)。很抱歉我没有在我的问题中提到它。问题是生成的代码效率不高且结构不完善。对于大型+复杂系统,例如4 级涡轮发动机,12 -13 SIMULINK 模型的生成代码将是一场噩梦。还有另一个风险是,如果您对模型进行任何更改(客户更改),则生成的代码需要重新生成以及其他事情。我们还必须小心使用这些 3rd 方模型的供应商知识产权。
  • @hagubear Simulink Coder 背后的想法不是出于您提到的原因编辑生成的代码。模型成为黄金参考,而不是代码。如果代码效率不够高,您可能需要使用 Embedded Coder 对其进行优化和自定义,该代码旨在生成生产代码(而不是原型代码)。
  • 如果您正在讨论合并对十几个或更多单独模型的调用,那么您就不可能使用 MATLAB API 方法。您需要有一个流程来标记对模型的任何更改并重新生成代码(使用 Embedded Coder 作为 am304 提及)。另外,我不确定 IPR 的来源——保护编译模型比保护 Simulink .slx 模型容易得多。
  • @PhilGoddard 仅仅因为有一个 SIMULINK 代码生成器并不一定意味着它是唯一的方法,至少我是这么认为的。似乎 SIMULINK 仅提供 S-Function(用于在模型中调用旧版 C/C++ 代码)和 Embedded Coder。我很想知道反过来是否可行,因为 LabVIEW 提供了这种功能。此外,我目前拥有 MATLAB/SIMULINK 许可证,但维护所有工具箱/模块集的成本非常高。而且,我的产品需求正在显着增长,并指向要从 Mathworks 购买额外的模块集:(
  • 您最初的问题很明确,因为您希望外部应用程序(用 C++ 编写)调用 Simulink。但同样,我的回答(我认为很清楚)说是的,这是可能的。可以使用答案中链接中给出的对 MATLAB API(来自 C 代码)的调用来实现。我不认为这是正确的方法,而且您的系统越复杂,我就越相信代码生成方法是正确的。
猜你喜欢
  • 2013-04-09
  • 2023-03-09
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
相关资源
最近更新 更多