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 서버에 접속해 값을 가져오는 구조입니다.
이 게이트웨이의 OPC-UA 클라이언트는 Eclipse Milo 1.1.8 SDK 기반입니다.
- Transport: opc.tcp:// (UA Binary encoding)
- 보안 모드:
None·Sign·SignAndEncrypt· 자동 — 아래 보안 연결 참고 - 보안 정책: 자동 ·
Aes256_Sha256_RsaPss·Basic256Sha256·Aes128_Sha256_RsaOaep(낡은 정책Basic256·Basic128Rsa15은 따로 허용해야 함) - 사용자 인증: 익명(Anonymous) 또는 사용자 이름 + 비밀번호
- 읽기 / 쓰기: 둘 다 지원. 읽기는
timecycle주기 polling 이며 UA 구독(MonitoredItem)은 쓰지 않습니다
DCS·로봇 컨트롤러의 OPC UA 서버에 붙일 때는 DCS 연결하기 · 로봇 연결하기 를 함께 보세요.
등록 폼 입력값
IP·포트 아래 OPC UA 프로토콜 옵션 묶음의 칸은 서버 이름 · 사용자 · 비밀번호 · 디스커버리, 이 네 개입니다. 채널 암호화는 그 아래 보안 (채널 암호화) 묶음에서 정합니다 — 보안 연결 참고.
| 입력 칸 | 무엇을 적나요 | 예시 |
|---|---|---|
| IP 주소 | OPC-UA 서버 PC 의 IP | 192.168.0.40 |
| 포트 | OPC-UA 서버 포트 | 49320 (Kepware 기본) / 4840 (표준) |
| 서버 이름 (servername) | 엔드포인트 URI 의 경로 부분 | 비워 두기, 또는 OPCUAServer · iotgateway 등 |
| 사용자 (username) | OPC-UA 서버에 등록된 사용자 ID. 익명이면 비움 | kopens (서버에 따라 다름) |
| 비밀번호 (password) | 그 사용자의 비밀번호 | *** |
| 디스커버리 (discovery) | true 면 연결할 때 노드 트리 전체를 브라우징 | false (권장) |
사용자 / 비밀번호 를 둘 다 적으면 사용자 이름 토큰으로, 하나라도 비어 있으면 익명(Anonymous) 으로 접속합니다. 익명이면 서버에서 익명 접속이 허용되어 있어야 합니다. 보안 모드가 None 이면 계정이 평문 채널로 가므로, 계정을 쓸 때는 SignAndEncrypt 를 권장합니다.
엔드포인트가 정해지는 방식
- 입력값으로
opc.tcp://<IP>:<포트>/<servername>을 만들어 서버에 엔드포인트 목록을 묻습니다. - 목록에서 보안 모드·보안 정책에 맞는 엔드포인트를 고릅니다.
- 보안 모드 None — None 엔드포인트 가운데 쓸 사용자 토큰(익명 또는 사용자 이름)을 광고한 것이 우선이고, 없으면 첫 None 엔드포인트입니다.
- Sign · SignAndEncrypt · 자동 — 고른 모드·정책과 쓸 사용자 토큰을 모두 만족하는 엔드포인트 가운데 가장 강한 정책을 고릅니다. 맞는 것이 없으면 None 으로 내려가지 않고 연결에 실패합니다(
OPCUA_NO_MATCHING_ENDPOINT).
- 고른 엔드포인트 URL 의 호스트는 입력한 IP 로 바꿔 접속합니다(포트·경로는 서버가 광고한 값). 서버가 자기 호스트명을 광고해도 DNS·hosts 설정이 필요 없습니다.
서버가 어떤 엔드포인트를 광고하는지는 [엔드포인트 조회] 버튼으로 화면에서 바로 볼 수 있습니다 — 엔드포인트 조회 참고.
디스커버리는 엔드포인트 검색이 아닙니다
discovery=true 는 연결할 때 루트 폴더부터 노드 트리 전체를 브라우징해 게이트웨이 로그에 남깁니다. 엔드포인트를 찾는 기능도, 태그를 자동 등록하는 기능도 아닙니다. 서버가 제공하는 엔드포인트(보안 모드·정책)를 보려면 디스커버리가 아니라 [엔드포인트 조회] 를 쓰세요. 노드가 많은 서버에서는 부하가 크므로 평소에는 false 로 두고, NodeId 는 아래 방법으로 찾으세요.
보안 연결 (채널 암호화)
연결 화면의 보안 (채널 암호화) 묶음에서 정합니다. None 이 아니면 엣지가 자기 클라이언트 인증서로 보안 채널을 열고, 맞는 엔드포인트가 없어도 None 으로 내려가지 않습니다.

