【发布时间】:2015-01-02 22:29:52
【问题描述】:
我正在使用 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 方法中看到打印。但我什么都没看到。
class MyData(ModbusSequentialDataBlock):
def __init__(self, address, values):
self.address = address
self.values = values
def validate(self, address, count=1):
print "validate"
def getValues(self, address, count=1):
print "getValues"
print address
def setValues(self, address, count=1):
print "setValues"
print address
作为 di、co 等,我在 ModbusSlaveContext 中使用了 MyData(...) 而不是 ModbusSequentialDataBlock。
编辑
事实证明,这是 pymodbus 中的一个错误。使用异步服务器时,您不能使用 RTU 成帧器。 我打开了一个错误,它似乎已修复: https://github.com/bashwork/pymodbus/issues/70#event-213935076
【问题讨论】: