PythonでOPC UAのクライアントを作成してPLCと接続テストしてみました。
Github上で公開されている無料のオープンソースのライブラリを使用しています。
Examplesも豊富で誰でも簡単にプログラム出来ることを紹介します
PythonでOPC UAを実装!クライアントを作ってサーバーに接続
PythonでOPC UAクライアントをプログラムしてみました。
PythonでOPC UA経由のPLC(ラダー)の出力データを取得できています。
実際のテスト動画は下記になります。PLCの出力データをOPC UAで1秒間隔で拾ってきています
PythonでOPC UAを実装する方法を一から紹介していきます。
LinuxでもPythonのOPC UAソフトが簡単に動く
以前に下記記事でLinuxでOPC UAクライアントソフトをインストールしています。
(リンク先はこちら)

その際に紹介したソフトも実はPythonで動いています。
正確に言うと「FreeOpcUa」というPythonのライブラリを使って動いています。
今回は単純にソフトを使うのではなく、Pythonを使いOPC UA環境を自作していきます。
OPC UAライブラリでPythonはフリー(無料)で使える
PythonのOPC UAライブラリ「FreeOpcUa」はサーバー・クライアント両方に対応しています。
そしてExamplesも豊富かつ無料で使えるという非常に便利なライブラリです。
インストール作業も簡単です。下記コマンドでインストールできます
sudo pip3 install opcua
FreeOpcUaはgithubにあります
「FreeOpcUa」はgithubにあり、多くのリポジストリがあります。(リンク先はこちら)
OPC UAサーバーも作成可能です
今回の記事ではクライアントを作成していますが、サーバーも同様に作成可能です。
下記記事で紹介していますので、是非一緒にご覧ください。

OPC UA clientのPythonのテストプログラム
今回はExamplesにあった一番シンプルなOPC UAクライアントのプログラム「client-minimal.py」を応用します。
OPC UAサーバーに接続する
Exampleの例ではローカルサーバーに接続してオブジェクトの名前等を引き出すだけでした。
今回は外部のOPC UAサーバーに接続してPLCのデータを引き出すように変更します。
イメージとしては下記です。
OPC UAサーバー・クライアントともにラズベリーパイ(raspberry pi)で対応します。
OPC UAサーバー+PLCをラズベリーパイで環境を作るには
OPC UAサーバー+PLCに関してはCODESYSというソフトウェアPLCを使いました。
ラズベリーパイ1台で対応することができます。
詳細は下記記事を参考ください。(リンク先はこちら)

OPC UAのNodeIDを確認する
OPC UAで必要なデータを入手するため、該当するノードIDを引数にValue(値)を取得します。
CODESYSのラダー出力の「Y001」ノードIDを確認します。
(今回は手を抜いて)欲しいノードIDの情報に関しては先ほど紹介したLinuxのクライアントソフトで入手しました。
テストに使うNodeIDは「ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.Y001」でした
PLCのラダーをPythonで監視する動画
今回は20秒間の間、1秒間隔でPLCのラダーの出力を監視するプログラムとなっています。
実際にPLC出力しているとき「True」の情報がPythonで確認できています。
StatusCode(状態)、Timestamp(時間)も更新されています。
冒頭でも紹介しましたが動画で見た方が分かりやすいと思いますので下記を参考お願いします。
無事にPythonでOPC UAクライアントの動作しています。
OPC UAサーバに接続⇒While文で20秒分ループ⇒OPC UAサーバーと切断が出来ていました。
OPC UAのプログラム
あまり意味ないかもしれませんが実際のプログラムを下記に貼り付けておきます。
(サーバー環境、欲しいデータが違えば内容も異なってきますので…)
import sys import time sys.path.insert(0, "..") from opcua import Client if __name__ == "__main__": client = Client("opc.tcp://192.168.100.121:4840")#connect using a user try: client.connect() # get a specific node knowing its node id var = client.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.Y001") print(var) print("start") start = time.time() while time.time() - start <= 20: print(var.get_data_value()) # get value of node as a DataValue object time.sleep(1) finally: client.disconnect()
PythonとOPC UAで産業ネットワークを接続してみた
今回の内容を応用してPythonでEtherCATなどの産業用データを収集してみました。
詳細の記事は下記です。(リンク先はこちらから)

パワーポイントで分かりやすくまとめた資料が下記となります。よろしければご覧ください。
まとめ・感想
OPC UAクライアントはPythonで簡単に作れてラズベリーパイ(raspberry pi)でデバッグ可能です。
またOPC UAサーバーも無料で作り、通信テストもすることも可能です。
皆様もぜひ試してみてください
コメント