OPC UA(Open Platform Communication Unified Architecture)は、単なる通信プロトコルではなく、データモデルや相互作用の概念も含むアーキテクチャで、新しい市場標準としてますます普及し、オープンで標準化された通信の基礎を提供します。それにより、異なるプラットフォーム間で標準化されたデータ交換を可能にします。
そしてOPC UAはPLCnext Technologyに不可欠な要素であるため、サードパーティシステムとの接続においてOPC UAが対応しています。今回紹介するのはそのOPC UA PubSub機能です。

OPC UA PubSub Communication
OPC UA PubSub(Publish-Subscribe)は、OPC UA Frameworkの一部であり、PublisherとSubscriberの組み合わせでMessageを提供し、リアルタイムおよび非リアルタイムのデータを高効率に配信するために設計されます。通信は、標準のIPネットワーク上でUDP(User Datagram Protocol)メカニズムを使用して処理され、特定のシステムに結びつかず、柔軟性があるアプローチです。
一般的に、PubSub通信はOPC UAサーバーの構成や動作と独立しています。ネットワークにデータを配信する場合はPublisherとデータを受信する側は1つまたは複数のSubscriberで、なおかつ同時にOPC UAサーバーまたはクライアントである場合があります。
注意するのはOPC UA PubSub通信には、コントローラネットワークでIGMP対応のスイッチが必要で、IGMP(Internet Group Management Protocol)は、TCP/IPプロトコルファミリーの通信プロトコルです。
OPC UA PubSub通信は、OPC UAクライアントサーバー通信とは独立しています。ただし、ここで説明されているパブリッシャーやサブスクライバーは、同時にOPC UAサーバーまたはクライアントである場合があります。

Flow
OPC UA Pub/Subの初期設定を行う際には、以下のように手順に設定しましょう。
注意するにはPLCNEXTの場合、ControllerはPublisherとSubscriber両方として動作できますが、異なるPLCnext Engineerプロジェクトで定義する必要があります。
- Publishするデータセットを定義する
- Data SetのPublish/Subscribeのためのネットワーク接続設定する
- ControllerをPublisherとして設定する
- ControllerをSubscriberとして設定する
Data Set
Data Setとは、ネットワークに公開されるポートと変数をグループ化したもので、逆に言えばデータセットは公開可能なポート/変数のコレクションです。
データセットを定義した後、プロジェクトで定義されたWriter(もしくはPublisher)で選択できます。これにより、データセットは再利用可能になり、データセットに含まれるアイテムはネットワークに対して公開することができます。
Which data can be used?
PLCNEXT Controllerでは、以下のComponentsがData setとして使用できます。
- OUTポートに設定された変数
- GlobalのIEC変数(Local変数、Program Global変数、In/Out変数は含まれません)
- 基本データ型および基本データ型の一次元配列
Be carefu-1
変数をデータセットに設定する順序は、このデータセットを読み取るすべてのSubscriberにとって重要です。Readerの構成は、対象の変数は正確にこの順序で正しいデータ型で作成されている必要があります。そうしないと、受信した値と対象の変数のMappingが正しく行われません。
Be carefu-2
PublisherとSubscriberの構成は別々のプロジェクトで行われるため、自動的なチェックはありません。End-UserはSubscriberを構成する際に必要な情報をPublisher側からいただく必要があります。
Be carefu-3
POU変数テーブルのOPC属性は宣言でチェックボックスが選択されていなくても、Data Setに追加できます。

Be carefu-4
データセットは再利用可能です。データセットは何度も選択することができ、つまり複数のWriterによって公開されます。
Publisher?
Publisherとは、Port/変数の値を定義されたネットワークに書き込み、それに応じて設定されたSubscriberが読み取ることができます。
Address指定されたネットワークは、特定の接続に定義したNetwork address(Multicast address)によって指定されます。なので、WriterはConnectionのしたであります。
WriterはいわゆるWriter Groupで構成されています。各Connectionには複数のWriter Groupを構成でき、またGroupは複数のWriterが可能です。
Subscriber?
Subscriberとは、定義されたNetworkからPublishedされたData Setを読み取ることです。
Address指定されたネットワークは、特定の接続に定義したNetwork address(Multicast address)によって指定されます。なので、ReaderはConnectionのしたであります。
ReaderはいわゆるReader Groupで構成されています。各Connectionには複数のReaderGroupを構成でき、またGroupは複数のReaderが可能です。
ReaderをSubscribeするデータセットはPublishのPublish ID・Writer Group ID・Writer IDに合わせる必要があります。
Error
Configuration Compile結果はOPC UA標準に準拠したバイナリ出力ファイルになります。Filename:pcwe.opcua.pubsub.uabinary
Default保存場所:/opt/plcnext/projects/PCWE/Services/OpcUA/PubSubConfig
Implementation
Firmware
Firmware 22.0以上を搭載したPLCnext Technologyコントローラは、OPC Unified Architecture仕様のPart 14に準拠しているOPC UA PubSub通信モデルが実装されます。
Version
今回自分が使用するPLCNEXT Engineering Versionです
2023.0になります。

