Pymodbus RTU服务器处理请求

2024-09-24 00:29:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我用pymodbus来创建Modbus RTU服务器。在

我根据文档中的示例以非常基本的方式创建了服务器。在

store = ModbusSlaveContext(
    di = ModbusSequentialDataBlock(0, [0x0]*10000),
    co = ModbusSequentialDataBlock(0, [0x0]*10000),
    hr = ModbusSequentialDataBlock(0, [0x0]*10000),
    ir = ModbusSequentialDataBlock(0, [0x0]*10000))
context = ModbusServerContext(slaves=store, single=True)

StartSerialServer(context, port='/dev/ttyUSB0', framer=ModbusRtuFramer)

我的客户连接正确。服务器打印出请求的十六进制值。在

我现在要做的是处理不同的请求。
例如:如果一个客户机想从保持寄存器中读取寄存器4128,我想将一个值作为响应发送回来。在

我在文档中找不到任何有用的例子(或者我只是不明白?)
我已经尝试将ModbusSequentialDataBlock子类化并重写get/setValue方法,但没有成功。在

这是我的数据存储的代码。它非常简单,我希望在我的get/setValues方法中看到打印。但我什么也没看到。在

^{pr2}$

作为di、co等,我在ModbusSlaveContext中使用了MyData(...)而不是modbusequentialdatablock。在

编辑

原来是Modbus。使用异步服务器时,不能使用RTU框架。 我打开了一个bug,它似乎被修复了: https://github.com/bashwork/pymodbus/issues/70#event-213935076


Tags: 方法store文档服务器示例getcontext寄存器
1条回答
网友
1楼 · 发布于 2024-09-24 00:29:34

我做的事情有点不同…ModbusTCP而不是ModbusRTU…但是我已经找到了如何让它返回不同的值,我想这正是你想要的(getValues/setValues)。干得好。。。在

from pymodbus.server.async import StartTcpServer
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
import sys
import logging
from twisted.internet.task import LoopingCall

logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)


def getModbusSlaveContext():
    hr_block = ModbusSequentialDataBlock(0, [9999 for x in range(10000)])
    return ModbusSlaveContext(hr=hr_block)

def incdecvalues(valuelist):
    lengthOfList = len(valuelist)
    for counter in range(lengthOfList):
        if counter % 2:
            valuelist[counter]+=1
        #else:
        #    valuelist[counter]+=-1

def updatevalues(a):
    context = a[0]
    register = 3
    slave_id = 0x01
    address = 0x00
    values = context[slave_id].getValues(register, address, count=10)
    incdecvalues(values)
    context[slave_id].setValues(register, address, values)

slaves = {
    0x01 : getModbusSlaveContext()
    }

context = ModbusServerContext(slaves=slaves, single=False)

time = 2
loop = LoopingCall(f=updatevalues, a=(context,))
loop.start(time, now=True)
StartTcpServer(context, identity=None, address=('localhost', 9091))

所有的保持寄存器(从3001开始,有10000个)被设置为9999的初始值。从机ID为1,前十个寄存器每隔2秒递增1。在

希望对你有帮助。在

不幸的是,当我试图将值设置为负整数时,pymodbus抛出了一个错误。这就是我被难住了。。。在

https://stackoverflow.com/questions/28244730/pymodbus-setvalues-how-to-resolve-error-integer-out-of-range-for-h-format-co

相关问题 更多 >