0

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

在此处输入图像描述

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

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

我所连接的设备的说明提供了一个使用 Modbus 读取数据的使用示例,如下图所示:在此处输入图像描述

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

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
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)

我在上面假设的地方是:

test = modbus.read_holding_registers(1, 1, unit=1)

表示读取寄存器地址 1,读取 1 个帧,读取设备 ID 1。据我了解,这个请求对应于上面显示的指令示例。但是,不幸的是,我一直收到错误消息:

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

有谁知道我为什么会收到这个错误?其次,CRC 是由 pymodbus 即时计算的吗?或者我应该如何计算并包含它?

任何帮助深表感谢!

4

1 回答 1

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相反的)。

于 2019-12-03T18:15:41.920 回答