Sparkplug B (MQTT 기반 IIoT 표준)
Sparkplug B 는 Eclipse Tahu / Cirrus Link 가 정의한 IIoT 메시징 표준 입니다. MQTT 브로커 위에 정해진 토픽 구조 + Protobuf 페이로드를 얹어, 벤더가 다른 장비끼리도 서로 읽을 수 있게 합니다.
엣지는 이것을 두 방향으로 씁니다 — 아래 둘은 서로 다른 기능이니 헷갈리지 마십시오.
| 방향 | 무엇 | 어디에 적혀 있나 |
|---|---|---|
| 받는다(드라이버) | 브로커의 Sparkplug 토픽을 구독해 metric 을 캐시하고, 태그로 읽습니다 | 이 문서 앞부분 |
| 내보낸다(전송) | 엣지가 모은 값을 Sparkplug B 로 발행합니다 | 아래 「내보내기」 |
등록 폼 입력값
| 입력 칸 | 무엇을 적나요 | 예시 |
|---|---|---|
| IP 주소 | MQTT broker | 192.168.10.50 |
| 포트 | MQTT broker port | 1883 (평문) / 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 연결 타임아웃 ms | 5000 (기본) |
송신 측 (Eclipse Tahu / Ignition / Cirrus Link MQTT Engine 등) 이 어떤 group / edge ID 로 NBIRTH 를 보내는지 확인 후 동일한 값을 입력하세요. edge-node-id=+ 로 두면 그룹 내 모든 노드를 한 번에 구독합니다.
태그의 PLC 주소 표기
Sparkplug 의 metric 식별자는 group 이후의 부분만 사용합니다 (group 은 driver 옵션 분리).
| 표기 | 의미 |
|---|---|
edge1/Temperature | Edge node edge1 의 node-level metric Temperature |
edge1/motor1/RPM | Edge node edge1 산하 device motor1 의 metric RPM |
edge1/dev2/Status | 예: 디바이스 상태 boolean |
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 / UInt32 | Integer |
| Int64 / UInt64 / DateTime | Long |
| Float | Float |
| Double | Double |
| Boolean | Boolean |
| String / Text / UUID | String |
쓰기 (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}]
| 자리 | 무엇이 들어가나 |
|---|---|
groupId | sparkplug.group.id — 비우면 사이트 id |
edgeNodeId | sparkplug.edge.node.id — 비우면 엣지 id |
deviceId | OPC 연결 id(opc_id) — 연결 하나가 디바이스 하나입니다 |
설정
| 키 | 기본값 | 무엇 |
|---|---|---|
sparkplug.enable | true | 발행 켜기 |
mqtt.server.host · .port | 127.0.0.1 · 1883 | 발행 대상 브로커 — 엣지의 MQTT 설정을 그대로 씁니다 |
mqtt.server.user · .password | — | 브로커 자격 |
sparkplug.group.id | 사이트 id | 토픽의 그룹 |
sparkplug.edge.node.id | 엣지 id | 토픽의 노드 |
sparkplug.device.strategy | per-opc | OPC 연결 하나 = 디바이스 하나 |
sparkplug.qos | 0 | MQTT QoS |
sparkplug.alias.enable | true | alias 로 페이로드 줄이기 |
sparkplug.cmd.enable | false | 명령(NCMD/DCMD) 수신 |
sparkplug.bdseq.path | /data1/pp-data/sparkplugb/bdseq | bdSeq 를 저장할 파일 |
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 를 바꾸면 받는 쪽의 매핑이 끊깁니다.
수명주기 — 붙을 때와 끊길 때
- 브로커에 붙으면서
NDEATH를 will 로 맡깁니다 — 엣지가 갑자기 죽어도 브로커가 대신 알립니다 NBIRTH를 냅니다- 모든 디바이스의
DBIRTH를 잇따라 냅니다 - 그 뒤부터
DDATA로 값이 흐릅니다
NBIRTH 와 전체 DBIRTH 가 «끝난 뒤에야» 최초 BIRTH 가 완료로 표시됩니다 — 중간에 실패하면 미완료로 남습니다.
bdSeq 는 파일에 남깁니다(위 표의 경로). 그래서 엣지를 재기동하면 소비자 쪽에서는 이전 세션의 NDEATH(옛 bdSeq) 가 먼저 나가고, 증가한 bdSeq 로 새 NBIRTH 가 온 뒤 모든 DBIRTH 가 따라옵니다. 파일이 없거나 읽히지 않으면 처음부터 시작합니다.
alias — 재연결하면 번호가 달라집니다
alias.enable=true(기본)이면 표준 동작 그대로입니다 — BIRTH 에 이름과 alias 를 함께 싣고, 이후 DDATA 는 alias 만 보냅니다. 페이로드가 작아집니다.
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/>