Matlab/Simulink 环境下通过TCP通讯传出仿真数据
最近工作中碰到一个场景需要将Simulink仿真的数据实时传出,供其他软件使用,在网上没找到比较好的方法,所以打算使用simulink中自带的TCP通讯模块来实现此功能,在本机试验了一下,基本可以满足需求,实现方法如下。
1. TCP通讯模块
1.1 TCP server模块

输入为通讯使能信号,Status为连接状态信号,连接成功后此信号为1
1.2 TCP send模块
发送数据需要使用TCP send模块


Enable:使能信号,连接server模块的status信号即可
Data:需要传输的数据,官方文档中说明只能传输uint8类型的数据
Length:传输数据的长度,即uint8数据的个数
status:传输出去的uint8数据的数量
Send using:传输的地址,单机测试使用回环地址127.0.0.1,端口号官方说明1-1023、5500-5560是预留给matlab的端口
采样时间:没仔细研究,应该会影响信号的发送周期
1.3 TCP client模块

通讯地址能跟server匹配上即可
1.4 TCP receive模块


Receive Width:接受的uint8数据的个数
2 数据处理
2.1 Data Pack
由于TCP send模块只能接受uint8数据,而simulink的常规计算数据是double,所以需要进行信号类型的转换,这里使用Byte pack模块

这个模块可以将多个数据转换为uint8向量
第一个参数要求注明各个输入参数的类型,此处均为double。
注意:1个double=8个字节=8个uint8,所以后面填写send模块的Length时注意不要填错
Byte alignment:字节对齐,例如打包两个数据a、b,a的类型为uint8,b的类型为double,则当此值设置为1时,一共输出1+8=9个uint8数据;当此值设置为2时,会在a数据转换完的数据后补0,使输出数据变成2+8=10个uint8数据
2.2 Data Unpack
接收端的数据解包使用Data Unpack模块


这个模块可以将数据解包为目标类型的变量
第一个输入参数是希望解包得到的数据类型
第二个输入参数是输出的数据的维度大小
3 测试验证
3.1 发送端模型
传输三个数据,2个常数,1个ramp变量

3.2 接收端模型
可以正常收到发送的三个数

4 发送字符串数据
除了发送数据之外,我还希望在各个数据之前能加上一个字符串用以表示信号的名称。传递字符串数据需要将字符串变为uint8类型的数据,需要利用simulink中的string-ASCII模块,先将string转化为ASCII码,再转换为uint8数据,接收端则需要添加一个ASCII-string模块,做法如下:

将以上数据加入send模块的发送数据包中,搭建模块如下:


通过试验发现该方案可行,但是这个过程需要计算每个字符串的长度,然后需要设置pack和unpack的参数以及send和receive的长度,需要修改的东西太多,不太优雅,后续可以想办法再优化优化。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)