PubSub

OPC UAでは、通信レイヤーと情報モデルレイヤーは分離しています。このため、Client&Sever通信以外にPubSub通信の使用が可能です。

ユースケース

PubSubは、コントローラ間、および、コントローラとHMI間の構成可能なピアツーピア通信を使用します。ピアツーピア通信は直接接続されておらず、互いの存在について知る必要さえありません。 PulisherとSubscriberのポイントツーポイント接続はデータ配信である可能性があります。非同期ワークフロー、たとえばオーダー処理アプリケーションは、メッセージキューに注文を出すことができます。その時点から1人以上のWorkerによりオーダーの処理が可能になります。複数のシステムへのロギングセンサーまたはアクチュエーターはモニタリングシステム、HMI、クエリを実行するためのアーカイブアプリケーションなどにログを書き込むことができます。デバイスを表すOPC UA Severは、クラウドでホストされているアプリケーションにデータをストリーミングできます。

PubSubの2つの例

UDPトランスポートと、バイナリエンコードメッセージを備えたPubSubは、少量のデータを頻繁に送信する環境に適しています。また、1対1、および、1対多の構成でのデータ交換も可能です。 

JSONデータエンコーディングで確立された標準メッセージングプロトコル(AMQPやMQTTなど)を使用すると、クラウド統合のパスがサポートされ、クラウドのバッチ分析システムで情報を簡単に処理できます。

PubSubの概念

DataSetは、パブリッシャーによって送信、提供され、サブスクライバーによって受信、消費されるメッセージのペイロードを構成します。PubSubの情報モデルは、PubSub構成の作成、変更、および公開で使用されるOPC UAのAddressSpaceのObject(PublishSubscribe Object)を指定します。パブリッシャーは、複数のDataSetをメッセージ指向ミドルウェアに送信し、サブスクライバーは複数のパブリッシャーからメッセージを受信します。パブリッシャーとサブスクライバーはお互いに疎結合です。 彼らはしばしばお互いを知りません。

メッセージは、NetworkMessageとして送信されます。 各々のNetworkMessageは、ヘッダー情報(IDやセキュリティデータなど)と1つ以上のDataSetMessage(ペイロード)が含まれます。DataSetMessageは、構成されたメッセージセキュリティに従ってサインおよび暗号化できます。セキュリティキーServerは、メッセージセキュリティに必要なセキュリティキーの配布を担当します。

PubSubのEntityは図の通りです。

Dataset

DataSetMessageはDataSetから作成されます。DataSetWriterと呼ばれるパブリッシャーのコンポーネントはDataSetMessagesの連続シーケンスを生成します。DataSetの構文とセマンティクスはDataSetMetaDataによって記述されます。

パブリッシャーのDataSetに含まれる情報(Variable)の選択とデータ取得パラメータはPublishedDataSetと呼ばれ、Data Collectorにより収集されます。DataSetは、Eventを表す名前と値のペア、またはVariableのリストと考えることができます。DataSet Fieldは任意の情報を表すように定義できます。たとえば、パブリッシャーの内部Variable、パブリッシャーからのEvent、パブリッシャーによって収集されたEvent、ネットワークデータ、またはサブデバイスからのデータなどです。

DataSetClass

DataSetはパブリッシャーごとに生成することも、DataSetClassから派生させることも可能です。DataSetClassはDataSetのコンテンツを宣言するテンプレートです。 DataSetClassはグローバルに一意のIDであるDataSetClassIdによって識別されます。DataSetMetaDataは、DataSetClassに基づいて構成されたPublishedDataSetで同一の構成です。DataSetClassIdは、DataSetMetaDataの対応するフィールドにあります。NetworkMessageのすべてのDataSetMessageが、同じDataSetClassのインスタンスであるDataSetから作成される場合、このクラスのDataSetClassIdをNetworkMessageヘッダーで提供できます。

DataSetMetaData

DataSetMetaDataはDataSetのコンテンツとセマンティクスを記述します。 構造体の説明はDataSet Attribute名とDataTypeを含む一連のフィールドが含まれます。DataSetMetaDataのフィールドの順序は公開されたDataSetMessagesの値の順序と一致する必要があります。

サブスクライバーは、DataSetMessageの値をDataSetにデコードするためにDataSetMetaDataを使用します。サブスクライバーは公開されたデータをさらに処理または表示するためにAttribute名とDataTypeを使用します。

