人在仿真软件金宝app

金宝appSimulink &基于模型的设计

链接C MEX s -函数到c++代码

今天,我很高兴地欢迎客座博主 Navid Rahbariasr .Navid最近收到了一个用户的请求,该用户试图在加速器模式的引用模型中包含c++代码。不幸的是,这个用户被迫使用MATLAB R2020b,不能利用新的 支持c+金宝app+模型参考仿真目标 在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无法找到金宝app sfcn_test_wrapper.c custom_code.c—— 这是准确的,因为这些文件的扩展名是CPP而不是c!这是因为Simulink引擎首先在语言为C的加速模式中为参考金宝app模型生成一个仿真目标,因此它将符号解释为C而不是c++,因此加速模式构建不能正确地与s -函数链接。
graphical_issue.png
这是Simulink在R2021a之前的仿真目标的限制,当金宝app 支持c+金宝app+模型参考仿真目标 已被添加。

解决方案

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

c++支金宝app持模型参考仿真目标在R2021a

上述解决方案对于较早的版本是有用的。在R2021a中,如果您的模型包含c++ S-Functions,您可以简单地设置 语言 这将允许加速器构建理解c++语言并正确解释c++ S-Function。
一切都是用c++构建的:

现在轮到你了

请在下面的评论中告诉我们是否添加了 支持c+金宝app+模型参考仿真目标 添加在MATLAB R2021a为您打开新的可能性。
|

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。