Modbus TCP传输速度

时间:2018-03-05 14:11:15

标签: python modbus-tcp

我正在使用Modbus TCP进行一些测试,我很难理解有关每秒扫描的最大寄存器数的here计算的理论速度限制。

我的测试是使用beaglebone来托管modbus服务器(slave),我从笔记本电脑中查询。两个设备都在私有子网上,它们是该子网上唯一的两个设备。服务器和客户端使用pymodbus在python中实现。作为测试,我使用块读取来轮询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)

1 个答案:

答案 0 :(得分:0)

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

这样说:

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

性能取决于网络和硬件。如果您通过Internet运行Modbus TCP / IP,则不会比典型的Internet响应时间更好。但是,当出于调试和维护目的进行通信时,这可能就足够了,并且可以避免您在星期日的早晨上飞机或去现场!

对于具有保证性能的高速以太网交换机的高性能Intranet,情况完全不同。理论上,当批量传输寄存器时,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。是吗?