DataSetMessageは準拠するDataSetMetaDataのバージョンも含まれ、サブスクライバーは対応するDataSetMetaDataがあるかどうかを確認できます。DataSetMetaDataは単一のPublishedDataSetに固有である場合もあれば、DataSetClassに基づいて構成されすべてのPublishedDataSetに対して同一である場合もあります。

DataSetMetaDataを取得するための複数のオプション


サブスクライバーは最初のDataSetMetaDataを取得するために複数のオプションがあります。パブリッシャーが提供するPubSub構成モデルのコンフィグレーションServer、またはディレクトリServerから必要な構成情報を取得できます。

サブスクライバーはPubSub構成モデルで定義されたMethodをサポートします。サブスクライバーはパブリッシャーからNetworkMessageとしてDataSetMetaDataを受信します。 これにはサブスクライバーがNetworkMessageのオプション情報が必要になる場合があります。

DataSetMetaDataを交換するためのオプション


コンフィグが変更された場合、パブリッシャーとサブスクライバーの間でDataSetMetaDataの交換が必要です。交換するためには複数のオプションがあります。

DataSetMetaDataはコンテンツが変更されたDataSetMessagesが送信される前に、パブリッシャーからサブスクライバーにNetworkMessageとして送信されます。メッセージ指向ミドルウェアのマッピングはサブスクライバーがDataSetMetaDataを要求する方法を定義します。 受信したDataSetMessageのConfigurationVersionと一致する新しいDataSetMetaDataを受信していない場合、サブスクライバーはエラー状態になります。サブスクライバーはパブリッシャーのDataSetが更新されるとPubSub構成モデルで定義されたOPC UA Methodを介して自動的に更新されます。

サブスクライバーは、OPC UA Clientであり、PubSub構成モデルによって公開された情報を介してパブリッシャーまたは コンフィグServerから更新を取得できます。パブリッシャーのDataSetが変更されるとサブスクライバーは製品固有の構成手段で更新されます。

DataSetMessage Field

DataSetMessage Fieldは、DataSetMessage内のDataSet Fieldを意味します。 DataSet Fieldは、実際の値、ステータス、タイムスタンプなどの値に関する情報が含まれています。DataSet FieldはDataSetMessage FieldのDataValue、Variant、またはRawDataとして表すことができます。

値、ステータス、タイムスタンプをDataSetMessageに含める必要がある場合はDataVariableとして表現されます。値または不良ステータスをDataSetMessageに含める必要がある場合は、 Variantとして表現されます。RawDataの表現は最も効率的な形式でDataSetごとのステータスとタイムスタンプの通信で使用されます。

DataSetMessage

DataSetMessageはDataSetから作成されます。 ヘッダーとDataSetのエンコードされたFieldで構成されます。DataSetMessagesはパブリッシャーのデータ取得または情報ソースに関する情報は含まれていません。

構成されたDataSetMessageContentMaskに応じ、DataSetMessageは、さまざまな形式でさまざまな詳細で存在する場合があります。 DataSetMessagesは、パブリッシャーのデータ取得、または情報ソースに関する情報は含まれていません。

追加されるHeaderの情報は次の通りです。

DataSetWriterId
DataSetWriterを識別すると同時にPublishedDataSetを識別します。
Sequence number
DataSetMessageごとに増分される数値で、順序を確認し欠落しているメッセージを検出するために使用されます。
Timestamp
DataSetMessageのデータがいつ取得されたかを説明するタイムスタンプを提供します。
Version
DataSetMetaDataの構成に関するバージョン情報を提供します。
Status
DataSetMessageのデータに関するステータス情報を提供します。
Keep alive
設定された期間、もしくはDataSetMessagesが送信されない場合、Keep Alive DataSetMessageは、パブリッシャーがまだ生きていることをサブスクライバーに通知するために送信されます。
一部のエンコーディングは、キーフレームのDataSetMessagesと、デルタフレームのDataSetMessagesを区別します。 キーフレームのDataSetMessageは、DataSetのすべてのフィールドの値が含まれています。DataSetMessageは前のフレーム以降に変更されたサブセットのみがDataSetMessage含まれます

NetworkMessage

NetworkMessageは、DataSetMessagesのコンテナであり、DataSetMessagesで共有される情報が含まれています。 この情報は次のもので構成されています。

