Modbus TCP 传输速度



我正在使用Modbus TCP进行一些测试,并且正在努力理解此处计算的关于每秒扫描的最大寄存器数的理论速度限制。

我的测试是使用 beaglebone 来托管一个 modbus 服务器(从属服务器),我从笔记本电脑轮询它。两台设备都位于私有子网上,它们是该子网上仅有的两台设备。服务器和客户端是用 python 和 pymodbus 实现的。作为测试,我使用块读取轮询 6000 个持有寄存器(48 个块读取中每个 125 个寄存器),耗时 0.17163 秒。这意味着扫描速率约为 35,000 个寄存器/秒。这是一个快速,但它远未达到上面链接的页面中计算的 Base100T 接口的理论限制。

根据该页面,Base100T连接的理论限制应该在3,600,000个寄存器/秒左右。我意识到由于python程序的吞吐量等,会有一些损失,但是它比理论要低得多,以至于我很难理解这些主要损失在哪里。在哪些地方可以限制吞吐量?

以下是我用于此测试的代码列表:

服务器(比格尔骨)

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)

我认为,这里有错误:http://www.modbus.org/faq.php

当它说:

"我可以从Modbus TCP/IP系统获得什么样的性能?

性能取决于网络和硬件。如果你在互联网上运行Modbus TCP/IP,你不会比典型的互联网响应时间更好。但是,当出于调试和维护目的进行通信时,这可能完全足够,并且使您不必在周日早上赶飞机或去现场!

对于具有高速以太网交换机保证性能的高性能内网,情况则完全不同。理论上,Modbus TCP/IP以高达250/(250+70+70)的速度传输数据,在批量传输寄存器时效率约为60%。由于 10BaseT 以太网承载大约 1.25 Mbps 的原始速率,因此理论吞吐量为 1.25M/2 * 60% = 360000 个寄存器/秒,100BaseT 速度提高了 10 倍。

如果我们计算 1.25/2= 625000。 625000*0,06 (60%) = 37500,而不是 360.000。是吗?

最新更新