无法使用Minimummodbus

时间:2019-07-24 10:36:34

标签: python modbus rs485 minimalmodbus

我无法使用Minimummodbus(Modbus RTU)与设备进行通信。

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

设备配置如下:

  • 端口设置

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

    • ECM的连接器:DB9
    • 连接:针脚1、4上的A。针脚6、9上的B

Modbus保持寄存器(在此示例中已简化)

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

我尝试使用原始串行命令与设备通信,以及使用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:与仪器无通信(无答案)”

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

2 个答案:

答案 0 :(得分:0)

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

library(dplyr)
df.results <- df %>%
  group_by(id) %>%
  summarise(b = toString(b)) %>%
  ungroup()

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

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()
...

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

答案 1 :(得分:0)

引用电缆手册:

  

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

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

幸运的是,您可以轻松地进行检查。如手册所述,只需获取MPROG here。提取并运行(是的,此工具需要Windows,但可以在虚拟机上运行)。

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

这是您应该得到的:

MPROG screenshot

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