PublisherId
パブリッシャーを識別します。
Security data
メッセージセキュリティをサポートするエンコーディングでのみ使用でき、関連情報はメッセージマッピングで指定されます。
Promoted fields
データセットから選択されたフィールドでヘッダー内で送信されます。
Payload
1つ以上のDataSetMessageです。

Message Security

PubSubのメッセージセキュリティは、パブリッシュされたメッセージペイロードの整合性と機密性に関係します。セキュリティのレベルは次のとおりです。

・セキュリティなし
・サインはあるが暗号化は行わない
・サインと暗号化

メッセージセキュリティに使用されるキーは、SecurityGroupのコンテキスト(システム全体で状態を保持するために使われるもの)で管理され、暗号化キーの一般的な配布フレームワークを定義します。 メッセージセキュリティに関連するすべてのパラメータは、ブローカーレベルのトランスポートセキュリティとは無関係です。トランスポートプロトコルマッピングは独立しており、OPC UAによって定義されています。

Transport Security

トランスポートセキュリティは、トランスポートプロトコルマッピングに固有です。ブローカーベースを使用する場合、パブリッシャーとブローカー、サブスクライバーとブローカー間のトランスポートセキュリティにより機密性と整合性を確保できます。ブローカーレベルのセキュリティはすべてのパブリッシャーとサブスクライバーがブローカーリソースへのアクセスを許可する資格情報を持っている必要があります。

トランスポートセキュリティは、man-in-the-middle攻撃のリスクを伴う可能性があります。 ブローカーは、メッセージを読み取ることができるため、ブローカーを信頼する必要があります。 トランスポートセキュリティとメッセージセキュリティを組み合わせるとこのリスクが軽減されます。

SecurityGroup

SecurityGroupは、パブリッシャーとサブスクライバーの間で交換されるNetworkMessagesのサブセットのメッセージセキュリティ設定と、セキュリティキーを表す抽象化です。セキュリティキーは、NetworkMessageの暗号化と復号化、および、NetworkMessageのサインの生成と確認に使用されます。セキュリティキーサービス(SKS)は、セキュリティグループを管理し、セキュリティグループのロールとそのアクセス許可の間のマッピングを維持し、パブリッシャーまたはサブスクライバーがSecurityGroupのセキュリティキーにアクセスできるかどうかを定義します。SecurityGroupは、SecurityGroupIdと呼ばれる一意の識別子で識別されSKS内でユニークです。公開データセットのパブリッシャーは、SecurityGroupIdを知っている必要があります。

サブスクライバーの場合、SecurityGroupIdはDataSetMetaDataとともにメタデータとして配布されます。SecurityGroupIdのメタデータは、責任のあるSKSのEndpointDescriptionが含まれています。パブリッシャーとサブスクライバーは、EndpointDescriptionを使用し、SKSにアクセスしSecurityGroupIdを使用し、SecurityGroupのセキュリティキーを取得します。

パブリッシャー

パブリッシャーは、NetworkMessagesをメッセージ指向ミドルウェアに送信するPubSubのEntityです。通常、パブリッシャーはOPC UA Serverでもあります。 ただし、抽象的なPubSubの概念の場合、任意のEntityであり、個々または特定のネットワークノード(IPまたはMACアドレス)、または、特定のアプリケーションであると想定するべきではありません。

単一のパブリッシャーであっても、1つ以上のメッセージ指向ミドルウェアに対し、複数のPublishedDataSetと複数のDataSetWriterをサポートする場合があります。DataSetWriterは、パブリッシャーの論理コンポーネントです。パブリッシャーがOP CUA Serverの場合、AddressSpaceでパブリッシャー構成を公開でき、構成ツールはOPC UAの定義を介して作成できます。

パブリッシャーメッセージの送信のステップ

パブリッシャーメッセージの送信のステップは下記の通りです。

PublishedDataSet

送信の最初のステップは、公開されるDataSetで、PublishedDataSetと呼ばれます。 PublishedDataSetは、DataSetMetaDataも定義します。Collectionは、OPC UA SeverのAddressSpace内のVariableの監視、OPC UA Eventの処理、またはネットワークパケットからのデータの読み取り機能などが含まれます。

DataSetMessage

次のステップは、DataSetWriterがDataSetを取得し、DataSetMessageを作成します。1つのWriterGroup内のDataSetWriterからのDataSetMessagesは、単一のNetworkMessageに挿入でき、DataSetMessageの作成は次のパラメータによってガイドされます。

