在 Raspberry Pi 3B+ 上使用minimalmodbus python 库和 Waveshare RS485 CAN HAT (B) 时出现 Modbus 校验和错误

问题描述 投票:0回答:1

我正在尝试使用minimalmodbus库从MP Filtri公司称为ICM的工业传感器读取寄存器值。我正在使用连接在 Raspberry Pi 3B+ 顶部的 Waveshare RS485 CAN HAT (B)。

当我尝试读取寄存器时,我收到如下校验和错误响应(用户名已编辑,因为它包含我的姓氏): Checksum Error

我使用外部 24VDC 电源为 Waveshare Hat(为 Pi 供电)以及 MP Filtri ICM 传感器供电。传感器的A、B线正确连接到Waveshare Hat上“RS485_0”的A、B端子。传感器和 Pi/hat 共用同一电源并且接地。

我已经配置了 Waveshare 帽子,如“安装库”和“驱动程序配置”部分下的 Waveshare wiki 中所示。按照描述在 /boot/config.txt 中配置驱动程序后,我可以看到设备已作为 ttySC0 和 ttySC1 添加到 /dev 中。另外,我运行了建议的命令

dmesg | grep -i '\(can\|spi\)'
并得到以下输出: GREP SPI **这一点值得注意,因为您将在下面的代码中看到,我可以返回任何内容的唯一波特率是 921600,如 ttySC0 和 ttySC1 的屏幕截图所示

ICM 传感器手册的 Modbus 部分显示以下设置信息:

3.1 Modbus 设置

协议类型 RTU(非 ASCII)
数据位 8
停止位 1
需要奇偶校验,偶数
波特率自动感应1200-115200
发送 RS485 信号
节点地址204(或用户设置)
3.2 通讯检查
您应该能够从寄存器 0(从 Modbus 节点地址 204)读取产品 ID 代码。产品 ID 代码的值为 54237(十进制)或 0xD3DD(十六进制)。

在编写Python脚本以从传感器(产品ID)读取寄存器0时,我使用了minimalmodbus文档中的基本代码。我还使用了Modbus从站地址4,这是在设备中设置的。上面的文档页面指出地址 204 可以用作永久地址,但也可以在它将响应的设备中设置一个地址。我已经尝试了这两种方法,得到了相同的结果,但如果以后有更多设备添加到总线,我将使用设备中设置的辅助地址,即 4。我在文件中使用的代码名为basic.py如下:

#!/usr/bin/env python3

import minimalmodbus

instrument = minimalmodbus.Instrument('/dev/ttySC0', 4, debug = True)  # port name, slave address (in decimal)

instrument.serial.baudrate = 921600             # Baud
instrument.serial.bytesize = 8                  # bytesize
instrument.serial.parity   = minimalmodbus.serial.PARITY_EVEN
instrument.serial.stopbits = 1                  # stop bits
instrument.serial.timeout  = 0.5                # seconds
instrument.mode = minimalmodbus.MODE_RTU        # rtu or ascii mode
instrument.clear_buffers_before_each_transaction = True

## Read Product ID From Register 0 ##
prodid = instrument.read_register(0, 0)  # Registernumber, number of decimals
print(prodid)

我收到的响应是一个校验和错误,如上所示,也同样在这里: Checksum Error

为什么我会收到此校验和错误消息以及如何消除此错误?另外,为什么唯一有效的波特率是 921600?是因为 ttySC0 的基本波特率显示为这个速率吗?

raspberry-pi modbus minimalmodbus
1个回答
0
投票

在尝试了许多不同的选项、波特率、编码以及与Waveshare客户服务部门的多次交流之后,我终于对我的问题得出了一个非常简单的解决方案。

Waveshare RS485 CAN HAT (B) 在两个 RS485 通道上都有跳线,默认启用 120 欧姆电阻。 Waveshare 的客户服务建议尝试不启用电阻器,因为 RS-485 通信并不总是需要它们(根据他们的说法)。当我移除跳线时,程序就会做出响应,并且我能够从传感器读取寄存器。

© www.soinside.com 2019 - 2024. All rights reserved.