Files
ExperionCrawler/test_hc900_tcp.py
2026-05-08 17:22:10 +09:00

86 lines
2.1 KiB
Python

#!/usr/bin/env python3
"""
HC900 Modbus TCP 테스트 - 여러 태그 읽기
"""
import socket
import struct
import time
HC900_IP = "192.168.0.240"
PORT = 502
TAGS = [
("FICQ-8101.PV", 0x0040, 2),
("FICQ-8101.WSP", 0x0044, 2),
("FICQ-8101.Output", 0x0046, 2),
("FICQ-8101.Gain_1_Prop_Band_1", 0x004C, 2),
("FICQ-8101.Reset_1", 0x0050, 2),
("FICQ-8101.Rate_1", 0x0052, 2),
("LICA-5113.PV", 0x0140, 2),
("LICA-5113.WSP", 0x0144, 2),
("FICQ-8113.PV", 0x0240, 2),
("FICQ-8113.WSP", 0x0244, 2),
("FICQ-8101.Auto_Man_State", 0x00FA, 1),
("FICQ-8101.Loop_Status_Register", 0x00FE, 1),
]
def read_tag(sock, name, addr, qty):
tid = hash(name) & 0xFFFF
packet = struct.pack('>HHHBBHH',
tid, 0x0000, 0x0006, 0x01, 0x03, addr, qty)
t0 = time.time()
sock.sendall(packet)
data = sock.recv(1024)
rt = (time.time() - t0) * 1000
if len(data) < 9:
return None, rt, "too short"
fc = data[7]
if fc & 0x80:
return None, rt, f"error 0x{data[8]:02X}"
bc = data[8]
vals = data[9:9+bc]
if qty == 2:
value = struct.unpack('>f', vals)[0]
return value, rt, None
else:
value = struct.unpack('>H', vals)[0]
return value, rt, None
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5.0)
sock.connect((HC900_IP, PORT))
print(f"HC900 Modbus TCP 테스트 ({HC900_IP}:{PORT})")
print("=" * 60)
total_t0 = time.time()
for name, addr, qty in TAGS:
val, rt, err = read_tag(sock, name, addr, qty)
if err:
print(f" {name:<35} addr=0x{addr:04X} → ERROR: {err}")
else:
if isinstance(val, float):
print(f" {name:<35} addr=0x{addr:04X}{val:>12.4f} ({rt:.1f}ms)")
else:
print(f" {name:<35} addr=0x{addr:04X}{val:>12d} ({rt:.1f}ms)")
total_rt = (time.time() - total_t0) * 1000
sock.close()
print("=" * 60)
print(f"{len(TAGS)}개 태그 읽기: {total_rt:.1f}ms")
print(f"평균/태그: {total_rt/len(TAGS):.1f}ms")
if __name__ == "__main__":
main()