【发布时间】:2016-11-11 10:20:47
【问题描述】:
目前在 RS485 总线上读取 1(一)个 RS485 千瓦时电表,类型 DDS238-1ZN 通过 Python 脚本“辅助”模块 minimummodbus。 添加更多的 kWh-meter 意味着(在安装之前或安装期间)添加的 kWh-meter 的 Slave-Adress 必须从初始的“1”转移。 这种换档动作从扫描 RS485 总线开始,以确定 kWh 电表的实际位置。
第一步是以下简单的 Python 脚本
import serial
import minimalmodbus
# Check address 00 = broadcast
instrument = minimalmodbus.Instrument('/dev/ttyAMA0',0) # port name, slave address
instrument.serial.baudrate = 9600
instrument.serial.timeout = 0.5
instrument.debug = True
print instrument
print instrument.read_register(21,0) # registernumber, number of decimals
# Check address 01 = slave 01
instrument = minimalmodbus.Instrument('/dev/ttyAMA0',1) # port name, slave address
print instrument
print instrument.read_register(21,0) # registernumber, number of decimals
# Check address 02 = slave02
instrument = minimalmodbus.Instrument('/dev/ttyAMA0',2) # port name, slave address
print instrument
print instrument.read_register(21,0) # registernumber, number of decimals
对从地址 00 和 01 的检查按预期产生结果 (257),但(由于没有设备)显然对从地址 02 的响应因超时而失败。
更多问题描述见http://www.domoticz.com/forum/viewtopic.php?f=31&t=13592#p102901
从测试运行中,我可以看到发生了超时。 如果我知道这种超时信号的布局用于具有最小modbus 的 Python 脚本... .
在互联网上搜索替代方案时,我看到了各种“精彩且详尽”的解决方案来捕获超时,但从我的简单脚本的角度来看,我正在寻找一些非常基本的东西(最好是“单线” ) 以启用超时以检查下一个从地址 3 等。
看看上面提到的那些解决方案,也许以下设置半代码是一个简单/基本解决方案? [为此我一直在寻找 C 函数 fread() 的方向]
start of loop
start time-counter
read register from slave address x
N = number of characters received
if time-counter at value t, then
look if N > 0
if N == 0 then
x = x + 1
jump to start of loop
任何提示使用 Python 或 MinimalModbus 执行半代码的脚本,与第一个脚本兼容?
【问题讨论】:
-
Pymodbus 似乎在 pymodbus.constants.Defaults 和 pymodbus.constants.ModbusStatus 中有一个工具来处理从站的超时和状态,但这需要完全不同的脚本 此类脚本的任何提示/示例使用 pymodbus?
标签: python timeout rs485 minimalmodbus