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. 效果展示
我写的通信代码比较简单,主要是起个引入的作用,这里的实验数据为:
这是来自工作区的变量sendData,是1-10的共10个数据。
我要做的是先从工作区发送数据到simulink,simulink接收到之后,发送给工作区。
就是这么一个双向通信的过程,工作区的效果如下:
可以看到,我们完成了数据的写入和接收。
3. simulink端的结构和说明
simulink的入门这里就不介绍了,我也刚接触,结构如下,非常简单:
就是一个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文件,这时就开始了数据传输,结果如下:
这样其实就完成了双向的数据传输。
7. 问题
由两个问题需要解决,但我没在搞这方面,就留待博友们解决了:
(1)一般来讲只能单个传输数据,虽然有多个数据传输的选项,但是总是出问题,选项在这里:
(2)当工作区的TCPIP关闭后,simulink的没有关闭,等待接收数据,直至产生超时报错,如下所示: