首页 > 解决方案 > 无法使用 minimummodbus 与 Modbus 设备通信

问题描述

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

我已通过 USB 到 rs-485 适配器(FTDI 芯片)A 到 A 和 B 到 B 将设备连接到树莓派。

设备配置如下:

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

我曾尝试使用原始串行命令与设备通信,以及使用 pymodbus,现在我最近尝试使用最小 modbus。请参阅下面我的代码尝试使用 minimummodbus。

此外,我知道串行适配器在我将其用于各种其他串行传感器时也能正常工作。唯一的区别是我现在正在使用 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

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

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

标签: pythonmodbusrs485minimalmodbus

解决方案


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

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。


推荐阅读