rtu Pymodbus读取从设备故障

时间:2019-12-03 00:31:07

标签: modbus rs485 pymodbus

我一直在尝试使用串行端口和RTU Modbus连接到设备。该设备是变频控制器:

enter image description here

通过以下RS485到USB转换器连接到我的笔记本电脑的

https://www.amazon.co.uk/gp/product/B01E8JRL6O/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1

我所连接设备的说明提供了使用Modbus读取数据的用法示例,如下所示:enter image description here

使用以上提供的代码,我尝试使用以下代码执行读取请求:

$PATH

在上面我假设的那一行:

$PATH

表示读取寄存器地址1,读取1个帧,并读取设备ID1。据我所知,此请求对应于上面显示的指令示例。但是,不幸的是,我始终收到错误消息:

  

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

有人知道我为什么收到此错误吗?其次,pymodbus是否即时计算出CRC?还是我应该了解一些如何计算并包括在内?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如评论中所述,您面临一个奇怪的问题。

总结:

-您的PID控制器通过RS485支持Modbus RTU。

-接线正确:USB转换器上的T / R +转到控制器上的T / R(A),而T / R-转到T / R(B)。

-USB转换器似乎不错,并支持Modbus(RS485半双工)。

-您的代码应该可以使用。

-波特率和奇偶校验正确。 (编辑:实际上,这是根据以下评论所引起的问题,通常是在新版本的固件中或由其他人为其操作设备时,手动声称默认的波特率已更改自己的需求。)

要获取更多详细信息,可以按如下所示添加调试/日志记录:

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)


modbus = ModbusClient(method='rtu', port='/dev/tty.usbserial-AQ00BYCR', baudrate=9600, timeout=1)
modbus.connect()
test = modbus.read_holding_registers(1, 1, unit=1)
print(test.registers)

尝试一下,您将使自己确信pymodbus确实在端口上写入了以下字节:

0x01 0x03 0x00 0x01 0x00 0x01 0xD5 0xCA

查看日志(它应该与我的类似,但是您也会从设备中看到答案):

2019-12-03 18:24:45,262 MainThread      DEBUG    transaction    :111      Current transaction state - IDLE
2019-12-03 18:24:45,262 MainThread      DEBUG    transaction    :116      Running transaction 1
2019-12-03 18:24:45,262 MainThread      DEBUG    transaction    :215      SEND: 0x1 0x3 0x0 0x1 0x0 0x1 0xd5 0xca
2019-12-03 18:24:45,262 MainThread      DEBUG    sync           :73       New Transaction state 'SENDING'
2019-12-03 18:24:45,262 MainThread      DEBUG    transaction    :224      Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
2019-12-03 18:24:46,264 MainThread      DEBUG    transaction    :234      Transaction failed. (Modbus Error: [Invalid Message] Incomplete message received, expected at least 2 bytes (0 received)) 
2019-12-03 18:24:46,265 MainThread      DEBUG    rtu_framer     :235      Frame - [] not ready
2019-12-03 18:24:46,265 MainThread      DEBUG    transaction    :390      Getting transaction 1
2019-12-03 18:24:46,265 MainThread      DEBUG    transaction    :189      Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'

在这一点上,我所得到的都是极其牵强的理论(如果您使用的是非常旧版本的pymodbus,则CRC的字节序是错误的,您会看到0xca 0xd5而不是)。