我正在使用Modbus进行一些测试,并且我很难理解计算出的关于每秒扫描的寄存器的最大数量的理论速度限制( 这里 )。
我的测试是使用beaglebone托管modbus服务器(从服务器),我在笔记本电脑上进行了投票。这两个设备都位于私有子网上,它们是该子网上仅有的两个设备。服务器和客户端在python中使用pymodbus实现。作为一项测试,我使用块读取来轮询6000个保存寄存器(48个块读取中每一个有125个寄存器),花费了0.17163秒。这意味着扫描速率约为35,000个寄存器/秒。这是一个快速,但它没有接近理论极限的Base100T接口计算,在上面的网页链接。
根据这一页,Base100T连接的理论极限应该在3,600,000个寄存器/秒左右。我意识到由于python程序等的吞吐量会造成一些损失,但是它比理论要低得多,以至于我很难理解这些主要损失在哪里。在哪里可以限制吞吐量?
下面列出了用于此测试的代码:
服务器(Beaglebone)
from pymodbus.server.sync import StartTcpServer
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
def run_server():
holding_registers = ModbusSequentialDataBlock(0,[i for i in range(15000)])
store = ModbusSlaveContext(hr = holding_registers)
context = ModbusServerContext(slaves=store, single=True)
StartTcpServer(context, address=("localhost", 5020))
if __name__ == "__main__":
run_server()客户机(膝上型电脑)
import time
import math
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
modbus = ModbusClient('192.168.0.10', port=5020)
modbus.connect()
def timeit(f):
def timed(*args, **kw):
ts = time.time()
result = f(*args, **kw)
te = time.time()
print('func: {} took: {} sec'.format(f.__name__, te-ts))
return result
return timed
@timeit
def block_read_arbitrary(bus, n):
last_read = n % 125
if last_read > 0:
nreads = int(math.ceil(n/125))
else:
nreads = int(n/125)
print("Reading {} Blocks...".format(nreads))
data = []
for i in range(nreads):
if i == nreads - 1 and last_read > 0:
rr = bus.read_holding_registers(i*125, last_read)
data.extend(rr.registers)
else:
rr = bus.read_holding_registers(i*125,125)
data.extend(rr.registers)
return data
block_read_arbitrary(bus, 6000)发布于 2020-04-17 10:14:27
我想,这里有错误:http://www.modbus.org/faq.php
有人这样说:
“从Modbus TCP/IP系统中可以期望获得什么样的性能?”
性能取决于网络和硬件。如果您在Internet上运行Modbus TCP/IP,您将不会比典型的Internet响应时间更好。但是,在为调试和维护目的进行通信时,这可能是完全足够的,并且可以避免您在周日上午赶飞机或前往现场!
对于具有高速以太网交换机保证性能的高性能intranet,情况完全不同.理论上,Modbus TCP/IP以高达250个/(250+70+70)的速度传输数据,当大量传输寄存器时效率约为60 %。由于10 10BaseT以太网承载1.25M/2 * 60% = 360000寄存器每秒1.25M/2*60%的速率,100 10BaseT速率是10倍。
如果我们计算1.25/2= 625000。625000*0,06 (60%) = 37500,而不是360.000。是吗?
https://stackoverflow.com/questions/49112358
复制相似问题