86 lines
2.1 KiB
Python
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()
|