2017-03-01 76 views
0

我在覆盆子pi上使用pymodbus作爲客戶端來保存傳感器的值,並通過TCP將它們提供給modbus master。Pymodbus客戶端setValues限制爲100個寄存器

所有的作品都很棒。我正在使用以下設置數據存儲。 values = context [slave_id] .getValues(register,address,count = 350) 問題是當我嘗試設置值不能超過[98]列表值。

如果我設置了count = 5,我可以從[0]到[4]設置值,但是當我按照預期設置[5]時會引發錯誤。

隨着計數= 350我得到和錯誤,當我嘗試和設置值[99]。

這表明它們是100個寄存器的限制。這個限制可以延長嗎?

看着store.py我看不到任何限制,所以我有點困惑,在極限設置。

您的幫助將不勝感激。

乾杯

回答

1

有一個在該協議能夠處理寄存器的金額的Modbus規範的限制。我在一次通話中親自讀/寫的數據最多的是120個寄存器,但這裏是對control.com的解釋:

「要讀取的寄存器的數量,與預期響應中的所有其他文件組合,不得超過Modbus消息的允許長度:256字節。「

到功能3請求的Modbus/RTU響應包括

節點地址:1個字節 功能代碼:1個字節 字節數:1個字節

寄存器數據:N寄存器*每個

2個字節

CRC:2個字節

因此,可以在一個單一的Modbus/RTU查詢中讀取的寄存器的最大數量是125。

如果使用Modbus/TCP,則將6位標頭和1字節單元標識符的設備地址和CRC(總共3個字節)進行交易;在單個響應寄存器的最大計數下降到123

Maximum amount of holding registers per request

+0

嗨。謝謝您的回答。這是pyModbus的一個非主從實現。當我從主人那裏讀取寄存器時,如同你所說的那樣,我讀了100個寄存器的數據塊。 – Winetec

+0

問題是當你在pyModbus中創建寄存器的數據存儲區時 – Winetec

+0

不會讓你爲從屬寄存器添加超過前98個寄存器的值。 – Winetec

0

我已經回答了我的問題。如果您將PyModbus設置爲從屬設備,並且想要超過100個可用寄存器,則需要在Python腳本中編輯以下代碼行以反映要更新的寄存器的數量。

這是您在python腳本中初始化數據存儲的地方。

store = ModbusSlaveContext(
    di = ModbusSequentialDataBlock(0, [1]*100), 
    co = ModbusSequentialDataBlock(0, [2]*100), 
    hr = ModbusSequentialDataBlock(0, [3]*100), 
    ir = ModbusSequentialDataBlock(0, [4]*100)) 
context = ModbusServerContext(slaves=store, single=True) 

將值100更改爲要更新的寄存器的數量。

謝謝StackOverflow和貢獻者。你是我尋找問題答案的主要途徑。偉大的網站。乾杯