#!/usr/bin/env python3 from pymodbus.client import ModbusTcpClient WISE_IP = "10.43.54.249" WISE_PORT = 502 UNIT = 1 def read_holding(client, start, count): rr = client.read_holding_registers( address=start, count=count, device_id=UNIT, ) if rr.isError(): raise RuntimeError(rr) return rr.registers def u32_hi_lo(hi, lo): return ((hi & 0xFFFF) << 16) | (lo & 0xFFFF) def u32_lo_hi(hi, lo): return ((lo & 0xFFFF) << 16) | (hi & 0xFFFF) def print_block(name, start, regs): print(f"\n{name} start={start}") print("16-bit:") for i, value in enumerate(regs): print(f"addr {start+i:4d}: {value}") print("\n32-bit pairs:") for i in range(0, len(regs) - 1, 2): a = start + i hi = regs[i] lo = regs[i + 1] print( f"addr {a:4d}/{a+1:4d}: " f"hi_lo={u32_hi_lo(hi, lo)} " f"lo_hi={u32_lo_hi(hi, lo)}" ) def snapshot(client): return { "base0": read_holding(client, 0, 12), "base1": read_holding(client, 1, 12), } def main(): client = ModbusTcpClient(WISE_IP, port=WISE_PORT, timeout=3) if not client.connect(): raise RuntimeError("No conecta con WISE") try: print("Snapshot inicial") before = snapshot(client) for name, regs in before.items(): start = 0 if name == "base0" else 1 print_block(name, start, regs) input("\nPulsa DI1 exactamente 10 veces y después pulsa ENTER...") print("\nSnapshot final") after = snapshot(client) for name, regs in after.items(): start = 0 if name == "base0" else 1 print_block(name, start, regs) print("\nDeltas 16-bit:") for name in before: start = 0 if name == "base0" else 1 for i, (b, a) in enumerate(zip(before[name], after[name])): if a != b: delta = (a - b) & 0xFFFF print(f"{name} addr {start+i}: before={b} after={a} delta={delta}") print("\nDeltas 32-bit:") for name in before: start = 0 if name == "base0" else 1 bregs = before[name] aregs = after[name] for i in range(0, len(bregs) - 1, 2): b_hi_lo = u32_hi_lo(bregs[i], bregs[i + 1]) a_hi_lo = u32_hi_lo(aregs[i], aregs[i + 1]) d_hi_lo = (a_hi_lo - b_hi_lo) & 0xFFFFFFFF b_lo_hi = u32_lo_hi(bregs[i], bregs[i + 1]) a_lo_hi = u32_lo_hi(aregs[i], aregs[i + 1]) d_lo_hi = (a_lo_hi - b_lo_hi) & 0xFFFFFFFF if d_hi_lo or d_lo_hi: print( f"{name} addr {start+i}/{start+i+1}: " f"delta_hi_lo={d_hi_lo} " f"delta_lo_hi={d_lo_hi}" ) finally: client.close() if __name__ == "__main__": main()