Configuration
こちらは今回のConfigurationで、AXCF3152とAXCF2152両方もPublisherとSubscriberとして立ち上げ、最後はWirshark・UaExpertとPLCNEXT Engineering三方面で検証します。

Enable the Function
AXCF2152とAXCF2152のWebサーバーSystem Services?OPC UA PubSubのActivation Checkマークを入れて>Apply and rebootします。

AXCF3152 Side
Add Program
AXCF3152のプロジェクトを作成し>右のCOMPONENTS開いて>Local>Programs>プログラムを作成しましょう。

テスト目的なので、言語はどちらでもOkです。

Code編集画面が表示されます。

Define Publish/Subscribe Variables
VariablesのTabを開きます。

Publish Variables
Publish変数を3つ追加します。

注意するのはUsageのFieldから”OUT Port”を設定してあげてください。

このようにUsageのFieldからDrop-Listを変数の属性を設定いただけます。

Subscribe Variables
次はAXCF2152からSubscribeしたい変数群も定義しましょう。

注意するのはUsageのFieldから”IN Port”を設定してあげてください。

Configure the Program Task
プログラムをCPUの実行Taskに割り付けます。PLCnext(2)をクリックしてください。

Task and Eventsの構築画面が表示されます。
ESM1のEnter task name hereにTask名を入力してください。

ここで仮にOB1にします。

先程のStepで作成したプログラムを”Enter program instance name here”のところにDropしていきます。

Done!いまpAXCF3152は周期に実行されています。

OPC UA PubSubs
次はOPC UAのPubSub設定を行います。OPC UA>OPC UA Pub/SubのTabを開きます。

Configuration
Configurationの項目を開くと、Configuartion画面が表示されます。
”Click here to add a new connection”で新しいConnectionを追加します。

Done!新しいConnectionが追加されました。

Network Address
Network AddressはAXCF3152がデータをPublish/Subscribeするときのアドレスになります。Formatはopc.udp//ipaddress:portになります。注意するのはPLCNEXTプロジェクトがCPU1つしかできないので、手動で各プロジェクトのNetwork addessなどをあわせてる必要があります。

Network Interface
Network interfaceはAXCF3152がPub/SubするネットワークPortになります。AXCF3152にはPortが3つあります。今回はX2を選択します。

Publisher ID
PublishIDを10に設定します。PublishIDは他のCPUと被らないように設定してください。

Published data sets
次はCPUのPublishデータセットを作成します。

Add New Dataset
”Click here to add new published data set”で新しいデータセットを追加します。

DataSet1を追加しました。同時にPublished data setsに”DataSet1:Published data set”の項目が追加されます。

Data set
Publish のDataSetにPublishする変数を追加しましょう。

VariablesのFieldをクリックするとDropListから直接CPUにOut Portだと設定された変数を選択できます。

3つのPublish変数を追加しましょう。

Done!

Configure Pub/Sub
次にやるのは設定したPublish Data SetをConnectionsと繋がる、そしてSubscribeの設定とそれらの変数をプログラム変数とLinkさせる作業です。
Connection1:Connectionsを開きます。
その”Connection1″は先の”Configuration”Stepで作成したものです。

Publishの項目にある”Click here to add a new Writer group”をクリックし新しいWriter groupを作成しましょう。

Writer group ID=1のWriter Groupが作成されました。そのIDも重複できません。

Publish
WriterGroup1を開きます。

Edit Group
ここで”Writer”を追加します。

本来なら1つだけのWriterでよいですが、ここであえて3つのWriterを定義しのちほどで検証してきます。Published data setは同じの”DataSet1″にします。

Subscribe
次はScbscribe側を設定します。Scbscribeを開きましょう。

Add Reader Group
Nameのところに新規のWriter Groupを追加します。

よし、これでOK。EnabledのCheckboxも忘れずに。
Add Reader Group
Nameのところに新規のWriter Groupを追加します。

