我无法使用Minimummodbus(Modbus RTU)与设备进行通信。
我已通过USB至rs-485适配器(FTDI芯片)A至A和B至B将设备连接到树莓派。
设备配置如下:
端口设置:
接口2线RS485
Modbus保持寄存器(在此示例中已简化)
我尝试使用原始串行命令与设备通信,以及使用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:与仪器无通信(无答案)”
与传感器要求相比,我的代码中是否有明显的错误?我已确认与制造商的接线,并且是正确的。
答案 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
。
这是您应该得到的:
确保在框C4上选择了TXEN。根据手册,默认情况下应具有TXEN,如果看到PWRON#
,则表示本地回显处于活动状态。禁用它,您应该可以使用Modbus。