🧠 파이썬 OPC 통신 완벽 가이드 (Python OPC UA 서버·클라이언트 예제)
산업 자동화, PLC, IoT 환경에서 가장 널리 쓰이는 표준 통신 방식은 OPC (OLE for Process Control) 입니다.
특히 최근에는 Python OPC UA 통신을 활용해 다양한 설비 데이터와 클라우드 시스템을 연결하는 사례가 빠르게 늘고 있습니다.
이 글에서는 파이썬으로 OPC UA 통신을 구현하는 방법을 초보자도 따라 할 수 있도록 단계별 예제와 함께 설명합니다.
🧩 본문에서는 OPC UA 서버·클라이언트 구축 코드 예시, 환경 설정, 실행 방법까지 모두 다룹니다.
📌 OPC UA란? (Python OPC 통신 개념 이해)
**OPC UA (Unified Architecture)**는 산업 현장의 센서, PLC, SCADA, MES 등 다양한 시스템 간 데이터를 교환하기 위한 국제 표준 통신 규약입니다.
기존의 **OPC DA (Data Access)**는 Windows COM 기반이라 호환성에 한계가 있었지만,
OPC UA는 운영체제 독립적이며 보안성, 확장성, 표준 데이터 모델링이 가능해 산업 4.0 시대의 핵심 프로토콜로 자리잡았습니다.
✅ OPC UA 주요 특징 요약
- 🔗 플랫폼 독립적: Windows, Linux, Embedded 등 모두 지원
- 🔒 보안성 강화: 인증서 기반 암호화 및 세션 관리
- 🌐 프로토콜 다양성: TCP, HTTPS, WebSocket 등 다양한 통신 방식 지원
- 🧱 데이터 구조화: 태그(Node) 단위로 변수, 상태, 이벤트 등 표현 가능
🐍 Python OPC UA 통신 환경 준비
파이썬으로 OPC UA 서버·클라이언트를 구축하려면 FreeOpcUa 라이브러리를 설치해야 합니다.
pip install opcua
또는 유지보수가 활발한 버전을 원한다면:
pip install freeopcua
설치 후에는 OPC UA 서버와 클라이언트 간 실시간 통신을 구현할 수 있습니다.
🖥 OPC UA 서버 예제 (데이터 송신 측 코드)
다음은 Python으로 OPC UA 서버를 구축하는 예제 코드입니다.
실행하면 Temperature 변수가 주기적으로 갱신되며 클라이언트가 이 데이터를 읽을 수 있습니다.
from opcua import Server
import datetime
import time
# OPC UA 서버 생성
server = Server()
server.set_endpoint("opc.tcp://localhost:4840/freeopcua/server/")
# 네임스페이스 등록
uri = "http://example.opcua.server"
idx = server.register_namespace(uri)
# 객체 생성
objects = server.get_objects_node()
device = objects.add_object(idx, "Device1")
# 변수 노드 추가
temp = device.add_variable(idx, "Temperature", 25.0)
temp.set_writable() # 클라이언트 쓰기 허용
server.start()
print("✅ OPC UA 서버 시작")
try:
while True:
new_value = 20.0 + (datetime.datetime.now().second % 10)
temp.set_value(new_value)
print(f"Temperature: {new_value}")
time.sleep(1)
except KeyboardInterrupt:
print("서버 종료 중...")
server.stop()
📡 OPC UA 클라이언트 예제 (데이터 수신 측 코드)
클라이언트는 위에서 실행한 서버에 접속해 데이터를 읽습니다.
from opcua import Client
import time
client = Client("opc.tcp://localhost:4840/freeopcua/server/")
try:
client.connect()
print("✅ OPC UA 서버 연결 성공")
root = client.get_root_node()
print("Root Node:", root)
# 실제 환경에 맞는 노드 ID 사용
temp_node = client.get_node("ns=2;i=2")
while True:
value = temp_node.get_value()
print(f"현재 온도 값: {value}")
time.sleep(1)
finally:
client.disconnect()
print("클라이언트 연결 종료")
📌 팁:
노드 ID(ns=2;i=2)는 서버에서 실제 생성된 값으로 변경해야 합니다.
서버의 get_objects_node()를 통해 직접 확인 가능합니다.
🔍 Python OPC UA 통신 구조 요약
| 구성요소 | 설명 |
|---|---|
| 서버(Server) | 데이터를 생성하고 외부에 노드(Tag) 형태로 공개 |
| 클라이언트(Client) | 서버의 노드에 접근하여 데이터를 읽거나 수정 |
| Node ID | 각 데이터 항목의 고유 식별자 (예: ns=2;i=2) |
| Security Policy | 인증서 기반 암호화 설정 (set_security_policy) |
| 응용 분야 | 생산 데이터 모니터링, 설비 상태 수집, IoT 게이트웨이 |
⚙️ Python OPC UA 실무 응용 사례
- PLC 데이터 수집 시스템
Siemens, Omron, Mitsubishi 등의 PLC에서 OPC UA 서버로 데이터를 수집하고 Python으로 처리 - 공정 데이터 대시보드
Python + Grafana + InfluxDB 조합으로 OPC 데이터를 시각화 - AI 기반 예지보전 시스템
OPC UA를 통해 설비 데이터를 수집하고 머신러닝 분석 모델에 활용
💡 OPC UA 통신의 장점 (Python 활용 시 이점)
- 💨 복잡한 자동화 시스템 간 데이터 교환을 Python 코드 몇 줄로 처리
- 🔒 암호화 통신으로 안정적인 산업 네트워크 구성 가능
- 🌐 클라우드 IoT, 데이터베이스, REST API 등과 연동 용이
Python은 산업 자동화 + 데이터 분석을 연결하는 브릿지 역할을 하기에 최적입니다.
🚀 마무리: Python으로 시작하는 OPC UA
이제 여러분은 파이썬으로 OPC UA 서버와 클라이언트를 직접 구현할 수 있습니다.
테스트 시 서버 → 클라이언트 순서로 실행하면 실시간 데이터 교환이 바로 확인됩니다.
다음 글에서는 Python OPC UA 인증서 보안 설정, OPC DA ↔ OPC UA 변환 방법,
InfluxDB로 데이터 저장까지 확장하는 내용을 다룰 예정입니다.
