Simulin金宝appk上的Guy

金宝appSimulink &基于模型的设计

与外部应用程序通信以进行联合仿真

今天我要描述一个我最近提交的例子MATLAB中央而且GitHub在同事冯海华的帮助下:使用Simulink实现联合仿真的示例金宝app

如果你不知道,MathWorks的网站上列出了很多第三方建模和仿真工具从MathWorks联系合作伙伴

MathWorks连接伙伴

许多学校都提供这样做的选择联合仿真仿真软件。金宝app有了这样的解决方案,金宝搏官方网站这些第三方工具允许用户在第三方工具(通常是MathWorks没有专用工具箱的专业领域)中设计部分算法,在Simulink中设计部分算法(例如,设计一个希望为其生成嵌入式代码的控制器)。金宝app

如果你是这样一个工具的作者,或者想要在Simulink中集成你的工具进行联合仿真,我建议你详细阅读这篇文章。金宝app

这个项目

下载了提交自MATLAB Central从GitHub克隆出来的,打开Simulink金宝app项目金宝appSimulinkCoSimulationExample.prj.在Shortcuts选项卡中,您将注意到我添加了一些快捷方式来帮助您完成运行示例所需的步骤。

联合仿真项目

这些步骤包括:

  • 下载并构建ZeroMQ库
  • 构建一个联合模拟服务器可执行文件
  • 构建一个s函数来与服务器可执行文件通信

让我们更详细地看看这些步骤。

ZeroMQ

为了实现Simulink与其他软件之间的通信,我们决定使用一个名为金宝appZeroMQ.我可以试着自己描述ZeroMQ是什么,但我认为最好是引用ZeroMQ手册描述它如何开始

我们把一个普通的TCP插座,注入了从苏联一个秘密原子研究项目中偷来的放射性同位素混合物,用1950年代的宇宙射线轰炸它,然后把它交给了一个吸毒成瘾的漫画书作者,他对穿着氨纶的肌肉有强烈的迷恋。是的,ZeroMQ套接字是网络世界中拯救世界的超级英雄。

看到完整的手册,以了解更多细节

安装ZeroMQ

在我看来,进入图书馆最简单的方法就是通过GitHub.你需要两个GitHub条目:cppzmq而且libzmq

在MATLAB中,如果你已经有了安装Git源代码控制,你可以从当前文件夹浏览器克隆存储库.如果您愿意,还可以通过直接从MATLAB提示符调用Git命令行客户机来克隆存储库。

克隆zmk git存储库

完成此操作后,您需要构建库。为此,您需要一个编译器。在我的例子中,我使用的是Microsoft Visual Studio 2015,所以我从Visual Studio启动命令提示符:

启动MSVC命令提示符

我导航到libzmq的构建文件夹,并执行提供的构建批处理脚本:

建筑ZMQ

可以想象,有许多方法可以为各种操作系统和编译器构建库,请参阅ZMQ文档,了解用于特定设置的可用选项。

库构建完成后,需要将其添加到系统路径中。如果你在我的Simulink项目中金宝app,快捷方式SetEnvVariable会使用setenv函数。

服务器应用程序

下一步是创建一个服务器应用程序。在本例中,服务器应用程序实现了一个简单的算法指数加权移动平均.在每一个时间步骤中,Simulink将数金宝app据发送到服务器,服务器将进行一些计算并将结果发送回Simulink。

服务器应用程序的主文件为statcalserver.cpp.如果您浏览代码,您将发现一个简单的示例,它首先绑定到一个套接字(特定的IP地址和端口)。然后它进入一个循环,等待来自客户端的请求。当一个请求传入时,它解码与之相关的数据,处理它并将应答发送给客户端。下面是服务器代码片段:

服务器代码

在Simuli金宝appnk项目中,查看快捷方式buildCoSimExample来看看墨西哥人命令可用于构建服务器应用程序。

客户端

在Simuli金宝appnk端,客户端是使用C-Mex s函数(实际上它是c++的s函数)。让我们看看最重要的部分。

在模拟的开始,我们使用mdlSetupRuntimeResources打开与服务器的连接。我们储存在指针功矢量与此连接相关的信息。

设置资源

需要注意的一件重要的事情是,为了获得最大性能,我们将s函数作为输入non-directfeedthrough.这样,s函数就不会使用当前时间步长的输入来计算输出。正如您可以想象的那样,这会引入延迟,但这允许Simulink在向前移动并执行模拟中的其他块之前不等待服务器响应。金宝app

为了实现这一点,我们在计算完所有块输出后将请求发送到服务器mdlUpdate

mdlUpdate

下一个时间步,在mdlOutput我们从服务器检索响应并输出它。

mdlOutput

最后,当模拟结束时,我们关闭连接mdlCleanupRuntimeResources

清理资源

在Simuli金宝appnk项目中,查看快捷方式buildCoSimExample来看看墨西哥人命令可以用来构建S-Function。

要了解更多关于S-Function中可用的回调方法以及何时调用它们,我建议查看金宝appSimulink引擎与C S-Functions的交互

最终结果

如上所述,在我创建的Simulink项目中金宝app快捷键到MATLAB脚本来帮助完成这里的所有步骤。

一旦在OS路径上构建了libzmq DLL,在MATLAB路径上构建了服务器可执行文件,并对s函数进行了mexed,您就应该能够启动服务器。在Simuli金宝appnk Project中,可以使用快捷方式startCoSimServer,它将执行以下代码:

启动服务器

随着服务器的运行,我们终于可以模拟示例模型了clientModel.slx并观察结果:

联合仿真模型

现在轮到你了

如果您正在考虑与外部应用程序实现联合模拟,请尝试这种技术,并在下面的评论中告诉我们效果如何。

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。