メインコンテンツまでスキップ

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