无法使用 minimalmodbus 与 Modbus 设备通信

Can't communicate with Modbus device using minimalmodbus

我无法与使用 minimalmodbus、Modbus RTU 的设备通信。

我已经通过 USB 到 RS-485 适配器(FTDI 芯片)A 到 A 和 B 到 B 将设备连接到 raspberry pi。

设备配置如下:

Modbus 保持寄存器(为了本示例的目的进行了简化)

我尝试过使用原始串行命令与设备通信,也尝试过使用 pymodbus,现在我最近尝试使用最小 modbus。请在下面查看我使用 minimalmodbus 的代码尝试。

此外,我知道串口适配器可以正常工作,因为我将它用于其他各种串口传感器。唯一不同的是我现在正在使用 modbus。

import minimalmodbus

instrument = minimalmodbus.Instrument('/dev/tty/USB1',1)

instrument.debug = True
instrument.handle_local_echo = True # The serial device echos back every write, hence this
instrument.serial.baudrate = 9600
instrument.serial.timeout = 1

value = instrument.read_register(0,2)

print value

我希望即使出现错误或不正确也会收到某种回复,但我什么也没收到。 minimalmodbus 的调试输出显示 "IOError: No communication with the instrument(no answer)"

我的代码与传感器要求有明显的错误吗?我与制造商确认了我的接线,并且是正确的。

我没有从你这边看出明显的错误。这相当困难,因为您正在使用硬件。 我会提供一些我的代码。我将它用于原型,这是一个带有 USB 到 RS485 转换器的 Raspberry Pi 3B (This one)。

from modbus import minimalmodbus
import serial
import time
from mqtt.client import Client as mqtt_client

class Slave:

    def __init__(self, serial_port: str = '/dev/ttyUSB0', slave_id: int = 5,
                 baudrate: int = 38400, byte_size: int = 8,
                 parity: str = serial.PARITY_NONE, stopbits: int = 1,
                 timeout: float = 1.0):
        self.slave = minimalmodbus.Instrument(serial_port, slave_id)
        self.slave.serial.baudrate = baudrate
        self.slave.serial.bytesize = byte_size
        self.slave.serial.parity = parity
        self.slave.serial.stopbits = stopbits
        self.slave.serial.timeout = timeout
        self.registers = ["header", "zero", "life_beat",
                          "test_int", "test_float"]
        self.output = mqtt_client()
...

当我读取寄存器时,我使用了例如:

self.slave.read_register(2)
//or
self.slave.read_float(5)

我不确定我使用的是哪个 python 版本。我认为是 3.6.x.

引用您的电缆手册:

The USB-RS485-WE cable allows for local echo to be enabled/disabled by changing a bit in the FT232R EEPROM. If CBUS4 in the EEPROM is set for “PWRON#” local echo is enabled. If CBUS4 in the EEPROM is set for “TXDEN” local echo is disabled. Users can set this with MPROG from www.ftdichip.com The default for the local echo is disabled (CBUS4 set for “TXDEN)

呸!里面有很多信息。根据对您问题的评论线程,您在 minimalModbus 上激活了软件回声处理,否则您的例程将不会等待另一端设备的响应。这让人想一想您的电缆是否启用了本地回声。

幸运的是,您可以很容易地进行检查。正如手册所说,去获取 MPROG here。提取和 运行(是的,您需要 Windows 使用此工具,但您可以 运行 在虚拟机上使用它)。

将您的数据线连接到 USB 端口(如果您是 运行宁一个,请不要忘记将设备发送到虚拟机)并在 MPROG 上 select Tools-->Read and Parse

这是你应该得到的:

确保您在方框 C4 上输入了 TXEN select。根据手册,默认情况下应该有 TXEN,如果看到 PWRON# 则表示本地回显处于活动状态。禁用它,你应该可以去使用 Modbus。