본문으로 건너뛰기

OPC UA 서버

🎬 Browse the OPC UA node tree · 27초 · 2026.09 기준 화면

게이트웨이 자체가 OPC-UA 서버 를 내장하고 있어, 수집된 태그값을 외부 OPC-UA 클라이언트(SCADA, HMI) 에게 그대로 노출합니다. 이 페이지는 그 내장 서버의 연결 정보 · 보안 설정 과 노드 트리(태그 목록 + 실시간 값 + 시계열), 접속 상태 · 클라이언트 인증서 · 클라이언트 연결 인증서 · 계정을 한 화면(탭 여섯 개)에서 다룹니다.

OPC UA 서버 › 서버 정보 탭 — 탭, 상태, 엔드포인트, 보안, 서버 인증서

번호자리내용
①탭 줄여섯 탭
②상태 카드서버 상태 · 세션 · 구독 · 노출 노드 수
③엔드포인트TCP / TLS 접속 URL 과 제공하는 보안 정책
④보안익명 접속 · 보안 없는 엔드포인트 · 클라이언트 인증서 · 계정
⑤서버 인증서주체 · 지문 · 유효기간, [내려받기 (.der)]

OPC UA 서버 › 노드 탭 — 왼쪽 트리에서 태그를 고르면 오른쪽에 상세가 나옵니다

번호자리내용
①노드 트리엣지 → OPC → 태그, 연결 상태 점과 최신 값
②패널 머리CSV 아이콘 — 주소 공간 내려받기
③노드 상세고른 노드의 정보와 시계열
내장 OPC-UA 서버 사양
  • 구현: Eclipse Milo 1.1.8
  • Transport: opc.tcp 만 (UA Binary). 엔드포인트 경로는 /opcua — opc.tcp://<호스트>:12000/opcua (TCP 포트) · opc.tcp://<호스트>:12443/opcua («TLS» 포트). 12443 도 HTTPS 가 아니라 보안 정책이 걸린 opc.tcp 입니다
  • Security policies: Basic256Sha256 / Aes128_Sha256_RsaOaep / Aes256_Sha256_RsaPss — 각각 Sign · SignAndEncrypt, 두 포트 모두
  • None (보안 없음): opc.ua.server.security.none=yes(기본) 일 때 TCP 포트에만 세션 엔드포인트가 열립니다. Discovery(/opcua/discovery) 는 규격상 늘 None 이지만 세션은 열 수 없습니다
  • User token: Anonymous (opc.ua.server.anonymous=yes, 기본) / UserName+Password / X.509 (서버 신뢰 목록에 있는 인증서만)
  • 서버 인증서: 처음 기동 때 자체 서명(RSA 2048) 으로 만들어 $PE_DATA_DIR/pp-data/opcua/ 에 둡니다 — 업그레이드 뒤에도 같은 인증서 · 신뢰 목록
  • PubSub: 없음 — 발행이 필요하면 Sparkplug B 사용

좌측 메뉴 OPC UA 서버 아이콘 또는 직접 http://<게이트웨이>/ui/opcua 로 이동합니다.


1. 화면 구성​

화면 머리의 탭 여섯 개로 나뉩니다. 주소 끝에 #server · #nodes · #sessions · #certs · #client-certs · #accounts 를 붙이면 그 탭으로 바로 열리고, 붙이지 않으면 그 브라우저에서 마지막으로 본 탭이 열립니다.

탭내용
서버 정보서버 상태 · 가동 시간, 현재 세션 · 구독 · 노출 노드 수. 외부 클라이언트가 접속할 TCP / TLS 엔드포인트 URL(복사 버튼) 과 각 엔드포인트가 실제로 제공하는 보안 정책 배지. 익명 접속 · 보안 없는 엔드포인트의 켜짐/꺼짐, 클라이언트 인증서 · 계정 수, 서버 인증서(주체 · SHA-1 지문 · 유효기간 · 키)
노드좌측 노드 트리(엣지 → OPC → 태그, 각 OPC 의 연결 상태 점(마우스를 올리면 상태 이름) 과 태그 수, 각 태그의 최신 값) 와 우측 노드 상세(메타 + 실시간 값 + 수치/불리언 태그라면 시계열 차트). 패널 머리의 CSV 아이콘으로 주소 공간을 내려받습니다
접속 상태현재 세션 · 구독 · 모니터링 항목 수, 거절된 접속 수, 세션 목록
클라이언트 인증서보안 채널을 시도한 클라이언트 인증서의 거절됨 · 신뢰됨 목록, [신뢰] [거절 목록으로] [삭제], 서버 인증서 [내려받기 (.der)]
클라이언트 연결 인증서엣지가 클라이언트로 외부 OPC UA 서버에 붙을 때 쓰는 인증서. OPC UA 프로토콜 참고
계정기본 관리자 + 추가 계정(읽기 전용 / 읽기·쓰기) 관리

