TCP/IP 在 SIMULINK 和 PYTHON 之间
TCP/IP between SIMULINK and PYTHON
我正在尝试在 SIMULINK(客户端)和 PYTHON(服务器)之间建立 TCP/IP 连接。我尝试在循环中发送变量的值。但我在 SIMULINK 中收到的值是一些随机值(如 2.5e-09 或其他),与我发送的值无关。我试过更改 SIMULINK 上的数据类型 side.But 运气不好。
以下是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模块和模块参数设置:
有人可以帮忙吗?
Python 服务器没有发送客户端所期望的双字节字节序。相反,它发送一系列以新行结尾的字符串:1.1\n
、2.1\n
、...、50.1\n
.
您可以使用 struct
模块将浮点数格式化为 big endian double,以便通过连接进行传输。
import struct
for i in range(50):
msg1 = struct.pack('>d', 1.1+i)
clientsocket.send(msg1)
不需要对数据进行 UTF8 编码,因为它是应该发送的二进制值。
struct.pack()
采用格式字符串和要打包的值。在这种情况下,格式字符串 >d
表示大端双精度。返回值是表示打包数据的字节对象。例如浮点数 20.1 的打包值为:
>>> struct.pack('>d', 20.1)
b'@4\x19\x99\x99\x99\x99\x9a'
如您所见,双精度数的大小为 8 个字节。您可能需要将其设置为客户端中的数据大小。
我正在尝试在 SIMULINK(客户端)和 PYTHON(服务器)之间建立 TCP/IP 连接。我尝试在循环中发送变量的值。但我在 SIMULINK 中收到的值是一些随机值(如 2.5e-09 或其他),与我发送的值无关。我试过更改 SIMULINK 上的数据类型 side.But 运气不好。
以下是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模块和模块参数设置:
有人可以帮忙吗?
Python 服务器没有发送客户端所期望的双字节字节序。相反,它发送一系列以新行结尾的字符串:1.1\n
、2.1\n
、...、50.1\n
.
您可以使用 struct
模块将浮点数格式化为 big endian double,以便通过连接进行传输。
import struct
for i in range(50):
msg1 = struct.pack('>d', 1.1+i)
clientsocket.send(msg1)
不需要对数据进行 UTF8 编码,因为它是应该发送的二进制值。
struct.pack()
采用格式字符串和要打包的值。在这种情况下,格式字符串 >d
表示大端双精度。返回值是表示打包数据的字节对象。例如浮点数 20.1 的打包值为:
>>> struct.pack('>d', 20.1)
b'@4\x19\x99\x99\x99\x99\x9a'
如您所见,双精度数的大小为 8 个字节。您可能需要将其设置为客户端中的数据大小。