🧠 실전 예제로 배우는 파이썬 OPC UA 통신 (Python OPCUA Client)
키워드: 파이썬 OPC 통신, OPC UA, Python OPCUA Client, 산업자동화, MES 연동, PLC 데이터, 공장자동화, OPCUA Python 예제
🏭 OPC UA란 무엇인가?
OPC UA(Open Platform Communications Unified Architecture)는 산업 자동화 분야의 표준 통신 프로토콜입니다.
PLC(Programmable Logic Controller), MES, SCADA, HMI 등 다양한 시스템 간의 데이터 교환을 표준화하기 위해 사용됩니다.
- ✅ TCP 기반 안정적인 통신
- ✅ 보안(암호화, 인증) 지원
- ✅ 크로스 플랫폼 (Windows, Linux, Python, C#, Node.js 등)
🧰 Python에서 OPC UA 통신하기
Python에서는 opcua 라이브러리를 통해 OPC 서버와 쉽게 통신할 수 있습니다.
pip install opcua
이 한 줄이면 설치 완료!
이제 실제 OPC 서버의 데이터(예: MES_STRING, 생산명, 주문번호 등)를 읽어올 수 있습니다.
⚙️ 실전 예제: MES-PLC OPC 통신 자동화 스크립트
아래 예제는 실제 생산라인에서 사용 가능한 수준으로 작성된 완전한 OPC 통신 코드입니다.
INI 설정 파일을 이용해 IP, 포트, 라인 정보를 외부에서 제어할 수 있고,
실행 중복 방지 및 에러 로깅까지 지원합니다.
from opcua import Client
import configparser, sys, os, msvcrt
# -----------------------------
# 중복 실행 방지
# -----------------------------
LOCK_FILE = "program.lock"
fp = open(LOCK_FILE, "w")
try:
msvcrt.locking(fp.fileno(), msvcrt.LK_NBLCK, 1)
except OSError:
print("이미 실행 중입니다.")
sys.exit(0)
# -----------------------------
# INI 파일 처리
# -----------------------------
INI_FILE = "APIDATA.INI"
def write_ini(key, value):
config = configparser.ConfigParser()
config.read(INI_FILE, encoding="utf-8")
if "RESULT" not in config:
config["RESULT"] = {}
config["RESULT"][key] = value
with open(INI_FILE, "w", encoding="utf-8") as f:
config.write(f)
def read_ini(key, default=""):
config = configparser.ConfigParser()
config.read(INI_FILE, encoding="utf-8")
return config["RESULT"].get(key, default) if "RESULT" in config else default
# 초기값 설정
write_ini("DATA_YN", "N")
write_ini("PROD_NAME", "")
write_ini("PROCESS_ORDER_NO", "")
write_ini("DATA_ERR", "")
# -----------------------------
# OPC 서버 연결
# -----------------------------
ip1 = read_ini("IP", "127.0.0.1")
port = read_ini("PORT", "4840")
ip = ip1 + ":" + port
line = read_ini("LINE", "1")
url = f"opc.tcp://{ip}"
client = Client(url)
try:
client.connect()
write_ini("DATA_YN", "Y")
print("✅ OPC UA 서버 연결 성공")
# 라인별 NodeId 설정
if line == '1':
node_prod = client.get_node("ns=7;s=L1.CPU.MES_STRING.Prod_Name")
node_order = client.get_node("ns=7;s=L1.CPU.MES_STRING.Process_order_NO")
elif line == '2':
node_prod = client.get_node("ns=7;s=L2.CPU.MES_STRING.Prod_Name")
node_order = client.get_node("ns=7;s=L2.CPU.MES_STRING.Process_order_NO")
elif line == '3':
node_prod = client.get_node("ns=7;s=L3.CPU.MES_STRING.Prod_Name")
node_order = client.get_node("ns=7;s=L3.CPU.MES_STRING.Process_order_NO")
else:
raise ValueError(f"LINE 값이 잘못되었습니다: {line}")
# 값 읽기 및 정제
prod_name = str(node_prod.get_value()).replace('\x00', '').strip()
process_order = str(node_order.get_value()).replace('\x00', '').strip()
print(f"Prod_Name 값: {prod_name}")
print(f"Process_order_NO 값: {process_order}")
# INI 저장
write_ini("PROD_NAME", prod_name)
write_ini("PROCESS_ORDER_NO", process_order)
except Exception as e:
print("❌ 오류:", e)
write_ini("DATA_ERR", f"ERROR: {e}")
finally:
try:
client.disconnect()
except:
pass
🗂️ INI 파일 구성 예시
APIDATA.INI 파일은 설정 및 결과값 저장용입니다.
[RESULT]
IP = 192.168.0.100
PORT = 4840
LINE = 1
PROD_NAME =
PROCESS_ORDER_NO =
DATA_YN = N
DATA_ERR =
✅ 실행 결과 예시
✅ OPC UA 서버 연결 성공
Prod_Name 값: TEST_PRODUCT_001
Process_order_NO 값: P20251023001
결과는 APIDATA.INI 파일에 자동으로 기록됩니다.
🚀 실무 활용 포인트
| 항목 | 설명 |
|---|---|
| 🔒 실행 중복 방지 | msvcrt.locking() 사용으로 중복 실행 차단 |
| 🧾 설정 분리 | APIDATA.INI로 유연한 환경 제어 |
| 📡 실시간 데이터 읽기 | get_node().get_value()로 즉시 값 수신 |
| 💾 자동 로그 저장 | 생산명, 주문번호 결과값 자동 저장 |
| ⚠️ 에러 처리 | 통신 오류 발생 시 자동 기록 |
💡 마무리
이 스크립트는 실제 MES-PLC 환경에서
생산명 / 작업지시번호 / 실시간 상태값 등을 자동 수집하는 데 활용할 수 있습니다.
Python의 opcua 모듈은 가볍고 빠르며,
자동화, 데이터 수집, 분석 시스템과 연동하기에 최적입니다.
📎 다음글 예고
👉 [Python OPCUA로 PLC 쓰기(Write) 명령 구현하기]
👉 [실시간 태그 모니터링 자동화 예제]
