You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 11:22:28