人在仿真软件万博1manbetx

万博1manbetx基于Simulink和模型的设计

将C MEX S函数链接到C ++代码

今天,我很乐意欢迎来宾博客 Navid Rahbariasr .Navid最近收到了一个用户的请求,该用户试图在加速器模式的引用模型中包含c++代码。不幸的是,这个用户被迫使用MATLAB R2020b,不能利用新的 支持c+万博1manbetx+模型参考仿真目标 在MATLAB R2021a中添加。这是纳维想出的变通办法。
- 吉利

配置S-Function Builder以包含c++代码

让我们从一个简单的例子开始,我们的s函数正在调用方法 get_a 定义自定义c++源代码。自定义c++代码的头文件和源代码如下:
注意"::"是一个c++操作符。它被称为 范围决议算子 当存在同名的局部变量时,可用于访问全局变量。在这个例子中,我们有一个全局变量 一个 ,以及方法内具有相同名称的局部变量。通过添加::在前面 一个 我们表示对全局变量感兴趣 一个 ,在此示例中的值为2.此运算符::未在C中定义,因此如果您尝试在C中编译此代码,则会获得语法错误。
现在我们用 S函数建设者 创建一个调用的S函数 get_a 函数并将值路由到输出。如果你没有注意到,S-Function Builder已经在R2020b中被完全修改,允许你以交互方式看到最终的S-Function代码。
我们在S-Function Builder的include部分包含自定义头,如下所示:
我们调用这个方法 get_a 在s函数中输出包装函数,并将其赋给s函数块的输出:
我们将c++源代码添加为库条目,以便S-Function可以调用其中定义的方法。你可以在S-function Builder界面的底部找到库入口:
最后,我们构建S函数:
注意,我们已经将s -函数的语言设置为c++。如果我们把它设为C,那个方法会得到一个错误 get_a 未解决的:
通过将语言设置为C ++,构建了S函数。现在,如果我们运行模型并检查输出,我们会看到输出为2,全局变量的值 一个

引用模型

如果我们在正常模式中引用上述模型,我们将获得预期的2。
然而,如果我们将模型块设置为加速模式并尝试运行模型,我们会看到一个关于未解析外部符号的错误,它看起来与上面所示的S-Function Builder语言被设置为C而不是c++时非常相似:
该错误表明Simulink找不到万博1manbetx sfcn_test_wrapper.c. custom_code.c - 这是准确的,因为这些文件的扩展名是CPP而不是c!这是因为Simulink引擎首先在语言为C的加速模式中为参考万博1manbetx模型生成一个仿真目标,因此它将符号解释为C而不是c++,因此加速模式构建不能正确地与s -函数链接。
graphical_issue.png
这是Simulink在R2021a之前的仿真目标的限制,当万博1manbetx 支持c+万博1manbetx+模型参考仿真目标 已被添加。

解决方法

如果我们想要加速引用模型成功构建,我们需要用C编写S-Function,但是我们的源代码使用c++特性,那么我们如何用C编写S-Function呢?
这个诀窍是将S-function链接到编译版本的源代码,所以编译器不需要重新编译它(它就像磨削C编译器的C ++食物那样没有右牙齿咀嚼它!)但可以C代码调用编译C ++方法?答案是肯定的,只要我们包装的C ++声明方法 extern c {} ,以便编译器在编译方法时使用C命名约定。
我们首先通过extern c包裹方法修改自定义头文件,如下所示:
请注意, #ifdef __cplusplus. 是一个编译器指令。它有效地意味着“如果语言是C ++ ......”。当我们编译源代码时,随着编译器检测到它是C ++,它将与方法声明包装 extern“c”{} 所以编译的对象将具有C命名方案。
现在,我们通过使用-c标志使用mex编译源代码到对象文件中:
mex -c custom_source.cpp.
通过运行此命令,您将获得一个目标文件 custom_code.obj. 的已编译版本的文件夹中 custom_source.cpp.
现在我们转到S函数构建器并修改两件事:
1)将语言更改为c
2)将s函数链接到已编译的obj文件,而不是未编译的源文件(惊喜!你可以将S-Function链接到obj文件!)
当我们将S函数链接到编译的C ++代码而不是未申报的C ++代码时,可以使用C语言构建S函数。
现在,如果我们转到顶级模型并以加速模式运行模型,它将成功构建仿真目标,我们将获得2的预期输出:
基本上,我们能够将仅理解C语言的加速器构建链接到C MEX S函数和编译的C ++ OBJ文件:
graphical_wrkarnd.png

C ++万博1manbetx支持R2021A中的模型参考仿真目标

上述解决方案对于较早的版本是有用的。在R2021a中,如果您的模型包含c++ S-Functions,您可以简单地设置 语言 在配置集的仿真目标部分中的C ++,这将允许加速器构建以了解C ++语言并正确解释C ++ S功能。
并且所有内容都使用C ++构建:

现在轮到你了

如果添加,请告诉我们在下面的评论中知道 支持c+万博1manbetx+模型参考仿真目标 添加在MATLAB R2021a为您打开新的可能性。
|

评论

要留下评论,请点击这里登录到您的MathWorks帐户或创建一个新帐户。