Modbus Slave没有回应

时间:2017-08-10 17:06:53

标签: python ubuntu raspberry-pi serial-port modbus

我正在尝试使用Raspberry Pi 3B(运行Ubuntu Mate 16.04操作系统)作为Master来读取支持Modbus-RTU协议的电能表的值。

我使用RS232 / USB适配器和RS485 / RS232适配器连接电表和Raspberry Pi上的USB端口。我已经尝试了 modbus_tk 0.5.7 MinimalModbus 来实现 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()))

端口,波特率,字节大小,奇偶校验和停止位等参数设置正确,但始终返回:

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上运行的调试工具,该工具由仪表制造商开发。调试工具发送与之前相同的Request (1-3-0-0-0-49-132-30) ,但调试工具可以获得正确的响应。 (也许是因为它忽略了一些不正确的响应并定期继续发送请求)而它可以表示请求消息是正确的并且串行传输的连接没有问题。

我还使用了CuteCom(一个图形串行终端)和RS232 / USB适配器来确认 USB端口可以正确发送和接收。在两个RS485之间添加一个电阻也没用线

我已多次尝试过,但Raspberry Pi从未获得响应,并始终返回相同的错误信息。我还尝试在Ubuntu虚拟机上运行相同的代码,它返回与上面相同的消息,但从未得到响应。

我是Modbus和串口通讯的新手,所以任何帮助都会受到赞赏。

4 个答案:

答案 0 :(得分:1)

我通过使用更昂贵的USBtoRS485连接器解决了我的问题。 这个问题花了我很多时间来尝试不同的库和不同的代码。 事实证明我买的适配器“QinHeng Electronics HL-340 usb-serial”在Windows上运行良好但不适用于Linux。它可以在Linux上实现发送和接收消息,但它不能支持Modbus通信。

所以我建议你买一个更昂贵的连接器,它可以节省你的大量时间和精力。

就是这样,谢谢!

答案 1 :(得分:1)

我遇到了同样的问题。使用mbpoll工具后,我意识到奇偶校验是错误的。刚刚更新为平价。现在就可以了。

答案 2 :(得分:0)

  • 尝试通过串行端口(如果有)将电缆的RS232端连接到PC,以确保usb / rs232正常工作
  • 如果您有示波器(例如Fluke),则可以观察RS485线(实际上并不难),以了解问题出在哪里。
  • 我偶然发现串行参数(如波特率)可以在Windows的2个地方进行配置-打开端口并进行驱动程序配置时。
  • 尝试均衡所有设备的电势。我知道rs485应该不受它的影响,但rs232不能免疫

答案 3 :(得分:0)

您的Pi超时时间太短,请尝试将其增加到100毫秒,它应该可以工作。

编辑:按照以下评论的要求,我将提供一些有关建议的更多详细信息。根据问题的详细信息以及后续的答案和评论,硬件设置似乎是正确的。我不时看到这种情况的发生:当您在一侧设置非常短的超时时,链接突然停止工作(这也很有意义,当您在确定的时间范围内未收到答案时,也会发生超时错误超时参数),并在您再次增加该参数后立即恢复活动状态。我还注意到这种效果取决于硬件,某些设备的应答速度比其他设备快