屋内環境を手軽にモニタリングする～⑥産業オートメーション機器の稼動情報をJavaで取得する(OPC-UA / Eclipse Milo)～

## はじめに
産業オートメションの分野で、インダストリー4.0 / IIoTの観点から注目されている産業用ネットワークプロトコルの[OPC-UA](https://en.wikipedia.org/wiki/OPC_Unified_Architecture)に対応した機器から、稼動情報を取得するためのJavaクライアント[rainy-opcua](https://github.com/s5uishida/rainy-opcua)を作成しました。なお、あくまでも、OPC-UAで機器から稼動情報を簡易的に取得する程度のものです。

OPC-UAのプロトコルスタックとSDKのJava実装には、Eclipseプロジェクトの[Milo](https://github.com/eclipse/milo)を使用しています。OPC-UAの実装には幾つかの言語があるようですが、Java版についてはMiloがお薦めです。不明な点についてメーリングリストで質問しても、かなり良いレスポンスで返答がきます。

rainy-opcuaは、Miloに含まれている様々なOPC-UAクライアントの[サンプルコード](https://github.com/eclipse/milo/tree/master/milo-examples/client-examples/src/main/java/org/eclipse/milo/examples/client)を参考に、UA Binary Encodingの通信方式によるデータ取得機能に特化して作成しました。その意味では、何の変哲も無い、オーソドックスなコードです。Subscription & MonitoredItemというOPC-UAで一般的な方法で機器からデータを取得しています。

なお、作成に際しては、主に[OPC Unified Architecture Specification Part 4: Services](https://opcfoundation.org/developer-tools/specifications-unified-architecture/part-4-services/)を掻い摘んで読みました。OPC-UAサーバで提供されるサービスに対して、OPC-UAクライアントから呼び出すRPCを網羅的に説明しています。なので、クライアントを作成するには、Part 4を中心に読むと良いです。なお、OPC-UAのドキュメントにアクセスするには、[OPC Foundation](https://opcfoundation.org/)にユーザ登録する必要があります。

rainy-opcuaの実装の詳細は、[Githubのコード](https://github.com/s5uishida/rainy-opcua/tree/master/src/io/github/s5uishida/iot/rainy/device/opcua)を参照して下さい。なお、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)](https://ja.wikipedia.org/wiki/EtherNet/IP)や[Modbus](https://ja.wikipedia.org/wiki/Modbus)など)をOPC-UAに変換する仕組みが必要になります。実際、このようなプロトコル変換の商用製品が存在します。(オープンソースでは未だ見たことがありません)

一般に機器のライフサイクルは十数年などと比較的長いと思いますので、移行には時間を要するのだろうと思います。また、そもそも、OPC-UAでなくても良い分野もあるのかも知れません。

## 一連の記事
このシリーズは、以下の記事から構成されます。
1. [動機とコンセプト](https://qiita.com/items/9c31e6fd9b6eb0fa9c96)
2. [Bluetooth LEアドバタイズ信号をJavaでキャッチする(Bluetooth LE / bluez-dbus)](https://qiita.com/items/a4543c9e7fb13b4c7c6e)
　関連するGithubは[こちら](https://github.com/s5uishida/bluetooth-scanner)。
3. [TI SensorTag CC2650から温度/湿度/照度などをJavaで取得する(Bluetooth LE / bluez-dbus)](https://qiita.com/items/79a2de6a7026ef230e9b)
　関連するGithubは[こちら](https://github.com/s5uishida/cc2650-driver)。
4. [MH-Z19BからCO2濃度をJavaで取得する(シリアル通信 / jSerialComm)](https://qiita.com/items/1759498f8f706c4c3314)
　関連するGithubは[こちら](https://github.com/s5uishida/mh-z19b-driver)。
5. [PPD42NSからPM2.5濃度をJavaで取得する(GPIO / Pi4J)](https://qiita.com/items/4ae7784aeaf50df1e3d3)
　関連するGithubは[こちら](https://github.com/s5uishida/ppd42ns-driver)。
6. **産業オートメーション機器の稼動情報をJavaで取得する(OPC-UA / Eclipse Milo)(今回)**
　関連するGithubは[こちら](https://github.com/s5uishida/rainy-opcua)。
7. [簡易ツールにまとめる](https://qiita.com/s5uishida/items/c56f1444c6856656b128)
　関連するGithubは[こちら](https://github.com/s5uishida/rainy)。
8. [後記](https://qiita.com/s5uishida/items/d2a888eb2d68e72f32ae)

## 追記
[2019.11.16]
簡易ツールの最新情報は、[こちら](https://github.com/s5uishida/rainy)をご参照下さい。