・DataSetFieldContentMaskは、値のどのAttibuteをエンコードするかを制御します。
・DataSetMessageContentMaskは、エンコードするHeadderFileを制御します。
・KeyFrameCountは、キーフレーム、または、デルタフレームのDataSetMessageを作成するかどうかを制御します。


結果のDataSetMessageは、DataSetWriterId、DataSetClassId、DataSetMetaDataのConfigurationVersion、および、値のリストとともに次のステップに渡されます。

NetworkMessage

次はNetworkMessageの作成です。 前のステップで提供されたデータをWriterGroupで定義されたPublisherIdと一緒に使用します。 このメッセージの構造はプロトコル固有です。SecurityModeがメッセージセキュリティを必要とする場合、SecurityGroupIdを使用し、SKSからSecurityPolicyとセキュリティキーをフェッチします。この情報は、SecurityModeで必要とされるNetworkMessageを暗号化、または、署名するために使用されます。

MOMへの送信

最後のステップは、構成されたアドレスを介し、NetworkMessageをメッセージ指向ミドルウェアに配信することです。

サブスクライバー

サブスクライバーは、メッセージ指向ミドルウェアから送信されるNetworkMessagesのコンシューマーです。OPC UA Client、OPC UA Sever、OPC UA PubSubメッセージの構造のみを理解するアプリケーションである可能性もあります。サブスクライブするDataSetMessagesおよびメッセージ指向ミドルウェアを決定するのはサブスクライバーを構成するか、検出メカニズムを使用する必要があります。

サブスクライバーは理解していない、または、無関係なメッセージを受信する準備をしなければなりません。NetworkMessageは、NetworkMessageヘッダーに暗号化されていないデータを提供し、関連するパブリッシャー、DataSetMessage、DataSetClasse、または、その他の関連するメッセージコンテンツの識別とフィルタリングをサポートします。NetworkMessageがサインされているか、サインおよび暗号化されている場合、サブスクライバーはサインを検証し、関連するDataSetMessageを復号化するための適切なセキュリティキーが必要になります。

DataSetMessageが選択されると、対応するDataSetReaderに転送され、DataSetにデコードされます。分解されたDataSetは、サブスクライバーでさらに処理、または、ディスパッチされます。サブスクライバーがOPC UA Serverの場合、AddressSpaceでディスパッチされた値をNodeに公開できます。

Message reception

メッセージを受信、デコード、および、解釈するときのサブスクライバー内のプロセスと、それを実行するために必要なパラメータモデルを示します。 サブスクライバーは、必要なメッセージ指向ミドルウェアを選択し、提供されたアドレスを使用し、メッセージ指向ミドルウェアへの接続を確立します。接続が、OPC UA UDPを使用する場合はマルチキャストアドレスであり、MQTTまたはAMQPを使用する場合はメッセージブローカーへの接続です。

サブスクライブが設定されると、サブスクライバーはリスニングを開始します。 NetworkMessageを受信するとシーケンスが開始されます。サブスクライバーは、フィルターで一致しないすべてのメッセージをドロップできるようにしている場合があります。 NetworkMessageが受け入れられたら、復号化してデコードする必要があります。セキュリティパラメータはパブリッシャーの場合と同様の手順です。

対象となるDataSetMessageはDataSetReaderに渡されます。DataSetMetaDataは、DataSetMessageのコンテンツをDataSetにデコードするために使用されます。特に、DataSetMetaDataは、Name、DataType、および、Engineering Unitなど、他の関連Propertyを含む完全なField構文を提供します。

DataSetMessageとDataSetMetaDataの両方が存在する場合、バージョン情報によりサブスクライバーは、バージョンの変更を検出できます。大きな変更が発生した場合、サブスクライバーは更新されたDataSetMetaDataを取得する必要があります。

それ以降の処理はアプリケーション固有です。たとえば、追加のディスパッチングステップは、受信した値をサブスクライバーのAddressSpaceのNodeにマップできます。このようなディスパッチの構成はSubscribedDataSetと呼ばれます。

Security Key Service

