OPC-UA 노드 자세히 사용하기
node-red-contrib-opcua 같은 커뮤니티 노드를 통해 외부 OPC-UA 서버 (Kepware, Ignition, 다른 게이트웨이) 와 직접 통신할 수 있습니다. 게이트웨이 자체의 OPC-UA 서버에 접속하는 데도 동일한 노드를 씁니다 (opc.tcp://127.0.0.1:12000, NodeId ns=2;s=...).
내장 OPC-UA 서버에 접속할 땐
화면 메뉴 OPC-UA 뷰어 에서 TCP Endpoint URL 과 NodeId 를 그대로 복사해서 사용. 자세한 건 OPC-UA 노드 뷰어 사용하기 참고.
1. 노드 종류 (node-red-contrib-opcua)
| 노드 | 용도 |
|---|---|
OpcUa-Endpoint | 서버 접속 정보 (host/port/security/auth) — 한 번 만들고 다른 노드에서 공유 |
OpcUa-Item | 단건 노드 정의 — nodeId 를 입력으로 변환 |
OpcUa-Client | Read / Write / Browse / Method call 의 메인 동작 노드 |
OpcUa-Subscribe | 변경 이벤트(MonitoredItem) 구독 — 폴링 없이 push 로 받기 |
OpcUa-Event | OPC-UA Alarm & Event 구독 |
2. Endpoint 만들기
OpcUa-Client 노드 더블클릭 → Endpoint 칸 옆 연필 → 새 endpoint:
| 항목 | 값 (게이트웨이 내장 서버 기준) |
|---|---|
| Endpoint | opc.tcp://127.0.0.1:12000 |
| Security Policy | None (내부) 또는 Basic256Sha256 (외부 운영) |
| Security Mode | None / Sign / Sign & Encrypt |
| Login | OPC-UA 뷰어 화면의 Username/Password 또는 Anonymous (허용 시) |
3. Read / Write 패턴
inject ─▶ OpcUa-Item (nodeId, msg.payload type) ─▶ OpcUa-Client (READ/WRITE) ─▶ debug
OpcUa-Item:
| 항목 | 값 |
|---|---|
| Item | ns=2;s=SITE_00001.OPC_00303.TAG_TEST_00042 |
| DataType | Int32 (실제 태그 데이터타입과 맞춰야 함 — 안 맞으면 BadTypeMismatch) |
OpcUa-Client:
| 항목 | 값 |
|---|---|
| Action | READ 또는 WRITE |
| Endpoint | 위에서 만든 endpoint |
WRITE 시 OpcUa-Item 노드 앞에 change 로 msg.payload = 9999 같이 값을 채우세요.
4. Subscribe — 폴링 없이 변경만 받기
폴링(주기 read) 보다 Subscribe 가 훨씬 효율적입니다. 변경이 없으면 트래픽도 없고, 마이크로초 단위로 도착합니다.
inject (once after deploy) ─▶ OpcUa-Item ×N ─▶ join (배열) ─▶ OpcUa-Subscribe ─▶ debug / function
OpcUa-Subscribe:
| 항목 | 값 |
|---|---|
| Action | SUBSCRIBE |
| Interval | 100 ms 권장 (서버가 클라이언트에게 알릴 최소 주기) |
| Queue size | 10 (서버 폭주 시 버퍼) |
들어오는 메시지에는 msg.payload(값) + msg.topic(NodeId) + msg.timestamp 가 포함됩니다.
5. Browse — 노드 트리 자동 탐색
KEPServerEX 처럼 노드가 수백/수천 개인 환경에서 “어떤 NodeId 가 있는지” 알 때.
inject ─▶ OpcUa-Client (action=BROWSE, msg.payload="ns=2;i=85") ─▶ debug
응답은 자식 노드들의 [ {nodeId, browseName, displayName, ...} ] 배열. 이걸 function 으로 가공해 자동 등록 플로우를 만들 수도 있습니다.
6. 자주 빠지는 함정
| 증상 | 원인 / 해결 |
|---|---|
BadIdentityTokenInvalid | 사용자/비밀번호 또는 인증서 미신뢰. 서버 콘솔에서 클라이언트 인증서 Trust 처리 |
BadTypeMismatch | OpcUa-Item 의 DataType 이 실제 노드 타입과 다름 |
| 매번 연결 끊김 메시지 | Endpoint URL 의 호스트 도메인이 인증서 CN 과 다름 — 인증서 재발급 또는 URL 의 호스트 를 인증서 CN 과 맞추기 |
| Subscribe 가 한 번만 발화 | OpcUa-Subscribe 는 한 번만 “등록” 하면 됩니다. inject 의 once after deploy 옵션 1번만 사용 |