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\n2.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 个字节。您可能需要将其设置为客户端中的数据大小。