繁体   English   中英

使用RS485和minimalmodbus处理Python脚本的超时

[英]Handling time-out for Python-script with RS485 & minimalmodbus

目前通过最小模块总线“辅助”的Python脚本,在1(一个)RS485 kWh-meter的RS485总线上读取了DDS238-1ZN型。 增加更多的电度表意味着(在安装之前或在安装过程中)增加的电度表的从地址必须从初始的“ 1”偏移。 这种换档动作始于扫描RS485总线以确定千瓦时计实际位于何处。

第一步是以下简单的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

从测试运行中,我可以看到发生了超时。 如果我知道带有minimalmodbus的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执行半代码且与第一个脚本兼容的脚本有任何提示吗?

在此论坛中未找到/未收到任何有效的解决方案,但是已经开发,测试并付诸实践,并且采取了一种实用的简单补救措施,如http://www.domoticz.com/forum/viewtopic.php?f=14&t=5808&start中所述= 20#p113697

由于其数据协议的特性,该补救措施仅适用于DDS238-1ZN型电度表,但该想法可能适用于其他具有RS485接口的类似电度表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM