본문으로 건너뛰기

Sparkplug B (MQTT 기반 IIoT 표준)

Sparkplug B 는 Eclipse Tahu / Cirrus Link 가 정의한 IIoT 메시징 표준 입니다. MQTT 브로커 위에 정해진 토픽 구조 + Protobuf 페이로드를 얹어, 벤더가 다른 장비끼리도 서로 읽을 수 있게 합니다.

엣지는 이것을 두 방향으로 씁니다 — 아래 둘은 서로 다른 기능이니 헷갈리지 마십시오.

방향무엇어디에 적혀 있나
받는다(드라이버)브로커의 Sparkplug 토픽을 구독해 metric 을 캐시하고, 태그로 읽습니다이 문서 앞부분
내보낸다(전송)엣지가 모은 값을 Sparkplug B 로 발행합니다아래 「내보내기」

등록 폼 입력값​

입력 칸무엇을 적나요예시
IP 주소MQTT broker192.168.10.50
포트MQTT broker port1883 (평문) / 8883 (TLS, 추후 지원)
Group ID (group-id)Sparkplug Group — 공장/사업장 단위FactoryA, Plant01
Edge Node ID (edge-node-id)단일 노드 또는 + (모든 노드)+ (기본), edge-01
Keep Alive (keep-alive)MQTT keep-alive 초60 (기본)
Connect Timeout (connect-timeout)MQTT 연결 타임아웃 ms5000 (기본)
Group / Edge Node ID 는 broker 측 발행자(NBIRTH) 와 일치해야 합니다

송신 측 (Eclipse Tahu / Ignition / Cirrus Link MQTT Engine 등) 이 어떤 group / edge ID 로 NBIRTH 를 보내는지 확인 후 동일한 값을 입력하세요. edge-node-id=+ 로 두면 그룹 내 모든 노드를 한 번에 구독합니다.


태그의 PLC 주소 표기​

Sparkplug 의 metric 식별자는 group 이후의 부분만 사용합니다 (group 은 driver 옵션 분리).

표기의미
edge1/TemperatureEdge node edge1 의 node-level metric Temperature
edge1/motor1/RPMEdge node edge1 산하 device motor1 의 metric RPM
edge1/dev2/Status예: 디바이스 상태 boolean
이름 vs alias

Sparkplug 송신 측은 NBIRTH/DBIRTH 시 metric 이름과 alias(숫자) 를 함께 발행합니다. 이후 NDATA/DDATA 는 alias 만 보내서 페이로드 크기를 줄입니다. PlantPulse 드라이버가 자동으로 alias↔이름 맵을 유지하므로, 사용자는 항상 이름 으로만 입력하면 됩니다.


데이터 타입 자동 감지​

Sparkplug B Payload 는 metric 별로 datatype 을 명시합니다 (Int8/16/32/64, UInt8/16/32/64, Float, Double, Boolean, String, DateTime, Bytes 등). 드라이버가 wire 의 datatype 에 따라 적절한 타입으로 변환해 String 으로 캐시하므로 태그의 data_type 은 다음과 같이 매칭하세요.

Sparkplug datatype권장 data_type
Int8 / Int16 / Int32 / UInt8 / UInt16 / UInt32Integer
Int64 / UInt64 / DateTimeLong
FloatFloat
DoubleDouble
BooleanBoolean
String / Text / UUIDString

쓰기 (NCMD / DCMD)​

PlantPulse 의 write 는 자동으로 NCMD/DCMD 로 분기됩니다.

  • edge1/SetPoint (segment 2) → NCMD publish (node 레벨 명령)
  • edge1/dev1/SetPoint (segment 3+) → DCMD publish (device 레벨 명령)

현재 phase 는 모든 명령 값을 String datatype 으로 publish 합니다. 송신 측 (Tahu / Ignition) 이 metric 의 datatype 을 알고 있으므로 보통 자동 변환됩니다.



내보내기 — 엣지가 Sparkplug B 로 발행하기​

엣지가 수집한 값을 표준 Sparkplug B(Protobuf) 로 내보냅니다. 앞부분의 「받는다」와 반대 방향입니다.

🔴 어디로 나가는지부터 — 플랫폼이 아니라 «엣지 위의 브로커» 입니다

발행 대상은 엣지 자신의 MQTT 설정(mqtt.server.host, 기본 127.0.0.1:1883)입니다. 플랫폼으로 쏘는 기능이 아닙니다.

읽는 방향을 이렇게 잡으십시오 — 엣지가 자기 위의 브로커에 실으면, 그 브로커를 구독하는 쪽(SCADA · MES · 상위 IIoT 플랫폼)이 받아 갑니다. 플랫폼으로 올라가는 값은 이것과 별개의 경로입니다.

토픽 형식​

