산업 IoT & 스마트 팩토리 디지털트윈/OPC UA 표준 통신
OPC UA 쉽게 이해하기: 구조부터 Python 예제까지 한눈에 정리!
프로잉2
2025. 6. 9. 18:06
728x90
✅ OPC UA란?
**OPC UA (OPC Unified Architecture)**는 제조 장비와 시스템 간 안전하고 신뢰성 높은 데이터 통신을 가능하게 하는 산업용 통신 표준입니다. 기존의 OPC(Classic)와 달리 플랫폼 독립적이며, 보안, 확장성, 데이터 모델링 기능이 강화되어 있습니다.
🔧 OPC UA 구조 (쉽게 설명)
1. 서버(Server) - 데이터를 제공하는 쪽
- PLC, 센서, 로봇 등 실제 장비에 설치됨
- 내부의 변수(예: 온도, 속도, 상태 등)를 OPC UA 객체로 외부에 제공
2. 클라이언트(Client) - 데이터를 읽거나 제어하는 쪽
- HMI, SCADA, MES, 분석 시스템 등
- OPC UA 서버에 접속하여 실시간 데이터를 구독하거나 값을 변경함
3. 정보 모델(Information Model)
- 데이터들이 단순한 값이 아닌 구조화된 객체로 표현됨 (예: ‘모터 → 속도, 전류, 상태’ 식)
4. 통신 방식
- TCP/IP 기반으로 통신
- 보안(암호화, 인증), 데이터 구독(Subscription), 이력 저장(History Access) 등을 지원
🖥️ Python OPC UA 서버 코드
from opcua import Server
from datetime import datetime
import random
import time
# OPC UA 서버 생성
server = Server()
server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")
# 네임스페이스 등록
uri = "http://example.org/opcua"
idx = server.register_namespace(uri)
# 객체 생성: Sensor
objects = server.get_objects_node()
sensor = objects.add_object(idx, "MySensor")
# 변수 생성
temperature = sensor.add_variable(idx, "Temperature", 25.0)
humidity = sensor.add_variable(idx, "Humidity", 40.0)
# 외부에서 값을 쓸 수 있도록 설정
temperature.set_writable()
humidity.set_writable()
# 서버 시작
server.start()
print("OPC UA 서버 실행 중...")
try:
while True:
# 가상의 데이터 업데이트
temp_val = round(random.uniform(20, 30), 2)
hum_val = round(random.uniform(35, 60), 2)
temperature.set_value(temp_val)
humidity.set_value(hum_val)
print(f"{datetime.now()} → Temp: {temp_val}°C, Humidity: {hum_val}%")
time.sleep(2)
except KeyboardInterrupt:
print("서버 종료 중...")
server.stop()
📡 주요 기능 설명
항목 | 설명 |
set_endpoint | 클라이언트가 접속할 수 있는 서버 주소 (IP, 포트) 설정 |
register_namespace | 사용자 정의 네임스페이스 URI 등록 |
add_object, add_variable | OPC UA 구조 내 객체 및 변수 생성 (노드 구성) |
set_value() | 주기적으로 변수 값을 갱신하여 클라이언트에 실시간 데이터 제공 |
💡 예제: Python으로 OPC UA 클라이언트 만들기
아래는 Python에서 opcua 라이브러리를 활용해 실제 값을 읽는 간단한 예시입니다.
from opcua import Client
# OPC UA 서버 주소 (예: 장비 또는 시뮬레이터)
url = "opc.tcp://localhost:4840"
# 클라이언트 생성 및 접속
client = Client(url)
client.connect()
print("서버에 연결되었습니다.")
# 노드(변수) 지정: Node ID는 장비마다 다름
node = client.get_node("ns=2;s=Temperature") # 예: 온도 변수
value = node.get_value()
print(f"현재 온도 값: {value}")
client.disconnect()
이 코드는 OPC UA 서버에 연결하여 "Temperature"라는 변수 값을 읽어옵니다.
https://www.youtube.com/watch?v=Em_Gx0rWc5U
🧪 실습용 무료 서버 추천
- Prosys OPC UA Simulation Server
윈도우에서 무료로 제공, 다양한 변수 제공 - Unified Automation UA Expert
전문 OPC UA 클라이언트 툴로 실시간 확인 가능 - FreeOPCUA (Python 서버 구현)
Python 기반 OPC UA 서버도 직접 구현 가능
📦 활용 예시 (현장 중심)
분야 | 예시 사용 |
제조라인 | 장비 온도/속도/불량률 실시간 수집 |
에너지 | 태양광 인버터 상태 모니터링 |
물류 | AGV, 컨베이어 센서 상태 모니터링 |
스마트팩토리 | MES ↔ PLC 연동, 에너지 절감 분석 등 |
https://www.youtube.com/watch?v=ZlJCuAeGPis
728x90