Warm tip: This article is reproduced from serverfault.com, please click

python-通过 Modbus RTU 与 MultiCONT PRD-28-2 通信的问题

(python - Problem with communication via Modbus RTU with MultiCONT PRD-28-2)

发布于 2020-12-30 15:46:41

我在通过 Modbus RTU 进行通信时遇到问题。首先对不起我的英语 ;):

  1. 我使用 RS485 Pi SN65HVD72 连接 MultiCONT PRD-28-2。我在这个指令中做了一切:https : //www.abelectronics.co.uk/kb/article/1035/raspberry-pi-3-serial-port-usage

config.txt 更改:

  • toverlay = pi3-miniuart-bt
  • enable_uart=1

在此步骤之后,我的 /dev 配置如下所示:

  • lrwxrwxrwx 1 root root 7 gru 30 15:03 serial0 -> ttyAMA0
  • lrwxrwxrwx 1 root root 5 gru 30 15:03 serial1 -> ttyS0
  1. 在 MultiCONT PRD-28-2 中,我将 RS485 选项更改为:
  • 协议:Modbus
  • 奇偶校验:奇数
  • 停止位:1位
  1. Python代码:
    from pymodbus.client.sync import ModbusSerialClient as ModbusClient
    import logging

    FORMAT = ('%(asctime)-15s %(threadName)-15s'
    ' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
    logging.basicConfig(format=FORMAT)
    log = logging.getLogger()
    log.setLevel(logging.DEBUG)
    #multicont = ModbusClient(method='rtu',port='/dev/serial0',stopbits=1,bytsize=8,parity='N',baudrate=9600,timeout=1,strict=False)
    multicont = ModbusClient(method='rtu',port='/dev/serial0',stopbits=1,bytsize=8,parity='O',baudrate=9600,timeout=1,strict=False)
    connection = multicont.connect()
    print(connection)
    value = multicont.read_coils(1,15,unit=1)
    log.debug(value)
  1. 错误信息:

Modbus 错误:[输入/输出] Modbus 错误:[无效消息] 收到不完整的消息,预计至少 2 个字节(收到 0 个)

  1. 日志:

2020-12-30 16:24:51,992 MainThread DEBUG 事务:118
当前事务状态 - IDLE
2020-12-30 16:24:51,992 MainThread DEBUG 事务:123 运行事务 1
2020-12-30:16:992 MainThread事务交易
:230 SEND: 0x1 0x1 0x0 0x1 0x0 0xf 0x2d 0xce
2020-12-30 16:24:51,993 MainThread DEBUG sync :75 New Transaction state 'SENDING'
2020-16,BU991
更改主线程:DEBUG231:2020-12-391交易状态从“发送”到“等待回复”
2020-12-30 16:24:52,995 MainThread DEBUG 事务:253 事务失败。(Modbus错误:[无效消息]接收到的消息不完整,预期至少2个字节(接收到0))
2020-12-30 16:24:52,995 MainThread DEBUG rtu_framer:241帧-[b'']未准备好
2020-12- 30 16:24:52,996 主线程调试
事务:409 获取事务 1
2020-12-30 16:24:52,996 主线程调试事务:204
将事务状态从“处理
回复”更改为“事务完成” 2-2301-1 52,996 MainThread
DEBUG 通信:20 Modbus 错误:[输入/输出] Modbus 错误:[无效消息] 收到不完整的消息,预计至少 2 个字节(收到 0)

Questioner
Tomasz Lipiński
Viewed
0
maxy 2020-12-31 06:54:24

PyModbus 未收到响应。

如果你可以使用示波器,现在就是使用它的时候了。Modbus-RTU 可能会出错的地方太多了。

确保你知道你在做什么用电线,熟悉 RS485 偏置和端接。

可能的原因:

  • 请求发送到错误的串行设备/接口
  • 设备使用不同的波特率或串行设置
  • 设备可以听到你的声音,但配置了不同的从机 ID,所以它没有响应
  • 接线错误,接地问题
  • RS485电气问题,最主要的是主机必须使总线偏置,通常是通过必须焊接/使能的电阻器进行的
  • 正确的电压水平需要总线终端电阻(有时它们已经内置,更多时候你需要启用它们,运气好可能没有)
  • 当从机响应时,主机仍在驱动 RS485 总线。(如果你没有专用的 RS485 驱动程序,总线最终可能会被不可靠的软件计时器断言/取消断言。某些设备允许你配置响应延迟作为解决方法。)
  • 师傅根本不开公车。(工作在 RS232 模式而不是 RS485 模式。)
  • 此外,Linux 可能将 ttyAMA0 配置为用于引导/内核消息的串行控制台。(这不太可能导致你当前的问题,只是需要注意的其他问题。)

最后建议:如果你可以选择使用Modbus-TCP而不是Modbus-RTU,请改为使用这取代了 IP 配置令人头疼的所有 RS485 电气问题,你可以使用非处方药来解决这些问题。