2014-11-06 184 views
0

我使用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

回答

1

我正在做的事情有點不同...... 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和所有其他寄存器由1每2遞增前十個寄存器的秒數。

希望能幫到你。

不幸的是,當我嘗試將值設置爲負整數時,pymodbus拋出錯誤。這就是我難倒...

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

+0

感謝您的竅門。看我的編輯。這是使用RTU和異步服務器時的一個錯誤。 – 0xAffe 2015-02-04 07:32:02

相關問題