40-clients/ucepsa/edge-oee-demo/revpi/edge-oee/probe_wise_counter_modbus.py
2026-06-25 18:51:33 +02:00

115 lines
2.9 KiB
Python
Executable File

#!/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()