엔드포인트 URL 의 호스트는 opc.ua.server.domain 입니다. 이 값이 루프백(127.0.0.1 · localhost · 0.0.0.0, 설치 기본값) 이면 브라우저가 접속한 호스트로 URL 을 만들어 줍니다 — 원격에서 복사한 URL 이 자기 PC 를 가리키지 않도록.


2. NodeId 컨벤션​

각 태그는 다음과 같은 OPC-UA NodeId 로 노출됩니다. 주소 공간의 루트는 엣지 ID 이고(Objects 아래), 그 아래 OPC(연결) 폴더, 그 아래 태그입니다.

ns=2;s=<EDGE_ID>.<OPC_ID>.<TAG_ID>

예: ns=2;s=EDGE_00303.OPC_00303.TAG_TEST_00042

  • 태그에 태그 그룹 이 있으면 OPC 폴더 아래 GROUP.<그룹> 폴더에 매달리지만, 태그의 NodeId 는 위 형식 그대로입니다.
  • OPC 폴더마다 _Status 폴더가 있고 Connected · State · LastError · LastCollectedAt · CycleMs 를 2 초 주기로 내줍니다(읽기 전용).
  • edge.id 가 비었거나 EDGE_ + 대문자 · 숫자 · _ 형식이 아니면 이름을 지어내지 않고 OPC-UA 서버를 띄우지 않습니다(ERROR 로그).
2026.11 부터 NodeId 가 바뀌었습니다

이전 판의 NodeId 는 EDGE.<SITE_ID>.<OPC_ID>.<TAG_ID> 였습니다. 지금은 루트가 엣지 ID 이고 사이트 계층이 없습니다. 호환 별칭이 없으므로 업그레이드 뒤에는 SCADA 쪽 NodeId 를 다시 맞춰야 합니다.

외부 클라이언트(UaExpert, KEPServerEX, Ignition 등) 에서 이 NodeId 로 직접 구독할 수 있습니다. 상세 패널의 NodeId 우측 복사 버튼이 있어 클립보드로 가져가기 쉽습니다.


3. 노드 트리 — 검색 / 새로고침​

  • 트리 상단 검색창에 텍스트를 입력하면 트리·OPC·태그 이름을 실시간 부분 일치 로 필터링 합니다. 매칭이 자손에 있으면 부모(OPC, 엣지) 도 자동으로 펼쳐 표시합니다.
  • 화면 머리의 새로고침(↻) 버튼 — 트리와 각 탭의 정보를 다시 가져옵니다. 평소엔 자동으로 갱신되니 거의 누를 일 없습니다.
  • 각 행의 ◂/▾ 토글로 서브트리를 접고/펼 수 있습니다. 검색이 활성일 때는 매칭 노출을 위해 자동으로 펼쳐지고, 검색을 비우면 직전 토글 상태로 복원됩니다.
  • 긴 값 자동 줄임 (ellipsis) — 트리 노드의 현재 값 이 컬럼 폭을 넘으면 text-overflow: ellipsis 로 … 처리됩니다. 마우스 hover 시 tooltip 으로 전체 평문이 노출 — JSON / 긴 STRING 값이 트리 레이아웃을 깨지 않도록 한 보호 장치입니다.
값 갱신 주기

트리에 표시되는 값은 노드 탭이 보이는 동안 2 초 주기 로 자동 갱신됩니다 (/ui/opcua/tree). 트리 구조나 펼침 상태, 우측 상세, 차트는 그대로 유지됩니다.


4. 노드 상세 + 시계열 차트​

태그 행을 클릭하면 우측에 다음이 표시됩니다.

  • NodeId (복사 가능)
  • Tag ID / DataType / PLC Address / Alias / Description
  • Value (현재값 + 마지막 갱신 시각, ms 까지)
  • Status (OK / ERROR (메시지))

값 타입에 따라 차트 종류가 자동으로 달라집니다.

4.1 수치 / 불리언 (ECharts 라인 차트)​

값이 숫자형(Integer/Long/Float/Double 등) 또는 불리언 이면 ECharts 시계열 라인 차트 가 그려집니다.

