通过ZMQ实现C++与MATLAB Simulink之间的通信

本文详细描述了如何实现C++与Simulink之间的通信,通过S-function利用ZeroMQ库进行数据交换。在实现过程中遇到了VS编译ZeroMQ库的问题和MATLAB环境配置错误,最终通过下载特定版本的libzmq库并调整配置解决了问题。
摘要由CSDN通过智能技术生成

最近想要实现C++与Simulink之间的通信,Simulink向C++发送数据,C++接受并且计算再发送回Simulink中。这一个简单的想法,也花了几天去实现。

实现过程

1. 找到方法

在寻找方法的时候,我发现了这个网页,里面讲述了Simulink与外界交互的方法。
链接: 将外部仿真组件集成到Simulink平台中

1.1 通过S-function 与外部应用通信介绍

在上面的网页中,找到了一个简单的例程,讲述了通过S-function 与外部应用通信。
在这里插入图片描述

例程链接到博客文章

1.2 可以按照Blog所说的方式一步一步实现

Those steps include:

Download and build the ZeroMQ library
Build a co-simulation server executable
Build a S-function to communicate with the server executable

但是因为这是2018年的例程,在实现过程中会出现一些问题。

2. 遇到问题

2.1 没有实现通过VS编译ZeroMQ library

我在下载了ZeroMQ库之后,发现build中的msvc已经被遗弃了,官方没有继续维护使用msvc 的版本,所以使用VS编译是很难成功的。
在这里插入图片描述

解决方法

但是,ZeroMQ已经提供了release的libzmq, 所以直接在ZeroMQ的官方github地址下载就好。
下载链接:https://github.com/zeromq/libzmq/releases/tag/v4.3.4

在下载完成后进行解压,就会发现很多 exe 文件 以及 dll文件lib 文件,只需要dll文件以及lib文件即可。
复制所有的dll文件lib 文件,放在文件路径 \ SimulinkCoSimulationExample\libzmq\bin\Win32\Debug\v140\dynamic
中,即可。

2.2 在MATLAB环境配置中出现错误

因为我在下载libzmq时是 libzmq-v142-x64-4_3_4 版本,所以在配置环境时,会出现一些问题。
在这里插入图片描述

解决方法

在这里还是尽量保留libzmq的版本号。 将之前的libzmq.dll换成libzmq-v142-mt-4_3_4.dll,如下图所示。

%% Add the ZMQ DLL to the system path:
p = simulinkproject;
if strcmp(mexext,'mexw64')
    if exist(fullfile(p.RootFolder,'libzmq','bin','x64','Release','v140','dynamic','libzmq-v142-mt-4_3_4.dll'),'file')
        pathEnvVar = getenv('PATH');
        setenv('PATH',[pathEnvVar ';' fullfile(p.RootFolder,'libzmq','bin','x64','Release','v140','dynamic')]);
        disp('libzmq-v142-mt-4_3_4.dll added to system PATH')
    else
        disp('libzmq-v142-mt-4_3_4.dll not found, build libzmq.dll before adding to the system path. See readme.mlx for more details.')
    end
else
    error('Non-Windows OS, please add the ZMQ library to your PATH environment variable manually');
end

这样就可以成功编译SetEnvVariable.m文件 了。
在这里插入图片描述

同样的方法,在buildCoSimExample.m中添加相应的lib文件即可。

p = simulinkproject;

%% Build the server App
cd(fullfile(p.RootFolder,'CoSimExample','serverApp'));

mex('-client', 'engine',... 
    ['-I' fullfile(p.RootFolder,'CoSimExample','util')],...
    ['-I' fullfile(p.RootFolder,'libzmq','include')],...
    ['-I' fullfile(p.RootFolder,'cppzmq')],...
    ['-L' fullfile(p.RootFolder,'libzmq','bin','x64','Release','v140','dynamic')],...
    '-llibzmq-v142-mt-4_3_4','-llibzmq-v142-mt-s-4_3_4',...
    'statcalserver.cpp',...
    fullfile(p.RootFolder,'CoSimExample','util','statcal_util.cpp'));

%% Build the S-function
cd(fullfile(p.RootFolder,'CoSimExample','sfun'));

mex('-I..\util',...
    ['-I' p.RootFolder '\libzmq\include'],...
    ['-I' fullfile(p.RootFolder,'libzmq','include')],...
    ['-I' fullfile(p.RootFolder,'cppzmq')],...
    ['-L' fullfile(p.RootFolder,'libzmq','bin','x64','Release','v140','dynamic')],...
    '-llibzmq-v142-mt-4_3_4','-llibzmq-v142-mt-s-4_3_4',...
    'statcalsfcngateway.cpp',...
    'statcalclient.cpp',...
    fullfile(p.RootFolder,'CoSimExample','util','statcal_util.cpp'));

cd(p.RootFolder)

在这里插入图片描述
编译完成。

3. 总结

多看官方文档,注意细节。

朋友们,都看到这里啦,留个赞再走吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值