首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Modbus从没有响应

Modbus从没有响应
EN

Stack Overflow用户
提问于 2017-08-10 17:06:52
回答 4查看 2.9K关注 0票数 4

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

我使用Pi 232/ USB适配器和Pi 485/Pi 232适配器连接仪表和Raspberry Pi上的USB端口。我曾尝试用modbus_tk 0.5.7MinimalModbus来实现Modbus-RTU协议下的通信。

当我使用modbus_tk 0.5.7并运行以下代码时:

代码语言:javascript
运行
复制
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()))

正确设置了端口、波德率、字节数、奇偶校验和塞位等参数,但它总是返回以下内容:

代码语言:javascript
运行
复制
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并运行以下代码时:

代码语言:javascript
运行
复制
#!/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

它总是返回以下内容:

代码语言:javascript
运行
复制
    raise IOError('No communication with the instrument (no answer)')
IOError: No communication with the instrument (no answer)

然后,我使用相同的串行传输线连接仪表和笔记本电脑,并使用一个运行在Windows上的调试工具,该工具是由仪表制造商开发的。调试工具发送的请求(1-3-0-0-0-49-132-30)与以前的相同,但是调试工具可以得到正确的响应。(可能是因为它忽略了一些不正确的响应,并且经常发送请求)和,它可以表示请求消息是正确的,串行传输的连接没有问题。

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

我已经尝试过很多次了,但是Raspberry Pi从来没有得到响应,并且总是返回相同的错误信息。我还尝试在Ubuntu虚拟机上运行相同的代码,它返回与上面相同的消息,永远不会得到响应。

我是新的Modbus和串行通信,所以任何帮助将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2017-08-12 06:28:04

我通过使用更昂贵的USBtoRS485连接器解决了我的问题。这个问题花了我很多时间尝试不同的库和不同的代码。事实证明,我购买的适配器"QinHeng电子HL-340 usb“在windows上工作得很好,但在Linux上却不起作用。它可以在Linux上实现消息的发送和接收,但不能支持Modbus通信。

所以我建议你买一个更贵的连接器,这样可以节省你很多的时间和精力。

仅此而已,谢谢!

票数 2
EN

Stack Overflow用户

发布于 2018-09-06 16:23:57

我也有同样的问题。在使用mbpoll工具后,我意识到这种奇偶性是错误的。刚刚更新到parity.EVEN,现在可以了。

票数 1
EN

Stack Overflow用户

发布于 2018-11-23 17:50:38

  • 尝试将电缆的if 232端连接到带有串口的PC (如果您有ofc的话),以确保usb/if 232工作。
  • 如果你有示波器(如like),你可以观察到RS485线(实际上并不难)了解问题在哪里。
  • 我碰巧发现串行参数(如波特率)可以为Windows配置两个位置-当您打开端口和在驱动程序配置中。
  • 尝试平衡所有设备的潜力。我知道rs485应该是免疫的,但rs232不是
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45619692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档