産業IoT界隈では良く使われるらしい国際規格OPC-UAについて調べた

前々から噂には聞いていた OPC-UA に対して、私的な興味が出てきたので調査しました。


| Item            |  Description              |
|-----------------|---------------------------|
|  Research Date  | 2019/04/08                |
|  OPC-UA Version | 1.04 (2017-11-22 Release) |

本家の仕様は[こちら](https://opcfoundation.org/developer-tools/specifications-unified-architecture)（要ユーザ登録）

# OPC-UAとは

* OPC Unified Architecture の略
    * OPCはObject Linking and Embedding for Process Controlの略
    * 前身があり、OPC Classic (か省略してOPC)と呼び、こちらはMSのCOM/DCOMを元に、様々なベンダーにより通信規格がバラバラで断絶されていたPLCへのアクセスを行うために1997年ごろに登場した
    * OPC-UAは OPC Classicからさらにアクセス方法などを汎化・高度化しマルチプラットフォーム対応したもの
        * OPC Classicは実行環境がWindows OS前提だったりと制約があった
    * 産業向けの通信規格で、Request/Reponseモデルと、Pub/Subモデルがある
    * QueryではなくRPCであり、操作対象をオブジェクトにデータモデリングします
* Unified Architectureとは
    * オブジェクトデータモデル、SOA志向、通信モデル、セキュリティモデルなどが組み合わさっているためだと思われる
* [インダストリー4.0のRAMI(Reference Architecture Model Industrie 4.0)モデル](https://ec.europa.eu/futurium/en/system/files/ged/a2-schweichhart-reference_architectural_model_industrie_4.0_rami_4.0.pdf)に採用されたことにより注目される
* Webの世界の言葉でかなり強引に例えると、レイヤーとしてはREST+HTTPとかgRPCに近い存在か
* IEC(国際電気標準会議: International Electrotechnical Commission) 62541 で規格化されている


# OPC-UAの背景

* 産業機器でよく利用されるPLCは、開発元によって通信規格がバラバラである事が多く接続が大変
  * MES(Manufacturing Execution System)やERPとの連携が標準化できなかったり制約を受け入れる必要があったりする
      * (例) WindowsServer必須であったり、利用できるRDBやバージョンに制限があったり
  * いわゆる、TCP/IPですらなく、EtherCAT、PROFINET、Modbus/TCPなどである場合も...
* 裏返しになるが業界グローバルデファクトスタンダードな規格が無かった
    * OPC-UA、ORiN、EdgeCross(MelsecProtocol？)など標準化を目指す規格はいくつもあった
    * OPC-UAはその中で、RAMIに取り上げられたので有力になった

# OPC-UAそのものの設計ポリシー

[アーキテクチャページ](https://opcfoundation.org/about/opc-technologies/opc-ua/) によると、以下5分類の設計ゴールがあるとのこと。

1. 機能的な互換性(Functional equivalence)
    * OPC-Classicの仕様が全てOPC-UAにマッピングされる
    * さらにOPC-ServerのDiscovery、Pub/Sub、Event監視などの機能を盛り込む
2. プラットフォーム非依存(Platform independence)
    * 組み込みからクラウドベースのインフラへ
    * HW的な依存なし、OS的な依存なし
3. セキュア性(Secure)
    * 暗号、認証、監査
4. 拡張性(Extensible)
    * 既存のアプリケーションに影響を与えずに新機能を追加する機能
5. 包括的な情報モデリング
    * 複雑な構造もモデリングできる

まぁ、分かるって感じですよね。


# Protocol Stack

OPC-UAは主に3種類のプロトコルスタックを利用するケースがある模様です。

1. SOAPベースのスタック
2. HTTP(S)+セキュリティ層を重ねたスタック
3. TCP/IP上にセッション層＋セキュリティ層を重ねたスタック

![opc-ua-stack.png](https://qiita-image-store.s3.amazonaws.com/0/6463/80b6df20-c63e-f436-551b-0c8667648d40.png)

入門としてはHTTP上に構築された1か2を使いたいところです。
実際のところはレードオフとしてレイテンシやスループットが犠牲になりそうなので要件次第といったところでしょうか。


# OPC-UA通信モデル

以下のような複数のモデルが構築できるようです。

1. Request/Response
2. Publish/Subscribe(1:N)
3. Publish/Subscribe(N:1)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6463/d88608a1-915a-eb07-fc49-3c9a94fce639.png)
出展: https://jp.opcfoundation.org/

# OPC-UAデータモデル

OPC-UAで操作する対象はすべてオブジェクトとして表現します。
RESTだとURLのエンドポイントと、利用できるHTTPメソッド、Request/Responseのパラメータ定義のイメージでしょうか。
Eventだけはやや特殊で、おそらくPub/Subを利用して取得することが多いと思います。

1. 属性
2. メソッド（RPCで呼び出す対象）
3. Event(値が変更したなどのトリガー）

![opc-ua-datamodel.png](https://qiita-image-store.s3.amazonaws.com/0/6463/0b44c034-30ef-7d2d-224f-d6dbb55250ed.png)



OPC-UAのオブジェクトがオブジェクトを参照もでき、コンポジットなオブジェクトも定義できます。
この辺は、よくあるオブジェクト志向そのものなので違和感ないですね。

![opc-ua-object-relational.png](https://qiita-image-store.s3.amazonaws.com/0/6463/fc8ef3b2-9d07-00f0-e7ed-9413bb667444.png)


これを応用して、現実世界にあるものをモデリングしていくようです。
"操作"という切り口で都合よくモデリングしたり、"メンテナンス"という切り口でモデリングするといったことも想定されているようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6463/fcc18dd2-9f6e-0aea-d433-e41519321799.png)
出展: https://jp.opcfoundation.org/


# OPC-UAの広まり

AWS Greengrassでは標準で通信できます
https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/opcua.html


# 類似規格

* 産業IoT向けのコンテキスト
    * Modbus（OPC-UAと比べると低レイヤーの定義のみ）
    * ORiN
    * MCプロトコル（OPC-UAと比べると低レイヤーの定義のみ）
* Web界隈
    * MQTT, JSON+HTTP, JSON+WebSocket


# 実装

.NET, C#, Javaなどの実装がある模様。
Javaに関しては過去Versionのみ存在し、最新の仕様に追随はしないとのこと。

https://github.com/OPCFoundation

NodeやGolangなどの実装も欲しいところなので、コントリビュートチャンスかも。


# QuickStart??

簡単にお試しできるDockerイメージがないか探しました。
OPC-UAのPython実装を利用した、OPC-UAサーバは見つかりました。（動作確認はしていません）
環境構築がちょっと楽できるかもなくらいでしょうか
https://github.com/purplesrl/docker-alpine-opcua

また、 [Azure IoT Edge](https://azure.microsoft.com/ja-jp/services/iot-edge/) で利用するためだと思われる、OPC-UAのServer/Clientそれぞれのコンテナイメージも見つけました。

Azure環境でしか動かないかもですが、Azureをすでに利用しているのであれば簡単にお試しできそうだなと。

https://github.com/Azure-Samples/iot-edge-opc-plc
https://github.com/Azure-Samples/iot-edge-opc-client


# まとめ

* OPC-UAは産業向けIoTではデファクトスタンダードになりそう
* OPC-UAではアクセス対象がオブジェクトモデルで、Request/Response, Pub/Subなどでアクセス可能
* 仕様上はHW, OSから非依存、実装はまだまだこれからか


# Reference

* [OPC Foundation Japan （日本OPC協議会）](https://jp.opcfoundation.org/)
    * 会員登録すると、OPC-UAを用いたケーススタディゆや OPC-UA仕様などの資料を参照できます
* [OPC UA（IEC62541）のセキュリティ - ものづくりNEXT２０１１ (*PDF注意)](http://www.mstc.or.jp/iaf/event/2011kikikanri/opc.pdf)
    * ITエンジニア向けでかなり参考になる。PDFスライド
* [OPC-UAによる工程間データ連携の方法](https://iv-i.org/docs/doc_151210_01.pdf)
    * ITエンジニア向けで理解しやすくかなり参考になる。PDFスライド
* [OPC UAとは何か？なぜ「製造業とITの橋渡し役」として最適なのか - ビジネス＋IT](https://www.sbbit.jp/article/cont1/33221)
    * 概念レベルの説明としてわかりやすい
- [急速に普及する産業向け国際標準「OPC UA」
](https://sgforum.impress.co.jp/article/4407)
  * 短くすぐ読めます