차트 기능설명
범위 선택차트 우상단 콤보로 1분/5분/10분/30분/1시간(default)/3시간/12시간/24시간 선택 — Cassandra(tm_tag_point) 의 과거 데이터를 즉시 가져와 다시 그립니다
dataZoom 슬라이더차트 하단 회색 톤(연한 그레이) 드래그바 — 가로 zoom / pan
자동 추가2 초 주기 폴링이 새 값을 차트에 추가합니다
Tooltip마우스 오버 시 ms 단위 시각 + 값
불리언step end 형태(계단형) 로 0/1 토글을 시각화
샘플링5,000 점 까지 보유, 그 이상이면 가장 오래된 점부터 제거 (lttb 다운샘플링)

4.2 STRING (vis-timeline 박스 차트)​

값이 STRING 이면 ECharts 라인 대신 vis-timeline 의 range box 차트 가 그려집니다 — 같은 값이 연속되는 구간을 한 박스로 묶어 시각적으로 상태 변화 시점 을 강조하는 형태입니다.

항목설명
박스 = 같은 값 연속 구간예: "RUNNING" 이 12:00~12:35 동안 유지되면 그 구간 하나의 박스
박스 색값 해시 기반 자동 — 같은 텍스트는 항상 같은 색
박스 라벨값 평문 (긴 경우 hover 시 전체)
시간축 zoom/panvis 기본 인터랙션 (mouse wheel / drag)
갱신폴링 시 history 를 ASC 정렬해서 데이터셋 전체 재구성 (변동이 거의 없으면 깜빡임 없음)
노드 변경 시disposeStringTimeline() 으로 인스턴스 destroy + 새 노드의 차트 재생성

STRING 차트는 상태 머신 로그(READY → RUNNING → ERROR → IDLE) 같은 비숫자 시계열을 한눈에 보기에 적합합니다. 같은 톤은 태그 값 추이 보기 (tag-view) 에도 적용됩니다.


5. 엣지 시스템 태그​

OPC_SYSTEM_<EDGE_ID> 라는 시스템 연결 하나가 자동으로 트리에 보입니다. 게이트웨이 자기자신의 상태를 OPC-UA 노드로 노출하는 시스템 태그 38 개 모음이고, 태그 ID 는 TAG_<EDGE_ID>_90000 ~ TAG_<EDGE_ID>_90037 입니다.

대표 태그:

태그 이름의미
THREAD_COUNTJVM 스레드 수
TAG_COUNT등록된 태그 총 개수
SERVER_STARTED_TIMESTAMP엣지 기동 시각(epoch ms)
PLC_CON_CONNECTED_COUNT지금 연결된 연결(OPC) 수
MEMORY_USED_PERCENT메모리 사용률(%)

시스템 연결의 연결 상태 는 항상 CONNECTED 로 표시되고(자기자신이라 연결 개념이 없음), _Status 폴더가 없습니다.


