はじめに
産業オートメションの分野で、インダストリー4.0 / IIoTの観点から注目されている産業用ネットワークプロトコルのOPC-UAに対応した機器から、稼動情報を取得するためのJavaクライアントrainy-opcuaを作成しました。なお、あくまでも、OPC-UAで機器から稼動情報を簡易的に取得する程度のものです。
OPC-UAのプロトコルスタックとSDKのJava実装には、EclipseプロジェクトのMiloを使用しています。OPC-UAの実装には幾つかの言語があるようですが、Java版についてはMiloがお薦めです。不明な点についてメーリングリストで質問しても、かなり良いレスポンスで返答がきます。
rainy-opcuaは、Miloに含まれている様々なOPC-UAクライアントのサンプルコードを参考に、UA Binary Encodingの通信方式によるデータ取得機能に特化して作成しました。その意味では、何の変哲も無い、オーソドックスなコードです。Subscription & MonitoredItemというOPC-UAで一般的な方法で機器からデータを取得しています。
なお、作成に際しては、主にOPC Unified Architecture Specification Part 4: Servicesを掻い摘んで読みました。OPC-UAサーバで提供されるサービスに対して、OPC-UAクライアントから呼び出すRPCを網羅的に説明しています。なので、クライアントを作成するには、Part 4を中心に読むと良いです。なお、OPC-UAのドキュメントにアクセスするには、OPC Foundationにユーザ登録する必要があります。
rainy-opcuaの実装の詳細は、Githubのコードを参照して下さい。なお、Miloは「Part 4 - 6.5 Re-establishing connections」の仕組みに対応しており、rainy-opcuaではこのために用意されたinterfaceを実装しています。これにより、OPC-UAサーバ(機器とかプロトコル変換サーバ)が落ちて接続が切れても、多くの場合、再起動した際にセッションを復旧(createSubscription & createMonitoredItems)します。実際の工場で、OPC-UAクライアントの都合にはお構いなく、機器が停止することを想定した対応です。
余談ですが、MiloでOPC-UAサーバ(クライアントではなく)を開発することは、かなり大変と思います。クライアントのサンプルコードは充実していますが、サーバについては、そうは思いません。そもそも、Miloには、未だドキュメントがありません。個人的には、サンプルコードが充実していれば構いませんが・・・
OPC-UA未対応の機器から稼動情報を取得するには
一般的な話ですが、現在、稼働中の機器の中でOPC-UAに対応済みの機器はまだまだ少数なのではと思います。この場合、既存の機器の産業用ネットワークプロトコル(例、EtherNet/IP(CIP)やModbusなど)をOPC-UAに変換する仕組みが必要になります。実際、このようなプロトコル変換の商用製品が存在します。(オープンソースでは未だ見たことがありません)
一般に機器のライフサイクルは十数年などと比較的長いと思いますので、移行には時間を要するのだろうと思います。また、そもそも、OPC-UAでなくても良い分野もあるのかも知れません。
一連の記事
このシリーズは、以下の記事から構成されます。
- 動機とコンセプト
-
Bluetooth LEアドバタイズ信号をJavaでキャッチする(Bluetooth LE / bluez-dbus)
関連するGithubはこちら。 -
TI SensorTag CC2650から温度/湿度/照度などをJavaで取得する(Bluetooth LE / bluez-dbus)
関連するGithubはこちら。 -
MH-Z19BからCO2濃度をJavaで取得する(シリアル通信 / jSerialComm)
関連するGithubはこちら。 -
PPD42NSからPM2.5濃度をJavaで取得する(GPIO / Pi4J)
関連するGithubはこちら。 -
産業オートメーション機器の稼動情報をJavaで取得する(OPC-UA / Eclipse Milo)(今回)
関連するGithubはこちら。 -
簡易ツールにまとめる
関連するGithubはこちら。 - 後記
追記
[2019.11.16]
簡易ツールの最新情報は、こちらをご参照下さい。