| 번호 | 칸 | 하는 일 |
|---|---|---|
| ① | 보안 모드 | None (암호화 없음) · Sign (서명) · SignAndEncrypt (서명+암호화, 권장) · 자동 (Sign·SignAndEncrypt 중 가장 강한 것) |
| ② | 보안 정책 | 자동 (서버가 제공하는 가장 강한 정책) 또는 Basic256Sha256 · Aes128_Sha256_RsaOaep · Aes256_Sha256_RsaPss 중 하나. 보안 모드가 None 이면 보이지 않습니다 |
| ③ | 고급 | 펼치면 낡은 정책 허용 확인란. Basic256 · Basic128Rsa15(폐기된 정책)만 제공하는 옛 서버에 한해 켭니다. 안전하지 않습니다 |
- 기본값 — 이미 있던 연결은
None그대로입니다. 연결 추가 화면의 DCS·로봇 카드로 새로 만드는 연결은SignAndEncrypt로 시작합니다. - 자동 정책의 순서 —
Aes256_Sha256_RsaPss>Basic256Sha256>Aes128_Sha256_RsaOaep. - 바꾼 값은 저장해야 적용됩니다.
엔드포인트 조회
IP·포트·서버 이름을 넣고 [엔드포인트 조회] 를 누르면, 엣지가 그 서버에 엔드포인트 목록(GetEndpoints)을 물어 표로 보여 줍니다. 세션을 열지 않으므로 계정이 필요 없고, 서버 인증서를 신뢰하기 전에도 됩니다(접속 3초 · 전체 6초 제한).
![[엔드포인트 조회] 결과 — 번호는 읽는 순서](/ko/assets/images/opcua-sec-endpoints-0ee0b6bafc4d759d75de125ad75c658b.webp)
| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 묶음 머리 오른쪽 | [엔드포인트 조회] — IP 와 포트를 먼저 넣어야 합니다 |
| ② | 표 머리 | 조회한 주소와 열 — 보안 모드 · 보안 정책 · 사용자 인증(Anonymous · UserName · Certificate 등) · 서버 인증서(주체와 SHA-1 지문) |
| ③ | 행 끝 | [이 설정 사용] — 그 행의 보안 모드·정책을 위 칸에 채웁니다. 저장해야 적용됩니다 |
- 정책 칸의 폐기된 정책 배지는
Basic256·Basic128Rsa15입니다. 그 행의 [이 설정 사용] 을 누르면 낡은 정책 허용 이 함께 켜지고, 정책 칸은 그 정책이 아니라 자동 이 됩니다. - 지원 안 함 배지가 붙은 정책으로는 엣지가 연결하지 못합니다.
- 사용자 인증 열에
Certificate가 있어도 엣지는 익명 또는 사용자 이름으로만 로그인합니다 — 지원하지 않는 것 참고.
처음 연결 — 서버 인증서 신뢰
엣지는 처음 보는 서버 인증서를 자동으로 믿지 않습니다. 보안 모드로 처음 연결하면 서버 인증서가 거절되고, 연결 화면(편집)과 연결 상세 화면의 보안 묶음에 다음 안내가 뜹니다.

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 안내 첫 줄 | 서버 인증서를 아직 신뢰하지 않아 연결하지 않았다는 안내 |
| ② | 인증서 주체 · 지문 (SHA-1) | 서버가 내민 인증서. 지문을 서버(DCS·컨트롤러) 화면의 인증서 지문과 대조합니다 |
| ③ | [이 인증서 신뢰] | 확인 창을 엽니다 |
| ④ | 인증서 관리 | OPC UA 서버 › 클라이언트 연결 인증서 탭으로 갑니다 |
[이 인증서 신뢰] 를 누르면 확인 창이 한 번 더 지문을 보여 줍니다.

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 주체 · 지문 | 신뢰할 인증서. 앞의 안내에 뜬 지문과 같은지 다시 봅니다 |
| ② | 안내 | 지문이 서버 화면과 다르면 신뢰하지 않습니다 |
| ③ | [이 인증서 신뢰] | 신뢰합니다. «신뢰했습니다. 곧 다시 연결합니다.» 가 뜹니다 |
신뢰하면 그 인증서를 기다리던 연결의 재접속 대기를 풀어 곧 다시 연결합니다. 연결되면 안내가 초록색으로 바뀝니다.

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 상태 줄 | «보안 연결됨 (SignAndEncrypt)» — 괄호 안은 연결에 설정한 보안 모드입니다(자동이면 auto) |
신뢰 목록은 이 엣지의 모든 OPC UA 연결이 함께 씁니다. 같은 서버에 붙는 연결이 여럿이면 한 번만 신뢰하면 됩니다.
서버가 엣지 인증서를 거절할 때
DCS·컨트롤러도 처음 보는 클라이언트 인증서를 거절하는 경우가 많습니다. 그러면 보안 채널이 거절되고 다음 안내가 뜹니다.

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 안내 첫 줄 | 서버가 보안 채널을 거절했다는 안내 — 대개 서버가 이 엣지 인증서를 아직 신뢰하지 않은 경우 |
| ② | 인증서 주체 · 지문 (SHA-1) | 엣지의 클라이언트 인증서. 서버의 거절 목록에서 이 지문을 찾습니다 |
| ③ | [클라이언트 인증서 내려받기 (.der)] | 이 연결의 엣지 인증서를 내려받습니다 |
| ④ | 인증서 관리 | OPC UA 서버 › 클라이언트 연결 인증서 탭으로 갑니다 |
- ③ 으로 인증서(.der)를 내려받습니다. OPC UA 서버 › 클라이언트 연결 인증서 탭의 «엣지의 클라이언트 인증서» 에서도 연결별로 받을 수 있습니다.
- DCS·컨트롤러 관리자에게 전달해 서버의 신뢰 목록에 넣습니다(서버의 거절 목록에 이미 있다면 그것을 신뢰로 옮겨도 됩니다). 방법은 서버 제조사 매뉴얼을 따릅니다.
- 엣지는 다음 연결 시도에서 다시 붙습니다.
인증서 관리 — OPC UA 서버 › 클라이언트 연결 인증서
OPC UA 서버 화면(/ui/opcua)의 클라이언트 연결 인증서 탭에서 엣지가 클라이언트로 쓰는 인증서를 한곳에서 봅니다. 엣지가 SCADA 에 제공하는 OPC UA 서버의 인증서(클라이언트 인증서 탭)와는 따로입니다.

