首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试请求Modbus TCP

测试请求Modbus TCP
EN

Stack Overflow用户
提问于 2018-09-12 04:38:40
回答 2查看 525关注 0票数 0

我有一个问题,我用Modbus TCP做了一个通信测试,每个请求大约需要200ms,有没有可能改善这些时间?

这是我用于测试的代码:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2018-09-12 20:09:00

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

代码语言:javascript
复制
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)请求

代码语言:javascript
复制
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)帧之间的静默间隔

代码语言:javascript
复制
Min time: 1s/9600bits * (3.5 bytes) * (11 bits/byte) = 4.0 ms

3)响应

代码语言:javascript
复制
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帧开始之间的时间来告知服务器需要多长时间才能做出响应。如果您可以在开始发送请求之前以某种方式触发作用域,您还可以测量客户端生成和开始传输请求帧所需的时间。

票数 3
EN

Stack Overflow用户

发布于 2018-09-12 05:04:12

我用minimalmodbus库得到的结果非常快。MinimalModbus API。适用于Python 3。也许你可以试一试并比较一下?

代码语言:javascript
复制
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是相当慢的;我不认为波特率本身就能解决这个问题。还可能有其他因素在起作用;您使用的是什么转换器、什么布线、布线的长度等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52283874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档