セキュリティキーサービス(SKS)は、パブリッシャーがNetworkMessagesにサインし、暗号化し、サブスクライバーが、NetworkMessagesの署名を検証し復号化するために使用できるメッセージセキュリティ用のキーを提供します。個別のキーとシステム内の各SecurityGroupIdを関連付けます。SKSによって公開されたGetSecurityKeys Methodを呼び出し、SecurityGroupIdに必要なキーマテリアルを受信します。GetSecurityKeysは、複数のキーを返すことができ、必要なキーに対しGetSecurityKeysを呼び出さなくても、現在のキーが古くなっているときに次のキーを使用できます。

PubSubKeyServiceTypeは、GetSecurityKeys Methodを指定し、GetSecurityKeys Methodは、パブリッシャーまたはSKSによって実装されます。SetSecurityKeys Methodは、Central SKSがSecurityGroupのセキュリティキーをパブリッシャー、または、サブスクライバーにプッシュするために使用します。 このMethodはOPC UA Client機能を持たないパブリッシャーまたはサブスクライバーによって公開されます。

Message Oriented Middleware

メッセージ志向ミドルウェアは、分散アプリケーション間で、NetworkMessageの送受信をサポートするインフラストラクチャで、OPC UAの仕様はメッセージ志向ミドルウェアを定義していませんが、データの接続、送信、受信を可能にするプロトコルを使用しています。

Broker-less Middleware

このオプションを使用すると、OPC UA PubSubは、ネットワークインフラストラクチャに依存し、NetworkMessageを1つ以上の受信者に配信します。 通常、この目的はネットワークルーター、スイッチ、ブリッジなどのネットワークデバイスが使用します。 このモデルの利点は次のとおりです。

・標準のネットワーク機器のみが必要であり、ブローカーのような追加のソフトウェアコンポーネントは必要ありません。
・メッセージ配信はソフトウェアの仲介なしで直接行われるため待ち時間とオーバーヘッドが削減されます。
・UDPプロトコルはマルチキャストアドレス指定を使用して複数のサブスクライバーをサポートします。

Broker-less Mode

PublishSubscribeは、IPマルチキャストアドレスなど、各アドレスのConnection Objectが含まれ、接続は、DataSetWritersを使用し、1つ以上のグループを含めることができます。グループは、定義された公開間隔を用いてデータセットを公開できます。

公開間隔で、PublishedDataSetのDataSetが収集され、DataSetごとにDataSetMessageが作成されます。 DataSetMessagesは、NetworkMessageでマルチキャストアドレスに送信されます。データFieldをDataSetMessageからVriableにマップするOPC UAアプリケーションはサブスクライバーのDataSetReaderとディスパッチャーにより構成されます。

DataSetReaderの構成は、DataSetMessageをDataSetでデコードする方法を定義します。 SubscribedDataSetは、DataSetのどのFieldがOPC UAのVariableにマップされるかを定義します。OPC UA UDPは、重複保護の保証はないので、DataSetMessagesのシーケンス番号は順序付けと重複検出のソリューションを提供します。

Broker-based model

パブリッシャーは、PubSubConfigurationモデルを介して構成します。ブローカーごとのConnection Objectが含まれています。ブローカーは接続内のURLを介し構成されます。接続には特定のキューまたはトピックを識別する1つ以上のグループを含めることができ、各グループはメッセージングプロトコルの必要に応じ、データセットをフォーマットする1つ以上のDataSetWriterが含まれます。データセットはEventFieldのリストから収集、選択でき、このような構成はPublishedDataSetと呼ばれます。

DataSetは、DataSetWriterに依存する形式でシリアル化された個別のDataSetMessageとして送信され、1つのDataSetMessageの形式は、サブスクライバーの知識がなくても理解できる形式で、DataSetを表すJSONメッセージマッピングと、もう1つはUADPメッセージマッピングです。ブローカーベースの通信モデルによるメッセージの機密性と整合性は次の2つのレベルで保証できます。

・パブリッシャーまたはサブスクライバーとブローカーまたは間のトランスポートセキュリティ
・パブリッシャーとサブスクライバー間のエンドツーエンドのセキュリティとしてのメッセージセキュリティ

ブローカーレベルのセキュリティは、すべてのパブリッシャーとサブスクライバーが必要なキュー、または、トピックへのアクセスを許可する資格情報を持っている必要があります。さらに、ブローカーとのすべての通信は、機密性を確保するためにトランスポートレベルのセキュリティを使用します。セキュリティパラメータは接続とグループで指定することが可能です。