OPC-UA
OPC-UA (OLE for Process Control - Unified Architecture, IEC 62541) 는 산업 자동화 분야의 표준 통신 규약입니다. Kepware, Matrikon, Prosys, Ignition 등 거의 모든 SCADA / 미들웨어 제품이 OPC-UA 서버 기능을 제공합니다.
대부분의 PLC 가 직접 OPC-UA 서버 기능을 갖고 있지 않기 때문에 보통 Kepware 같은 게이트웨이 소프트웨어를 통해 PLC 값을 OPC-UA 로 노출하고, 이 게이트웨이는 그 OPC-UA 서버에 접속해 값을 가져오는 구조입니다.
지원 spec / 보안
이 게이트웨이의 OPC-UA 클라이언트는 OPC UA 1.04 (IEC 62541:2020) 까지 지원 — Eclipse Milo 0.6.16 SDK 기반.
- Transport: opc.tcp:// (UA Binary encoding)
- Security: None / Basic256Sha256 / Aes128_Sha256_RsaOaep / Aes256_Sha256_RsaPss 등 표준 정책
- User token: Anonymous / UserName+Password / X.509 Certificate
- Subscription: 게이트웨이는 polling 방식 (
timecycle주기) — UA 의 MonitoredItem 구독 미사용
등록 폼 입력값
| 입력 칸 | 무엇을 적나요 | 예시 |
|---|---|---|
| IP 주소 | OPC-UA 서버 PC 의 IP | 192.168.0.40 |
| 포트 | OPC-UA 서버 포트 | 49320 (Kepware 기본) / 4840 (표준) |
| 사용자 (User) | OPC-UA 서버에 등록된 사용자 ID | kopens (서버에 따라 다름) |
| 비밀번호 | 그 사용자의 비밀번호 | *** |
| 서버 이름 (servername) | 엔드포인트 끝의 서버 이름 | (Kepware 면 비워두기) |
| Discovery 사용 | 서버의 엔드포인트를 자동 검색할지 | 보통 false. 안 되면 true 시도 |
| Subscription 사용 (subscription-enabled) | polling 대신 server-push 모드 | 체크 시 true (대용량 태그 효율적) |
| Publishing (publishing-interval) | 서버가 데이터 변경을 publish 하는 간격 (ms) | 1000 (기본) |
| Sampling (sampling-interval) | 서버가 값을 샘플링하는 간격 (ms) | 1000 (기본) |
| Queue Size (queue-size) | 변경값 누적 큐 크기 (notification 손실 방지) | 10 (기본) |
사용자 / 비밀번호 칸을 둘 다 비워두면 익명(Anonymous) 으로 접속을 시도합니다. 서버에서 익명 접속이 허용되어 있어야 합니다.
태그의 PLC 주소 표기
OPC-UA 의 태그 주소는 보통 NodeId 라고 부르는 다음 형식입니다.
| 표기 | 설명 |
|---|---|
ns=2;s=Channel1.Device1.Tag1 | namespace 2, 문자열 식별자 — Kepware 에서 가장 흔함 |
ns=2;i=1234 | namespace 2, 숫자 식별자 |
ns=3;g=09087e75-8e5e-499b-954f-f2a8624db28a | GUID 형 |
ns=는 namespace 번호. 보통2.s=다음에 “Channel.Device.Tag” 식의 경로가 들어갑니다 (Kepware 에서 만든 경로 그대로).
NodeId 를 어떻게 알아내나요
- PLC 제조사 / Kepware 제조사 매뉴얼 에 매핑표가 있는 경우가 많습니다.
- UA Expert 같은 무료 OPC-UA 클라이언트로 직접 연결해 트리에서 노드를 우클릭하면 NodeId 를 복사할 수 있습니다.
- Kepware 자체의 OPC Quick Client 도구로도 같은 일을 할 수 있습니다.
Kepware 빠른 설정
자주 쓰는 조합인 Kepware 기준 절차입니다.
- Kepware Server → Project → 채널 추가 (예:
Simulator) - 디바이스 추가 (예:
Simulator) → 모델 =16 Bit Device - 태그 추가 → 이름
Sine1, typeFloat, scan rate100ms - Project Properties → OPC UA → Server Endpoint 에서 포트
49320활성화 - 익명 또는 사용자 계정 활성화
이 게이트웨이의 등록 폼에:
| 칸 | 값 |
|---|---|
| IP | Kepware 서버 PC 의 IP |
| 포트 | 49320 |
| 사용자/비번 | 위에서 만든 계정 (익명이면 비움) |
| 태그 PLC 주소 | ns=2;s=Simulator.Simulator.Sine1 |
흔한 문제와 해결
| 증상 / 메시지 | 가능한 원인 | 해결 |
|---|---|---|
| “Connection refused” / 연결 안 됨 | OPC-UA 서버가 꺼져 있거나 포트 차단 | OPC-UA 서버가 가동 중인지, IP/포트가 맞는지 확인 |
| “User access denied” | 사용자/비번 오류, 또는 서버에서 익명 접속 비허용 | 서버에서 사용자 등록하거나 익명 허용 |
| “Security checks failed” | 서버의 보안 정책 미스매치 | 서버 보안 정책을 “None” 또는 “Basic256Sha256” 으로 맞춤 |
연결은 되는데 값이 항상 0 또는 null | 태그 NodeId 오타, namespace 번호 다름 | UA Expert 등으로 같은 NodeId 가 실제로 동작하는지 검증 |
| 끊겼다 붙었다 반복 | 네트워크 불안정, 또는 서버 PC 부하 | 서버 PC 자원 / 케이블 / 스위치 점검 |
자주 쓰는 데이터 형식
| PLC 의 값 | 데이터 형식 | 형식 보조 | PLC 주소 예 |
|---|---|---|---|
| 켜짐/꺼짐 | Boolean | (비움) | ns=2;s=Pump.Status |
| 정수 | Integer | (비움) | ns=2;s=Counter |
| 큰 정수 | Long | (비움) | ns=2;s=Total |
| 실수 (32-bit) | Float | (비움) | ns=2;s=Pressure |
| 실수 (64-bit, 정밀) | Double | (비움) | ns=2;s=PrecisionTemp |
| 문자열 | String | (비움) | ns=2;s=Recipe.Name |
OPC-UA 의 경우 format 칸은 보통 비워둡니다 (서버가 데이터 타입을 알려줍니다).
더 자세한 예제 / 자동화 등록
스크립트 / API 로 자동 등록하시려면 고급 — REST API 페이지의 OPC-UA 예제를 참고하세요.