我正在尝试创建一个小型家庭监控系统。我有一系列的无线发射器把测量数据传送到基站。我可以使用Modbus RTU查询基站,以了解每个发射机的最新测量值。在
为了存储测量值并可视化,我使用InfluxDB和Grafana。我有所有运行在树莓皮3B+型,包括RS-485通信到基站。在
我选择使用Python从Modbus RTU读取数据,然后将其转发到InfluxDB进行存储,因为Python已经为这两种方法准备了库。但是,我正在努力使Python脚本稳定。不可避免的,我在Modbus传输中时不时会遇到CRC错误,当minimalmodbus库引发其中一个异常时,脚本似乎卡住了。在
我不知道该如何解决这个问题。在
目前我使用的是try-except-else结构,但是因为我是Python的新手,所以无法让它按我想要的方式工作。如果我失去一个测量点没关系。这意味着,如果我得到一个CRC错误,我可以忘记那个测量,像什么都没发生过一样继续下去。在
我目前使用的代码(最小化)如下所示:
#!/user/bin/env python
import minimalmodbus
import time
from influxdb import InfluxDBClient
# influxdb stuff
influx = InfluxDBClient(host='localhost', port=8086)
influx.switch_database('dbname')
# minimalmodbus stuff
minimalmodbus.BAUDRATE = 9600
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1)
errorcounter = 0
cyclecounter = 0
while True:
try:
sid1te = instrument.read_register(247, 1, 4)
print "SID 1 TE:", sid1te
influxquery = [
{"measurement": "sid1", "fields": { "te": sid1te}},
{"measurement": "system", "fields": { "errorcounter": errorcounter}},
{"measurement": "system", "fields": { "cyclecounter": cyclecounter}}
]
print "InfluxDB query result:", influx.write_points(influxquery)
except Exception as error:
print "[!] Exception occurred: ", error
errorcounter = errorcounter + 1
else:
print "[i] One cycle completed."
cyclecounter = cyclecounter + 1
time.sleep(30)
最终发生的是,脚本可以像做梦一样运行几个小时,然后,当传输中出现一个单一的CRC错误时,它将进入一个永不结束的异常循环,如下所示:
^{pr2}$当我使用CTRL-C退出时,脚本实际上看起来像是在sleep命令中:
^CTraceback (most recent call last):
File "temp.py", line 92, in <module>
time.sleep(30)
KeyboardInterrupt
所以我很困惑,为什么它不输出正常的打印命令到控制台,如果它实际上在程序循环中。在
在实际剧本里我有三打仪器读取寄存器调用,所以我不确定是否应该创建一个不同的函数,在该函数中处理每次读取的寄存器调用的异常,或者什么?在过去的一周里,我尝试了六种不同的代码,但是我在Grafana中得到的数据非常糟糕,因为脚本陷入了异常循环中。在
有什么建议吗?在
我尝试了不同的USB/RS-485转换器以及不同的Modbus RTU设备。同样的问题依然存在。我有99%的把握问题出在Linux串行端口处理上。我不知道如何/为什么,但它有时会给出pyserial/minimummodbus不完整的字节序列,导致minimummodbus将erroneus序列作为响应进行评估。例如,minimummodbus抱怨0x11响应太短,然后紧接着minimamodbus抱怨0x03 0x06 0xAE 0x41 0x56 0x52 0x43 0x40 0x49 0xAD在CRC中出错。事实上,如果这两条消息同时收到,这将是一个完全有效的响应。在
我不知道如何解决这个问题,但我确信这个问题比Python级别的问题更严重。在
编辑:这不是硬件/Linux的问题,而是Python/pyserial/minimamodbus的问题。我破解了一个Python脚本,它执行一个外部C语言Modbus RTU查询程序并解析输出。一个多星期以来,100%的时间都像个魔咒。在
相关问题 更多 >
编程相关推荐