Simulink和MATLAB工作区的TCPIP通信

  • 1. 说明
  • 2. 效果展示
  • 3. simulink端的结构和说明
  • 4. 工作区文件说明
  • 5. 文件资源
  • 6. 运行方法
  • 7. 问题

1. 说明

问题提出:simulink提供的与工作区数据的传输,仅限于仿真结束后,缺乏实时性

解决方案:使用simulink的TCP/IP Client Receive和TCP/IP Cilent Send,结合工作区的TCP/IP功能实现通信

2. 效果展示

我写的通信代码比较简单,主要是起个引入的作用,这里的实验数据为:

simulink接收python udp数据_数据


这是来自工作区的变量sendData,是1-10的共10个数据。

我要做的是先从工作区发送数据到simulink,simulink接收到之后,发送给工作区。

就是这么一个双向通信的过程,工作区的效果如下:

simulink接收python udp数据_simulink_02


可以看到,我们完成了数据的写入和接收。

3. simulink端的结构和说明

simulink的入门这里就不介绍了,我也刚接触,结构如下,非常简单:

simulink接收python udp数据_tcpip_03


就是一个Receive来接收工作区发来的数据,然后传给Send,Send再发送给工作区。

设置的话,只需要设置IP和端口就行了,IP这里就是回环地址127.0.0.1,端口和工作区的对应就好。

4. 工作区文件说明

代码和注释如下:

%% 服务器代码,工作区这里必须要用两个服务器,因为simulink中的Receive和Send都是作为客户机存在的

%% 建立两个服务器,分别实现 ”向simulink中写入数据“ 和 ”从simulink中获取数据“
serverSend=tcpip('127.0.0.1',8080,'NetworkRole','server');
serverReceive=tcpip('127.0.0.1',8081,'NetworkRole','server');

%% 分别建立两个服务器与simulink的连接
fopen(serverSend);
disp("成功与Simulink中的Receive建立连接");
fopen(serverReceive);
disp("成功与Simulink中的Send建立连接");
disp(" ");

%% 发送和接收sendData,sendData为1-10共10个数字
sendData=linspace(1,10,10);
for i=1:length(sendData)
    % 向simulink中写入第i个数字
    fwrite(serverSend,sendData(i),'double');
    disp("向simulink中写入了数据: "+string(sendData(i)));
    % 从simulink中接收信息并显示,receiveData为接收到的信息
    while(1) 
        if serverReceive.BytesAvailable>0
            break;
        end
    end
    receiveData=fread(serverReceive,serverReceive.BytesAvailable/8,'double');
    disp("从simulink中获取了数据: "+string(receiveData));
end

%% 关闭服务器
fclose(serverSend);
fclose(serverReceive);
disp("关闭服务器");

这里的注释是比较清楚的,就不详细解释啦


6. 运行方法

在同一台电脑上打开两个MATLAB,其中一个打开simulink文件,另一个打开.m文件。

首先运行.m文件,会等待连接:

simulink接收python udp数据_simulink_04


之后运行simulink文件,这时就开始了数据传输,结果如下:

simulink接收python udp数据_tcpip_05


这样其实就完成了双向的数据传输。

7. 问题

由两个问题需要解决,但我没在搞这方面,就留待博友们解决了:

(1)一般来讲只能单个传输数据,虽然有多个数据传输的选项,但是总是出问题,选项在这里:

simulink接收python udp数据_工作区_06


(2)当工作区的TCPIP关闭后,simulink的没有关闭,等待接收数据,直至产生超时报错,如下所示:

simulink接收python udp数据_matlab_07