Modbus TCP/IP热量计Python脚本:重复0信号计数去重需求
解决Modbus TCP热量计重复计数问题
问题出在热量计触发10kW增量时会连续输出多个0,循环里每次读到0就累加,导致重复计数。解决思路是跟踪前一次的信号状态,只在状态从1切换到0的瞬间计数一次,而不是每次读到0都处理。
修改后的代码
from pymodbus.client import ModbusTcpClient from datetime import datetime import time # 降低读取频率,减轻设备负担 IP = '192.168.22.95' client = ModbusTcpClient(IP) # 先确认设备连接正常 if not client.connect(): print("无法连接到热量计,请检查IP地址和设备状态") exit() current_kw = 260000 previous_state = 1 # 初始状态设为1(非触发状态) try: while True: try: # 读取寄存器值 response = client.read_holding_registers(0, 1) if response.isError(): print(f"读取寄存器失败: {response}") time.sleep(1) continue current_state = response.registers[0] # 仅当状态从1切换到0时,才执行累加操作 if current_state == 0 and previous_state == 1: record_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") current_kw += 10 print(f"{record_time} | 累计功率更新为: {current_kw} kW") # 更新前一次状态,准备下一轮判断 previous_state = current_state # 加短延迟,避免高频读取 time.sleep(0.1) except Exception as e: print(f"运行异常: {str(e)}") time.sleep(1) finally: # 退出时关闭连接 client.close()
关键修改说明
- 状态跟踪:新增
previous_state变量,记录上一次读取的信号状态,确保只有状态切换瞬间才触发计数,彻底避免连续0的重复累加 - 异常处理:加入寄存器读取错误捕获和全局异常捕获,防止读取失败或意外错误导致脚本直接崩溃
- 连接检查:启动时先验证设备连接,避免无意义的循环
- 频率控制:添加
time.sleep()降低读取频率,减轻设备和网络的负载
内容的提问来源于stack exchange,提问作者user20271684
相关产品推荐
相关产品推荐

