测试请求Modbus TCP

问题描述 投票:0回答:2

我有一个问题,我通过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)
python modbus pymodbus
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

所以看起来似乎还有改进的余地,但很难确切知道你的延误在哪里。

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


1
投票

我用minimalmodbus lib得到了非常快的结果。 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是相当慢的;我不认为波士顿会解决这个问题。还可能有其他因素在起作用;你正在使用什么转换器,布线,布线多长时间等等。

© www.soinside.com 2019 - 2024. All rights reserved.