我无法与使用最小Modbus (Modbus RTU )的设备通信。
我已经通过usb到rs-485适配器(FTDI芯片)A到A和B到B将设备连接到一个覆盆子π。
设备配置如下:
- Baud rate: 9600
- Parity: No
- Stop bits: 1
- Silent Interval: 70 ms.
- Transmission Mode: RTU
- Connector of ECM: DB9
- Connections: A on pins 1, 4. B on pins 6, 9
Modbus保持寄存器(为本例目的简化)
我尝试使用原始串行命令与设备通信,以及使用pymodbus,现在是我最近尝试的最小modbus。请参阅下面我的代码尝试使用最小调制解调器。
此外,我知道串行适配器的工作方式,因为我使用它的各种其他串行传感器。唯一的不同是我现在正在使用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我希望收到某种答复,即使是错误或不正确,但我什么也得不到。最小调制解调器的调试输出是"IOError:没有与仪器的通信(没有答案)“。
,我的代码和传感器的要求之间有什么明显的错误吗?,我和制造商确认了我的接线,并且是正确的。
发布于 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。
发布于 2019-07-24 11:23:13
我看不出你这边有什么明显的错误。这是相当困难的,因为您正在使用硬件。我会提供一些我的代码。我用它做了一个原型,它是一个带有USBtoRS485转换器(这一个)的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。
https://stackoverflow.com/questions/57180904
复制相似问题