在Python中处理minimummodbus异常

2024-05-13 17:25:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个小型家庭监控系统。我有一系列的无线发射器把测量数据传送到基站。我可以使用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中得到的数据非常糟糕,因为脚本陷入了异常循环中。在

有什么建议吗?在


Tags: import脚本time错误modbusmeasurementcrcprint
1条回答
网友
1楼 · 发布于 2024-05-13 17:25:35

我尝试了不同的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%的时间都像个魔咒。在

相关问题 更多 >