spBv1.0/{groupId}/{type}/{edgeNodeId}[/{deviceId}]
자리무엇이 들어가나
groupIdsparkplug.group.id — 비우면 사이트 id
edgeNodeIdsparkplug.edge.node.id — 비우면 엣지 id
deviceIdOPC 연결 id(opc_id) — 연결 하나가 디바이스 하나입니다

설정​

키기본값무엇
sparkplug.enabletrue발행 켜기
mqtt.server.host · .port127.0.0.1 · 1883발행 대상 브로커 — 엣지의 MQTT 설정을 그대로 씁니다
mqtt.server.user · .password—브로커 자격
sparkplug.group.id사이트 id토픽의 그룹
sparkplug.edge.node.id엣지 id토픽의 노드
sparkplug.device.strategyper-opcOPC 연결 하나 = 디바이스 하나
sparkplug.qos0MQTT QoS
sparkplug.alias.enabletruealias 로 페이로드 줄이기
sparkplug.cmd.enablefalse명령(NCMD/DCMD) 수신
sparkplug.bdseq.path/data1/pp-data/sparkplugb/bdseqbdSeq 를 저장할 파일
device.strategy 는 지금 per-opc 하나입니다

설정 주석에 single 이 함께 적혀 있지만 아직 구현되지 않았습니다. 지금은 per-opc 로만 동작합니다.

metric 이름은 태그 id 입니다​

🔴 metric 이름 자리에 들어가는 것은 tag_id 입니다 — 태그 이름(tag_name)이 아니고, 계층 경로도 아닙니다.

tag_name 은 metric 의 속성으로 따라갑니다.

엣지의 것Sparkplug 속성
설명documentation
태그 이름displayName — 태그 id 와 같으면 생략합니다
단위engUnit

소비자 쪽이 깨지는 축은 tag_id 입니다. 화면에 보이는 이름을 바꾸는 것은 안전하지만, 태그 id 를 바꾸면 받는 쪽의 매핑이 끊깁니다.

수명주기 — 붙을 때와 끊길 때​

  1. 브로커에 붙으면서 NDEATH 를 will 로 맡깁니다 — 엣지가 갑자기 죽어도 브로커가 대신 알립니다
  2. NBIRTH 를 냅니다
  3. 모든 디바이스의 DBIRTH 를 잇따라 냅니다
  4. 그 뒤부터 DDATA 로 값이 흐릅니다

NBIRTH 와 전체 DBIRTH 가 «끝난 뒤에야» 최초 BIRTH 가 완료로 표시됩니다 — 중간에 실패하면 미완료로 남습니다.

bdSeq 는 파일에 남깁니다(위 표의 경로). 그래서 엣지를 재기동하면 소비자 쪽에서는 이전 세션의 NDEATH(옛 bdSeq) 가 먼저 나가고, 증가한 bdSeq 로 새 NBIRTH 가 온 뒤 모든 DBIRTH 가 따라옵니다. 파일이 없거나 읽히지 않으면 처음부터 시작합니다.

alias — 재연결하면 번호가 달라집니다​

alias.enable=true(기본)이면 표준 동작 그대로입니다 — BIRTH 에 이름과 alias 를 함께 싣고, 이후 DDATA 는 alias 만 보냅니다. 페이로드가 작아집니다.

소비자는 «새 BIRTH 가 올 때마다» 매핑을 다시 읽어야 합니다

alias 번호는 세션 단위로 1, 2, 3 … 부여됩니다. 재연결하면 같은 태그가 다른 번호를 받을 수 있습니다. 옛 매핑을 들고 있으면 값이 엉뚱한 태그에 붙습니다 — 화면은 멀쩡하고 값만 틀립니다.

명령 받기 — cmd.enable​

NCMD · DCMD 수신은 구현돼 있고 기본은 꺼져 있습니다(sparkplug.cmd.enable=false). 단계적으로 여는 기능이라 기본값이 꺼짐입니다.

켜기 전에 확인할 것

명령 토픽을 열면 브로커에 붙을 수 있는 쪽이 엣지에 명령을 보낼 수 있습니다. 그 명령이 설비 쓰기까지 이어지는지는 배치와 설정에 따라 다르므로, 켜기 전에 브로커 접근 통제와 쓰기 권한을 함께 확인하십시오.

플랫폼 화면의 「Sparkplug 토픽」은 다른 것입니다​

플랫폼 콘솔의 UNS 화면에도 Sparkplug 식 토픽이 보입니다. 그것은 이름이 어떻게 만들어지는지 보여 주는 미리보기이고, 이 문서의 발행 기능과는 별개입니다.

참고 링크​

  • Eclipse Tahu — <https://eclipse.dev/tahu/>
  • Sparkplug Spec v3.0 — <https://sparkplug.eclipse.org/specification/>
  • Cirrus Link MQTT Engine — <https://www.cirrus-link.com/mqtt-engine/>