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