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/>