我使用pymodbus創建Modbus RTU服務器。Pymodbus 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)
我的客戶端連接correclty。服務器打印出請求的十六進制值。
我現在想要做的是處理不同的請求。
例如:如果客戶想要從保持寄存器中讀取寄存器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
如二,CO等我用MyData(...)
代替ModbusSequentialDataBlock在ModbusSlaveContext
。
編輯
原來,這是在pymodbus的錯誤。使用異步服務器時,不能使用RTU成幀器。 我開了一個bug,它似乎是固定的: https://github.com/bashwork/pymodbus/issues/70#event-213935076
感謝您的竅門。看我的編輯。這是使用RTU和異步服務器時的一個錯誤。 – 0xAffe 2015-02-04 07:32:02