よし、これでOK。EnabledのCheckboxも忘れずに。

Add Reader
先程追加したReader GrouperにReaderを追加してきます。

NameのFieldをクリックし新しいReaderを定義します。

Done!注意するのはここで設定するSubscribe項目にある”Publish ID”と”Writer Group ID”はPublish側に合わせる必要があります。

Add New Variables
Reader内の変数を追加します。

”Click here to add a new variables”をクリックし新しい変数を入れましょう。

このように変数が追加されました。
Source Variablesの名前はそのままでOKで、この代わりに設定する必要があるのはとなりにある”Target Variables”です。

Drop Listからプロジェクト内に”In Port”として定義された変数を選択できます。


AXCF2152 Side
Add Program
AXCF3152と同じようにLocals>Programsでプログラムを作成します。今回は3つのプログラムに分けて定義します。

Define Publish/Subscribe
AXCF3152側と同じ操作でPublish・Subscribe用の変数を定義します。基本は3つのプログラム(Station1,Station2,Station3)も同じように変数をもっています。
Station1
IN Port変数は1実数1つ、Out Port変数はBoolean,Int,Realが混在してます。

Station2
Station1と同じです。

Station3
Station1と同じです。

Configure the Program Task
Station1,Station2,Station3のプログラムを実行Taskに設定します。

OPC UA PubSubs
操作は先程とあまり変わらないです。
Configuration
”Click here to add a new connection”で新しいConnectionを追加します。

Network address
ConfigurationにConnectionを追加します。注意するのはAXCF3152のNetwork addressに合わせる必要があります。

Network Interface
AXCF2152のNetwork Portを設定します。

Publish Id
AXCF2152のPublish IDは1にします(Defaut)、他のPublisher IDと重複しないようにしてください。

Publish data sets
AXCF2152のPublish データセットを作成します。
Add new Data Set
Published data setsの項目にStationSetを追加します。

Data Set
次はPublished data set”Station1″にデータを追加します。

先程プログラムで定義した”OUT PORT”変数を追加しましょう。注意するのは変数の追加順番は他のSubscriberにも同じように追加する必要があります。
(データがおかしくなるので)

Configure Pub/Sub
次はPublish/SubscribeのデータをConnectionに載せます。

Publish
新しいDataWriter Setを追加します。

Publised data setは先程追加した”Station” Setを設定しましょう。

Subscribe
次はAXCF3152のPublished データをSubscribeします。新しいReader Groupを追加します。

Published Id
先程、AXCF3152のPublish IDが”10”だと設定したんですよね。なので、DataSetReader1のPublisher IDを10に設定してください。

Reader Data
AXCF3152が定義した3つの実数Published変数を追加します。

同じく、プログラムで”IN PORT”だと設定された変数を選んでいただけます。

Test with UaExpert
プロジェクトをAXCF3152とAXCF2152をDownlaodし、まず接続設定がちゃんと入ってるかを確認しましょう。UaExpertを起動し、3152と2152のCPU両方とも内蔵のOPC UAサーバーと接続します。

Add Documents
Documents>右クリック>Addします。

Document TypeにPubSub Config Viewを選び>Okします。

いま2つのOPC UA Serverにも接続している状態なので、両方のPub/Sub状態にも確認できます。

Check Config
まずUDP MuliticastのFolderにopc.udp://239.0.0.01:48451がありますね。こちらは最初にPLCNEXT EngineeringのConnectionsに設定した”Network address”です。

次はAXCF2152のDataSetWriter1を開くとPLCNEXT Engineeringツールに設定したPublishedデータが全部見えますね。

DataSetReader1にも設定されたようにみえます。
Field NameはStation11.r32subData/Station21.r32subData/Station31.r32subDataになって、PLCNEXT Engineeringツールと設定したものと一緒です。

AXCF3152側にもDataSetReaderがありますね。

AXCF3152のPublished側にDataWriterを3つだけ設定したこと覚えていますか?なので、DataSetWriterが3つあります。

DataSetWriter1、DataSetWriter2、DataSetWriter3には同じ変数が入っています。

Test with Wireshark
Wiresharkからはどうでしょうか。UDP Protocolがありますね!

Test with PLCENXT
最後に、PLCNEXT Engineering側にもデータがありました。


Download
こちらのGithubからSample ProjectをDownlaodしてください。
https://github.com/soup01Threes/PLCNEXT/blob/main/PLCNEXT%20Controller%20OPCUA%20PubSub%20Example.7z