글 / Modbus·OPC UA

OPC UA 주소 공간과 NodeId

NodeId의 ns 숫자는 서버마다 다를 수 있으므로 네임스페이스 URI로 인덱스를 조회하여 사용한다.

작성일 · 읽는 시간 2분 · OPC UA 1.05 기준

주소 공간

OPC UA 서버는 데이터를 서로 연결된 노드(Node)들로 제공한다. 설비 하나가 객체 노드이고 그 하위에 온도, 속도 같은 변수 노드가 위치한다. 노드와 노드를 잇는 연결이 참조(Reference)이고, 이 전체를 주소 공간(AddressSpace)이라 한다.

각 노드는 속성(Attribute)을 갖는다. NodeId, BrowseName, DisplayName은 모든 노드에 있고, 변수 노드에는 값을 담는 Value가 추가로 있다.

객체 노드와 변수 노드가 참조로 이어진 주소 공간

NodeId

NodeId는 노드를 식별하는 값으로, 네임스페이스 인덱스와 식별자 종류, 식별자로 구성된다. 문자열로 표기할 때는 ns=인덱스;종류=식별자 형식을 사용한다.

text
i=2258                     네임스페이스 0, 숫자 식별자 (서버의 현재 시각)
ns=2;i=1001                네임스페이스 2, 숫자 식별자
ns=2;s=Line1.Temperature   네임스페이스 2, 문자열 식별자
  • i: 숫자
  • s: 문자열. 대소문자를 구분한다.
  • g: GUID
  • b: 바이트열. Base64로 표기한다.

네임스페이스 0은 ns=0;을 생략하고 식별자만 표기한다.

NodeId 문자열 표기를 이루는 세 부분과 식별자 종류

서버별 네임스페이스 인덱스

네임스페이스는 식별자를 부여한 주체를 나타내는 URI이다. ns=2의 2는 서버가 보유한 네임스페이스 배열(NamespaceArray)에서 해당 URI가 놓인 위치이다.

  • 0: OPC UA 표준(http://opcfoundation.org/UA/)
  • 1: 해당 서버 자신
  • 2 이상: 서버가 적재한 정보 모델. 순서는 서버가 결정한다.

같은 정보 모델이라도 서버에 따라 2번일 수도 3번일 수도 있다. ns=2;s=...를 코드에 하드코딩하지 않고, 세션을 열 때마다 URI로 인덱스를 조회한다.

같은 네임스페이스 URI가 서버마다 다른 인덱스에 놓이는 예

pythonfind_node.py
from asyncua import Client, ua


async def find_node(client: Client):
    # URI로 인덱스를 찾은 뒤 NodeId를 만든다
    idx = await client.get_namespace_index("urn:example:line1")
    return client.get_node(ua.NodeId("Line1.Temperature", idx))