首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用最小Modbus与Modbus设备通信

无法使用最小Modbus与Modbus设备通信
EN

Stack Overflow用户
提问于 2019-07-24 10:36:34
回答 2查看 3.1K关注 0票数 1

我无法与使用最小Modbus (Modbus RTU )的设备通信。

我已经通过usb到rs-485适配器(FTDI芯片)A到A和B到B将设备连接到一个覆盆子π。

设备配置如下:

  • 端口设置
代码语言:javascript
复制
- Baud rate: 9600
- Parity: No
- Stop bits: 1
- Silent Interval: 70 ms.
- Transmission Mode: RTU

  • 接口2线RS485
代码语言:javascript
复制
- Connector of ECM: DB9
- Connections: A on pins 1, 4. B on pins 6, 9

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

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

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

此外,我知道串行适配器的工作方式,因为我使用它的各种其他串行传感器。唯一的不同是我现在正在使用modbus。

代码语言:javascript
复制
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

我希望收到某种答复,即使是错误或不正确,但我什么也得不到。最小调制解调器的调试输出是"IOError:没有与仪器的通信(没有答案)“。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-24 14:36:09

引用您的电缆手册:

USB 485-WE电缆允许通过改变FT232R EEPROM中的位来启用/禁用本地回波。如果EEPROM中的CBUS4设置为“PWRON#”,则启用本地回波。如果EEPROM中的CBUS4设置为“TXDEN”,则禁用本地回波。用户可以使用www.ftdichip.com中的MPROG设置这个选项,本地回波的默认设置是禁用的(CBUS4设置为“TXDEN”)

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

幸运的是,你可以很容易地检查。就像手册上说的,去拿MPROG 这里吧。提取并运行(是的,该工具需要Windows,但可以在虚拟机上运行)。

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

这是你应该得到的:

确保在方框C4上选择了TXEN。根据手册,默认情况下您应该拥有TXEN,如果您看到PWRON#,它意味着本地回波是活动的。禁用它,您应该很好地去使用Modbus。

票数 0
EN

Stack Overflow用户

发布于 2019-07-24 11:23:13

我看不出你这边有什么明显的错误。这是相当困难的,因为您正在使用硬件。我会提供一些我的代码。我用它做了一个原型,它是一个带有USBtoRS485转换器(这一个)的Raspberry Pi 3B。

代码语言:javascript
复制
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()
...

当我阅读一个寄存器时,我使用了例如:

代码语言:javascript
复制
self.slave.read_register(2)
//or
self.slave.read_float(5)

我不确定我使用了哪个python版本。我想是3.6.x。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57180904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档