1

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

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

设备配置如下:

  • 端口设置

    • 波特率:9600
    • 奇偶校验:否
    • 停止位:1
    • 静音间隔:70 毫秒。
    • 传输方式:RTU
  • 接口 2 线 RS485

    • ECM 接头:DB9
    • 连接:A 在引脚 1、4 上。B 在引脚 6、9 上

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

  • 交换浮点格式:
    • 40001 (地址 0) 参数 1
    • 40003(地址 2)参数 2

我曾尝试使用原始串行命令与设备通信,以及使用 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)”

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

4

2 回答 2

0

我没有从你这边看到明显的错误。这相当困难,因为您正在使用硬件。我将提供一些我的代码。我将它用于原型,这是一个带有 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。

于 2019-07-24T11:23:13.427 回答
0

引用电缆手册:

USB-RS485-WE 电缆允许通过更改 FT232R EEPROM 中的位来启用/禁用本地回波。如果 EEPROM 中的 CBUS4 设置为“PWRON#”,则启用本地回显。如果 EEPROM 中的 CBUS4 设置为“TXDEN”,则禁用本地回显。用户可以使用 www.ftdichip.com 上的 MPROG 进行设置。本地回显的默认设置为禁用(CBUS4 设置为“TXDEN”)

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

幸运的是,您可以非常轻松地进行检查。正如手册所说,只需在这里获取 MPROG 即可。解压并运行(是的,您需要 Windows 才能使用此工具,但您可以在虚拟机上运行它)。

将电缆连接到 USB 端口(如果您正在运行,请不要忘记将设备发送到虚拟机)并选择Tools-->Read and ParseMPROG。

这是你应该得到的:

MPROG 截图

确保在框 C4 上选择了 TXEN。根据手册,默认情况下您应该有 TXEN,如果您看到PWRON#它意味着本地回显处于活动状态。禁用它,您应该可以使用 Modbus。

于 2019-07-24T14:36:09.440 回答