PubSub

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

ユースケース

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

PubSubの2つの例

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

ブローカーレスのUDPマルチキャストを使用したPubSub

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

PubSubの概念

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

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

PubSubのEntityは図の通りです。

Dataset

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

パブリッシャーのDataSetの情報の選択とデータ取得パラメータは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を取得するために複数のオプションがあります。サブスクライバーはOPC UA Clientであり、パブリッシャーが提供するPubSub構成モデルのコンフィグレーションServer、またはディレクトリServerから必要な構成情報を取得できます。

サブスクライバーはPubSub構成モデルで定義されたOPC UA構成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のコンテキスト(システム全体で状態を保持するために使われるもの)で管理され暗号化キーの一般的な配布フレームワークを定義します。 メッセージセキュリティに関連するすべてのパラメータはブローカーレベルのトランスポートセキュリティとは無関係です。トランスポートプロトコルマッピングとは独立しており、PC 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をメッセージ指向ミドルウェアに送信するPubSubEntityです。通常、パブリッシャーはOPC UA Serverでもあります。 ただし、抽象的なPubSubの概念の場合、任意のEntityであり、個々または特定のネットワークノード(IPまたはMACアドレス)または特定のアプリケーションであると想定するべきではありません。

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

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

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

PublishedDataSet

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

DataSetMessage

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

・DataSetFieldContentMaskは値のどのAttibuteをエンコードするかを制御します。
・DataSetMessageContentMaskはエンコードするHeadderFiledを制御します。
・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ヘッダーに暗号化されていないデータを提供し、関連するパブリッシャー、DataSetMessages、DataSetClasses、またはその他の関連するメッセージコンテンツの識別とフィルタリングをサポートします。NetworkMessageがサインされているか、サインおよび暗号化されている場合、サブスクライバーはサインを検証して関連するDataSetMessageを復号化するための適切なセキュリティキーが必要になります。

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

Message reception

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

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

対象となる各DataSetMessageはDataSetReaderに渡されます。DataSetMetaDataはDataSetMessageコンテンツをDataSetにデコードするために使用されます。特にDataSetMetaDataは名前、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

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

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

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

Broker-based model

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

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

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

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