0

我有一个问题,我通过 Modbus TCP 进行通信测试,每个请求大约需要 200 毫秒,是否可以改善这些时间?

这是我用于测试的代码:

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import time
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

t1= time.time()
client = ModbusClient(method='rtu', port='COM7', baudrate=9600, timeout=1, 
parity='N')
response = client.read_holding_registers(address=13313, count=12, unit=0x02)
respuesta=response.registers[0:12]
client.close()
print(time.time()-t1)
4

2 回答 2

3

根据您的通信设置,每个传输的字符/字节应该是:

1 start bit
8 data bit
0 parity bits
2 stop bits (this should be 2 -> spec says 11 bits/char, but I have seen implementations that use 8N1)
-------------------------------
total: 11 bits/byte

1) 请求

address:                1 byte
function code:          1 byte
starting address:       2 bytes
quantity of registers:  2 bytes
crc:                    2 bytes
-------------------------------
total: 8 bytes

Min time: 1s/9600bits * (8 bytes) * (11 bits/byte) = 9.2 ms

2)帧之间的静默间隔

Min time: 1s/9600bits * (3.5 bytes) * (11 bits/byte) = 4.0 ms

3) 回应

address:          1 byte
function code:    1 byte
byte count:       2 bytes
register values:  24 bytes (2*12)
crc:              2 bytes
-------------------------------
total: 30 bytes

Min Time = 1s/9600bits * (30 bytes) * (11 bits/byte) = 34.3 ms

因此,理论上的最小往返时间为:9.2 + 4.0 + 34.3 = 47.5 ms

所以看起来有潜在的改进空间,但很难确切知道你的延迟在哪里。

除了其他人的建议外,我通常会在 comm 线路上放置一个范围,以查看 tx 和 rx 帧是否接近理论时间。您还应该能够通过查看 tx 结束和 rx 帧开始之间的时间来判断服务器响应需要多长时间。如果您可以在开始发送请求之前以某种方式触发范围,您还可以测量客户端生成并开始传输请求帧所需的时间。

于 2018-09-12T12:09:00.300 回答
1

我用lib得到了非常快的结果。最小Modbus API。适用于 Python 3。也许您可以尝试一下并进行比较?minimalmodbus

import minimalmodbus
import serial
import struct
import time

i = minimalmodbus.Instrument(port='COM7', slaveaddress=1, mode='rtu')
i.serial.baudrate = 19200
i.serial.bytesize = 8
i.serial.parity = serial.PARITY_NONE
i.serial.stopbits = 1
i.serial.timeout = 1
i.debug = False

start = time.time()
var1 = i.read_registers(registeraddress=13313, numberOfRegisters=2, functioncode=4)
var1_ = [var1[0], var1[1]]
var1_pack = struct.pack('HH', var1_[0], var1_[1])
var1_unpack = struct.unpack('f', var1_pack)[0]
end = time.time()

print('Result: {}. Total time: {}'.format(var1_unpack, (end - start)))

除此之外,最大化您的波特率将使速度最大化,但每次轮询 200 毫秒非常慢;我不认为单独的波特率可以解决这个问题。也可能有其他因素在起作用;您正在使用什么转换器,什么电缆,电缆有多长等。

于 2018-09-11T21:04:12.177 回答