python - 无法使用 minimummodbus 与 Modbus 设备通信
问题描述
我无法与使用 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)”
我的代码与传感器要求有什么明显的错误吗?我与制造商确认了我的接线,并且是正确的。
解决方案
我没有从你这边看到明显的错误。这相当困难,因为您正在使用硬件。我将提供一些我的代码。我将它用于原型,这是一个带有 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。
推荐阅读
- google-apps-script - 如何使 onEdit 触发器不触发边框样式更改?
- java - 是否存在错误地计算为略低于 0.5 或 0.0 的浮点数?
- python - 如何计算最近 36 个月的股票方差(部分月度数据缺失)?
- spring-cloud - Spring Cloud 认证服务
- jmeter - Jmeter - 在运行共享点登录的登录脚本时,在自定义 api 上出现 403 禁止错误
- javascript - 用 ? 处理 undefined 或 null 抛出 SyntaxError: Unexpected token using webpack
- javascript - 引导网站重叠中的各个部分
- chromecast - 如何隐藏 CAF 通知
- amazon-web-services - AWS ALB 侦听器 - https 和 http
- javascript - 如何使用自定义 Vue 实例注入 Vue 组件