我有一个问题,我用Modbus TCP做了一个通信测试,每个请求大约需要200ms,有没有可能改善这些时间?
这是我用于测试的代码:
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)发布于 2018-09-12 20:09:00
根据您的通信设置,每个传输的字符/字节应为:
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/byte1)请求
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 ms2)帧之间的静默间隔
Min time: 1s/9600bits * (3.5 bytes) * (11 bits/byte) = 4.0 ms3)响应
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.5ms
因此,看起来有潜在的改进空间,但很难确切地知道您的延迟在哪里。
除了其他人的建议之外,我通常会在通信线上放置一个范围,看看tx和rx帧是否接近理论时间。您还应该能够通过查看tx结束和rx帧开始之间的时间来告知服务器需要多长时间才能做出响应。如果您可以在开始发送请求之前以某种方式触发作用域,您还可以测量客户端生成和开始传输请求帧所需的时间。
发布于 2018-09-12 05:04:12
我用minimalmodbus库得到的结果非常快。MinimalModbus API。适用于Python 3。也许你可以试一试并比较一下?
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)))除此之外,最大限度地提高你的波特率将使速度最大化,但每次轮询200ms是相当慢的;我不认为波特率本身就能解决这个问题。还可能有其他因素在起作用;您使用的是什么转换器、什么布线、布线的长度等。
https://stackoverflow.com/questions/52283874
复制相似问题