6. 외부 클라이언트와 함께 쓰기 — 흐름​

  1. 서버 정보 탭에서 엔드포인트 URL 을 복사 (예: opc.tcp://<게이트웨이>:12000/opcua). 경로 /opcua 를 빼면 붙지 않습니다 — 서버가 HELLO 를 BadTcpEndpointUrlInvalid 로 거절합니다.
  2. UaExpert / KEPServerEX 등 OPC-UA 클라이언트에서 새 서버 추가 → 위 URL 입력 → 보안 정책 선택.
    • 보안 없는 엔드포인트 가 켜져 있으면 TCP 포트에서 None 으로 접속할 수 있습니다.
    • 보안 정책(Basic256Sha256 등) 으로 접속하면 처음에는 서버가 클라이언트 인증서를 거절합니다. 클라이언트 인증서 탭의 거절됨 목록에서 지문을 SCADA 쪽 인증서와 대조한 뒤 [신뢰] — 재시작 없이 다음 접속부터 적용됩니다. 클라이언트 쪽에서도 서버 인증서를 신뢰해야 하면 [내려받기 (.der)] 로 받아 넣습니다.
  3. 인증 모드:
    • Anonymous — 서버 정보 탭에서 익명 접속 이 켜짐이면 그대로 접속. 익명 세션은 읽기만 됩니다.
    • Username / Password — 기본 관리자(opc.ua.server.user / opc.ua.server.password) 또는 계정 탭의 추가 계정.
    • X.509 — 서버 신뢰 목록에 있는 인증서만 받습니다.
  4. 접속 후 NodeId ns=2;s=... 형식의 태그를 그대로 구독.

7. 계정 · 쓰기​

  • 기본 관리자(opc.ua.server.user / password) 는 읽기·쓰기 이고 화면에서 지울 수 없습니다. 비밀번호는 설정 화면에서 바꿉니다.
  • 계정 탭에서 추가 계정을 만듭니다 — 아이디는 영문·숫자로 시작하고 영문·숫자·._- 만, 64자까지(기본 관리자 아이디는 못 씀), 비밀번호는 8~128자. 권한은 읽기 전용 / 읽기·쓰기. 권한 변경은 열린 세션에 바로 적용되고, 삭제 · 사용 안 함 · 비밀번호 변경은 그 계정의 세션을 끊습니다.
  • 익명이 아닌 세션(기본 관리자 · 읽기·쓰기 계정 · 신뢰된 X.509 인증서) 이 태그 노드에 쓰면 그 값이 해당 PLC 로 전달됩니다(드라이버 쓰기와 같은 흐름, tm_tag_write 에 계정 · 보안 정책 · 접속 IP 기록). PLC 쓰기가 성공했을 때만 노드 값이 바뀝니다.
  • 쓰기가 거절되는 경우:
결과원인
Bad_NotWritable읽기 전용 태그(client_access=R) — 누구에게나
Bad_UserAccessDenied익명 세션, 읽기 전용 계정, 또는 HA 쌍에서 이 엣지에 PLC 쓰기 권한이 없음
Bad_InternalErrorPLC 쓰기 실패, 또는 기동 중이라 쓰기 경로가 아직 준비되지 않음
익명 · 보안 없음은 출하 기본값입니다

opc.ua.server.anonymous 와 opc.ua.server.security.none 은 둘 다 기본 yes 입니다. 이 상태에서는 네트워크의 어느 클라이언트든 인증서 · 비밀번호 없이 모든 태그를 읽을 수 있습니다(익명 세션의 쓰기는 막혀 있습니다). 운영망에서는 설정 화면 OPC UA 서버 탭의 익명 접속 허용 · 보안 없는 엔드포인트 를 끄세요.


8. 트러블슈팅​

증상점검 포인트
트리에 OPC 가 안 보임자주 하는 작업 → 새 PLC 연결 추가 가 끝났는지, 게이트웨이가 그 OPC 의 수집 자동 시작 옵션이 켜져 있는지
태그 옆 값이 - 로 나옴해당 태그가 한 번도 갱신된 적 없음. 수집 시작 / OPC 연결 / Quality 점검
클라이언트가 BadTcpEndpointUrlInvalid 로 접속 실패엔드포인트 URL 끝의 /opcua 가 빠짐
트리에는 보이는데 외부 클라이언트가 NodeId 를 못 찾음오타, 또는 2026.11 이전의 EDGE.<SITE_ID>... 형식 NodeId 를 쓰고 있음 (§2)
서버 정보 탭이 «중지»edge.id 가 비었거나 형식이 틀림, 또는 PE_DATA_DIR 을 얻지 못함 — 둘 다 서버를 띄우지 않고 ERROR 로그를 남깁니다
보안 정책으로 접속하면 거절됨클라이언트 인증서가 아직 신뢰되지 않음 — 클라이언트 인증서 탭에서 [신뢰]
None 으로 접속이 안 됨보안 없는 엔드포인트 가 꺼져 있거나 12443 포트로 접속함(None 세션은 TCP 포트에만)
쓰기가 Bad_NotWritable / Bad_UserAccessDenied§7 표 참고
차트가 비어있음그 태그의 카산드라 history 가 아직 없음(방금 등록한 태그) — 잠시 기다리면 점이 추가됨
차트가 들쭉날쭉 보임범위를 24시간 로 키우면 자동 다운샘플링이 들어가 부드러워집니다
클라이언트가 서버 인증서를 신뢰하지 않음게이트웨이의 자체 서명 인증서 — 클라이언트에서 "Trust" 처리하거나 [내려받기 (.der)] 로 받은 인증서를 넣습니다

9. 더 알아보기​

  • Node-RED (/ui/flow) — 같은 태그값을 흐름으로 가공/외부 발송. 자주 하는 작업 → Node-RED 로 자동화 / IIoT 플로우 참고.
  • REST API — 같은 데이터를 HTTP 로 직접 가져올 수 있습니다. 고급 / 통합 파트너용 → REST API 참고.
  • 드라이버 기술 레퍼런스 → OPC-UA — 게이트웨이의 OPC-UA 클라이언트 측 (외부 OPC-UA 서버에 접속해 데이터를 가져오는 경로) 설명.