SIMULINK和PYTHON之间的TCP / IP

时间:2018-01-06 10:48:40

标签: python simulink tcp-ip

我正在尝试在SIMULINK(客户端)和PYTHON(服务器)之间建立TCP / IP连接。我尝试在循环中发送变量的值。但是我在SIMULINK中收到的值是一些随机值(如2.5e-09或其他东西),它与我发送的值无关。我试过改变SIMULINK方面的数据类型。但没有运气。

以下是PYTHON中的代码:

import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

serversocket.bind(('localhost',30001))
serversocket.listen(5)
(clientsocket, address) = serversocket.accept()

for i in range(0,50):
    msg1='%0.1f\n' %(float(1.1+i))
    clientsocket.send(msg1.encode('utf-8'))

clientsocket.close()

以下是我的simulink块和块参数设置:

enter image description here

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

Python服务器没有发送一个看起来客户期待的大端双精度数。相反,它发送一系列新行终止字符串:1.1\n2.1\n,...,50.1\n

您可以使用struct模块将float格式化为big endian double,以便通过连接进行传输。

import struct

for i in range(50):
    msg1 = struct.pack('>d', 1.1+i)
    clientsocket.send(msg1)

不需要对数据进行UTF8编码,因为它是应该发送的二进制值。

struct.pack()采用格式字符串和值来打包。在这种情况下,格式字符串>d表示大端双精度。返回的值是表示打包数据的bytes对象。例如,浮点数20.1的打包值为:

>>> struct.pack('>d', 20.1)
b'@4\x19\x99\x99\x99\x99\x9a'

如您所见,double的大小为8个字节。您可能需要将其设置为客户端中的数据大小。