| 번호 | 자리 | 하는 일 |
|---|---|---|
| ① | 탭 | 클라이언트 연결 인증서 |
| ② | 거절된 서버 인증서 | 엣지가 거절한 서버 인증서 — 주체 · Application URI · 지문 · 유효기간 · 기다리는 연결. [신뢰] 또는 [삭제] |
| ③ | 신뢰한 서버 인증서 | 운영자가 신뢰한 서버 인증서. [신뢰 해제] 하면 거절 목록으로 돌아가고, 다음 연결 시도부터 그 서버에 연결하지 않습니다 |
| ④ | 엣지의 클라이언트 인증서 | OPC UA 연결마다 하나 — 연결 · 보안 모드 · Application URI · 지문 · 유효기간. 아직 보안 모드로 연결해 본 적 없는 연결은 «아직 없음» |
| ⑤ | [내려받기 (.der)] | 그 연결의 엣지 인증서. 서버의 신뢰 목록에 넣을 때 씁니다 |
- [삭제] 한 거절 인증서는 같은 서버에 다시 연결을 시도하면 다시 나타납니다.
- [신뢰 해제] 해도 이미 열린 연결은 다음 재연결 때 끊깁니다.
엣지의 클라이언트 인증서
| 항목 | 값 |
|---|---|
| 종류 | 자체 서명(self-signed), RSA 2048 |
| 유효기간 | 10년. 만료되면 새로 만들어지므로 서버 쪽에 다시 신뢰시켜야 합니다 |
| 만들어지는 때 | 그 연결이 보안 모드로 처음 연결을 시도할 때 |
| Application URI | urn:plantpulse:edge:<OPC ID> — 연결마다 하나 |
| 저장 위치 | /data1/pp-data/opcua-client ($PE_DATA_DIR/pp-data/opcua-client). 신뢰 목록도 여기 있습니다 |
- 연결을 지워도 인증서는 남고, 같은 OPC ID 로 다시 만들면 그 인증서를 다시 씁니다. DCS 에 다시 신뢰시킬 필요가 없습니다.
- 이 디렉터리는 백업 대상입니다. 복원하면 엣지 인증서와 신뢰 목록이 함께 돌아옵니다.
지원하지 않는 것
- X.509 사용자 인증서 로그인 — 사용자 인증은 익명 또는 사용자 이름 + 비밀번호뿐입니다.
- CA 가 서명한 클라이언트 인증서 — 엣지 인증서는 자체 서명만 씁니다.
- HA 짝 박스로 신뢰 목록 복제 — 신뢰 목록은 박스마다 따로입니다. HA 구성이면 박스마다 서버 인증서를 신뢰하고, 서버 쪽에도 박스마다 엣지 인증서를 넣으세요.
태그의 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활성화 - 서버 엔드포인트의 보안 정책(Security Policies)을 고릅니다. 보안 연결이면
Basic256Sha256이상과 Sign and Encrypt 를 켜고, 엣지 인증서를 Kepware 의 신뢰 목록에 넣습니다 — 서버가 엣지 인증서를 거절할 때 참고 - 익명 또는 사용자 계정 활성화
이 게이트웨이의 등록 폼에:
| 칸 | 값 |
|---|---|
| IP | Kepware 서버 PC 의 IP |
| 포트 | 49320 |
| 사용자/비번 | 위에서 만든 계정 (익명이면 비움) |
| 태그 PLC 주소 | ns=2;s=Simulator.Simulator.Sine1 |
흔한 문제와 해결
| 증상 / 메시지 | 가능한 원인 | 해결 |
|---|---|---|
| “Connection refused” / 연결 안 됨 | OPC-UA 서버가 꺼져 있거나 포트 차단 | OPC-UA 서버가 가동 중인지, IP/포트가 맞는지 확인 |
| “User access denied” | 사용자/비번 오류, 또는 서버에서 익명 접속 비허용 | 서버에서 사용자 등록하거나 익명 허용 |
보안 모드 None 인데 연결 실패, 로그에 no SecurityMode=None endpoint | 서버가 None 엔드포인트를 열어 두지 않음 | 보안 모드를 Sign 또는 SignAndEncrypt 로 바꾸고 [엔드포인트 조회] 로 확인 |
연결은 되는데 값이 항상 0 또는 null | 태그 NodeId 오타, namespace 번호 다름 | UA Expert 등으로 같은 NodeId 가 실제로 동작하는지 검증 |
| 끊겼다 붙었다 반복 | 네트워크 불안정, 또는 서버 PC 부하 | 서버 PC 자원 / 케이블 / 스위치 점검 |
보안 연결 오류 (화면 문구)
보안 연결이 실패하면 연결 화면과 연결 상세 화면의 보안 묶음에 아래 문구가 뜹니다. 화면은 한국어·영어로 나옵니다.
| 코드 | 화면 문구 (ko) | 화면 문구 (en) | 해결 |
|---|---|---|---|
OPCUA_SERVER_CERT_UNTRUSTED | 서버 인증서를 아직 신뢰하지 않아 연결하지 않았습니다. 지문을 서버(DCS·컨트롤러) 쪽 인증서와 대조한 뒤 신뢰하세요. | Not connected: the server certificate is not trusted yet. Compare the thumbprint with the server's (DCS / controller) certificate, then trust it. | 지문을 대조하고 [이 인증서 신뢰] |
OPCUA_SERVER_CERT_INVALID | 신뢰한 서버 인증서가 유효하지 않습니다(만료·폐기·용도 불일치). 서버 쪽 인증서를 확인하세요. | The trusted server certificate is not valid (expired, revoked or wrong usage). Check the server's certificate. | 서버 인증서를 새로 발급받은 뒤 새 지문을 신뢰 |
OPCUA_CLIENT_CERT_REJECTED | 서버가 보안 채널을 거절했습니다. 대개 서버가 이 엣지의 클라이언트 인증서를 아직 신뢰하지 않은 경우입니다 — 인증서를 내려받아 서버의 신뢰 목록에 넣으세요. | The server refused the secure channel - usually it does not trust this edge's client certificate yet. Download it and add it to the server's trust list. | 엣지 인증서(.der)를 서버의 신뢰 목록에 넣음 |
OPCUA_PKI_DIR_MISSING | 엣지의 클라이언트 인증서 저장소를 찾지 못했습니다(데이터 볼륨 PE_DATA_DIR 를 확인하세요). | The edge's client certificate store is missing (check the data volume PE_DATA_DIR). | 데이터 볼륨(/data1)이 마운트됐는지 확인 |
OPCUA_PKI_ERROR | 엣지의 클라이언트 인증서 저장소를 읽거나 만들지 못했습니다. 서버 로그를 확인하세요. | The edge's client certificate store could not be read or created. See the server log. | /data1/pp-data/opcua-client 권한·디스크 공간 확인 |
OPCUA_SECURITY_CONFIG_INVALID | 보안 모드·정책 설정이 올바르지 않습니다(폐기된 정책은 '낡은 정책 허용'을 켜야 합니다). | The security mode / policy setting is invalid (a deprecated policy needs 'Allow deprecated policies'). | 보안 모드·정책 값 확인. 폐기된 정책이면 «낡은 정책 허용» |
OPCUA_NO_MATCHING_ENDPOINT | 서버가 설정한 보안 모드·정책·인증 방식에 맞는 엔드포인트를 제공하지 않습니다. [엔드포인트 조회]로 확인하세요. | The server offers no endpoint with this security mode, policy and user token. Check with [Find endpoints]. | [엔드포인트 조회] 에서 서버가 주는 조합을 골라 [이 설정 사용] |
OPCUA_CONNECT_FAILED | 연결하지 못했습니다(네트워크·시간 초과·세션). | Could not connect (network, timeout or session). | IP·포트·방화벽, 서버 가동 상태 확인 |
자주 쓰는 데이터 형식
| 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 예제를 참고하세요.