我正在嘗試使用Raspberry Pi 3B(運行Ubuntu Mate 16.04操作系統)作爲主設備讀取支持Modbus-RTU協議的電能表的值。Modbus Slave不響應
我用一個RS232/USB適配器和一個RS485/RS232適配器來連接Raspberry Pi上的儀表和USB端口。我曾嘗試modbus_tk 0.5.7和MinimalModbus實施下MODBUS-RTU協議的通信。
當我使用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和串行通信,所以任何幫助,將不勝感激。