2017-08-10 814 views
1

我正在嘗試使用Raspberry Pi 3B(運行Ubuntu Mate 16.04操作系統)作爲主設備讀取支持Modbus-RTU協議的電能表的值。Modbus Slave不響應

我用一個RS232/USB適配器和一個RS485/RS232適配器來連接Raspberry Pi上的儀表和USB端口。我曾嘗試modbus_tk 0.5.7MinimalModbus實施下MODBUS-RTU協議的通信。

The meter reading system based on the Modbus-RTU protocol

當我使用modbus_tk 0.5.7和運行下面的代碼:

import sys import serial 

#add logging capability import logging import modbus_tk import modbus_tk.defines as cst import modbus_tk.modbus_rtu as modbus_rtu 

logger = modbus_tk.utils.create_logger("console") 
if __name__ == "__main__": 
    try: 
     #Connect to the slave 
     master = modbus_rtu.RtuMaster(serial.Serial(port="/dev/ttyUSB0", baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0)) 
     master.set_timeout(5.0) #Change the timeout value/Defines a timeout on the MAC layer 
     master.set_verbose(True) #print some more log prints for debug purpose 
     logger.info("connected") 

     logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 49)) 

    except modbus_tk.modbus.ModbusError, e: 
     logger.error("%s- Code=%d" % (e, e.get_exception_code())) 

的參數,如端口,波特率,bytesize,奇偶校驗和停止位被設定正確,但它始終返回此:

2017-08-10 19:24:34,282 INFO modbus_rtu.__init__ MainThread RtuMaster /dev/ttyUSB0 is opened 
2017-08-10 19:24:34,283 INFO rtumaster_example.<module> MainThread connected 
2017-08-10 19:24:34,284 DEBUG modbus.execute MainThread -> 1-3-0-0-0-49-132-30 
2017-08-10 19:24:39,291 DEBUG modbus.execute MainThread <- 
Traceback (most recent call last): 
    File "rtumaster_example.py", line 34, in <module> 
    logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 49)) 
    File "build/bdist.linux-x86_64/egg/modbus_tk/utils.py", line 39, in new 
modbus_tk.exceptions.ModbusInvalidResponseError: Response length is invalid 0 

當我使用MinimalModbus和運行下面的代碼:

#!/usr/bin/env python 
import minimalmodbus 

instrument.serial.port='/dev/ttyUSB0'   # this is the serial port name 
instrument.serial.baudrate = 9600 # Baud 
instrument.serial.bytesize = 8 
instrument.serial.parity = serial.PARITY_NONE 
instrument.serial.stopbits = 1 
instrument.serial.timeout = 0.05 # seconds 

#instrument.address  # this is the slave address number 
instrument.mode = minimalmodbus.MODE_RTU # rtu or ascii mode 
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) # port name, slave address (in decimal) 
energy = instrument.read_register(10, 1) # Registernumber, number of decimals 
print energy 

它總是返回此:

raise IOError('No communication with the instrument (no answer)') 
IOError: No communication with the instrument (no answer) 

然後我用同樣的串行傳輸線到儀表連接和筆記本電腦,並使用由計量器製造商開發的Windows XP上運行的調試工具。調試工具像以前一樣發送相同的請求(1-3-0-0-0-49-132-30)但調試工具可以得到正確的響應。 (也許是因爲它忽略了一些不正確的響應並定期發送請求)並且它可以表示請求消息正確並且串行傳輸的連接沒有問題。

我還使用了CuteCom(一個圖形串行終端)和RS232/USB適配器來確認的USB端口可以正確發送和接收。在兩條RS485線路之間加一個電阻也是沒用的

我試過很多次了,但Raspberry Pi從來沒有得到響應,並且總是返回相同的錯誤信息。我也嘗試在Ubuntu虛擬機上運行相同的代碼,它返回與上面相同的消息,並且從未得到響應。

我是新來的Modbus和串行通信,所以任何幫助,將不勝感激。

回答

1

我已經通過使用更昂貴的USBtoRS485連接器解決了我的問題。 這個問題花了我很多時間來嘗試不同的庫和不同的代碼。 事實證明,我購買的適配器「QinHeng Electronics HL-340 USB串行」在Windows上運行良好,但不適用於Linux。它可以在Linux上實現發送和接收消息,但它不支持Modbus通信。

所以我建議你買更昂貴的連接器,它可以節省你很多時間和精力。

這就是全部,謝謝!