115 lines
2.9 KiB
Python
Executable File
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()
|