PythonでEtherCAT,PROFINETの産業用データを収集してみました。
ラズパイと無料ソフト環境でテストしていますので誰でも実施可能です。
使用したライブラリからプログラムまで一から紹介します。
PythonでIoT!Raspberry Piで産業用のデータ収集してみた
Pythonとラズパイを使って産業用のデータ収集してみました。
最大ラズベリーパイ3台使って産業用イーサネットの情報をPythonでデータ収集しています。
ラズパイだけでテスト環境を作り、EtherCATやPROFINETの情報をPythonでデータ収集できました。
ラズパイは無線・有線の両方を搭載しています。IoTのデバイスとして非常に役立つ旨を紹介します。
分かりやすくパワーポイントでまとめた資料が下記となります。
最初にご覧になった方が実施内容をイメージしやすいのでぜひご覧ください。
産業用のデータをPythonで使うにはOPC UAが便利
AI・機械学習のライブラリが豊富でプログラミング言語として人気のPythonです。
工場などのセンサー・ロボットなどの産業用のデータをPythonで処理したいケースがあると思います。
しかし産業システムには多くの機器・様々な通信規格があり、まとめてPythonでデータ解析するにも手間がかかります。
しかしそんな場合はOPC UAを使えばPythonでデータ収集することが可能です
OPC UAを使えばTCP/IP上で簡単に産業機器・システムにアクセスできます。
無線でも有線でも簡単にデータを収集することが可能です。
OPC UAとは
OPC UAの概要だけ簡単に説明させてもらいます。
産業システムには数多くの産業ネットワークの規格が有ります。
OPC UAは数多くの規格超えて通信・データ収集・機械制御などが可能になる通信規格です。
(下記図はかなり大雑把なイメージ図です)
OPC UAの簡単な使い方
OPC UAの環境さえ整っていれば、簡単に産業用のデータを収集できます。
データを確認するだけならばOPC UAのクライアントソフトを使えば一番楽だと思います。
フリーソフトも多数出ており、PCだけでなくスマートフォンからも簡単に確認できました。
詳細に関しては下記記事をご覧ください。(リンク先はこちらから)
工場のコントローラであるPLCの情報をスマートフォンで確認しています

OPC UAのPythonのライブラリがフリーで使用可能
PythonでもOPC UAを使いデータを収集することができます。
簡単に説明しますとPythonのライブラリ「FreeOpcUa」でOPC UAを簡単に使えます。
使い方例は下記記事で紹介しています。(リンク先はこちらから)

「FreeOpcUa」はGithubにて無料でダウンロード可能です。
サンプルプログラムのExamplesも豊富かつ無料で使えるという非常に便利なライブラリです。
プログラムを仕事で使わない筆者でもテストレベルならば簡単にプログラムできました。
ラズベリーパイでOPC UAを使えばIoTになる
PythonでOPC UA使えることを前章まで紹介させていただきました。
さらにOPC UAをラズベリーパイで実装させれば産業用のIoTのデバイスとなる旨を紹介していきます。
上記例のように有線ではEtherCATで産業機器を制御して、無線のOPC UAでデータを送ることも可能です。
今回のテストでは最大3台のラズベリーパイの無線・有線使ってIoTっぽくデータ収集してみました。
メーカーの産業用イーサネット・OPC UA機器は高価
今回ラズベリーパイとPythonでテストしている訳として大きな理由がもう一つあります。
本来工場などで使うメーカーの機器でテストするのが一番ですが、個人のお財布レベルでは購入できないためです。
Amazonの末端価格のため正直あまり参考になりませんが、とあるメーカーのOPC UA機器の一例を下記に載せておきます。
正直な所、機能・機種によって値段が全く違ってきます。この辺りはオープン価格みたいなイメージだと思っています。
CODESYSで産業用イーサネットとOPC UAサーバーとの環境を作る
本格的な実動作のテストは無理ですが、通信テストレベルならばラズベリーパイで対応可能です。
詳細は下記記事をご確認ください。(リンク先はこちらから)

ラズパイとCODESYSというソフトウェアで産業用イーサネットも無料でテストできます。
今回使う下記機能以外にも多くの機能を使えますが省略します。詳細のリンク先はこちらから
- ソフトウェアPLC
- 産業用イーサネット(EtherCAT,PROFINET,EtherNet/IP…など)
- OPC UAサーバー
※時間制限がありますが再接続すればまた無料でテストできます。(テストレベルでは実質無料)
PythonとラズパイでOPC UAクライアントを作る
今回のテストではクライアント側(データを収集・解析する側)もラズベリーパイで対応します。
ラズベリーパイはデフォルトでPythonのプログラミングが可能です。
「FreeOpcUa」のライブラリを使えば20~30行のコードでテスト出来ました。
EtherCATをラズパイとPythonでデータ収集
最初に産業用イーサネットの人気物であるEtherCATの情報をOPC UAでデータ収集してみます。
筆者がEtherCATのスレーブ機器を所持していないのでラズパイのマスターのみでテストします。
マスターの「起動」,「メッセージ」の情報をOPC UAクライアントのラズパイとPythonで確認します
ラズベリーパイをEtherCATのマスターにする方法
ラズパイとCODESYSでEtherCATのマスターとして動かせます。
詳細の記事は下記にありますので参考ください(リンク先はこちらです)。

EtherCATの情報をOPC UAに設定する
OPC UAサーバーへの設定方法は色んなパターンが考えられます。
(直接OPC UAに設定できるEtherCATの変数、一度何かに置き換える必要がある変数など色々あると思います…)
CODESYSが何処まで対応しているか筆者も分かっていないので一番簡単な方法で対応します。
今回は一度PLCプログラムのデータに置き換えてEtherCATの情報をOPC UAに置きました。
CODESYSではEtherCATの変数をPLCプログラムに設定できます。
筆者はPLCの変数の設定で「IoConfig_Globals」→「EtherCAT_Master」で使いたい変数を選択しました。
PLCのデータをOPC UAからアクセスするにはシンボルコンフィグレーションから設定できます。
詳細は下記記事をご参考ください。(リンク先はこちらから)

OPC UAクライアント側のPythonのプログラム
Python側のプログラムとしては「FreeOpcUa」のライブラリを使ったシンプルな物です。
OPC UAサーバに接続⇒While文で20秒分EtherCATのマスターの情報を表示⇒OPC UAサーバーと切断となっています。
一応プログラムを貼り付けておきます。
(サーバー環境、欲しいデータが違えば内容も異なってきます。参考までにお願いします)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import sys import time sys.path.insert(0, "..") from opcua import Client if __name__ == "__main__": client = Client("opc.tcp://192.168.100.125:4840")#connect using a user try: client.connect() # get a specific node knowing its node id var1 = client.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.ecat_m_enable") var2 = client.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.ecat_m_start") var3 = client.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.ecat_m_message") print("start\n") start = time.time() while time.time() - start <= 20: print("Enable:",var1.get_value()," Start:",var2.get_value()," LastMessage:",var3.get_value()) # get value of node as a DataValue object time.sleep(1) finally: client.disconnect() |
変数(ノードID)の調べ方例などについては下記記事をご参考ください。(リンク先はこちらから)

EtherCATをラズパイとOPC UAで接続テストする
EtherCAT起動前はマスターの「Enable…Flase」「Message…無し」の情報をPythonで確認できました。
EtherCAT起動後はマスターの「Enable…True」「Message…有り」を確認できています。
(もちろんスレーブは無しのため、EtherCATマスターは実行できない「Start…False」状態です。)
無事EtherCATの情報をラズパイとPythonでデータ収集することができました。
EtherCATをラズパイとOPC UAで接続テスト動画
テスト動画をYoutubeにアップしています。
動画の方がテストの一連の流れが分かりやすいと思います。ぜひご覧ください。
PROFINETをラズパイとPythonでデータ収集
産業用イーサネットでシェア率の高いPROFINETでもOPC UAでデータ収集してみます。
PROFINETに関してはラズベリーパイでマスター・スレーブも作成できます。
そのためわざとスレーブを停止をさせて内部の状態(ステータス)を移行させます。
その動作をラズパイとPythonで確認しました。
ラズベリーパイをPROFINETのマスターとスレーブにする方法
ラズパイとCODESYSでPROFINETのマスターとスレーブを作ることができます。
詳細は下記記事をご覧ください(リンク先はこちらから)

PROFINETの情報をOPC UAに設定する
PROFINETのテストでは「スレーブの状態(status)」の情報をOPC UAで送ります
(「マスターのEnable」「スレーブのEnable」も一緒に確認しています)
OPC UAサーバーへの設定方法はEtherCATと同じため省略します。
OPC UAクライアント側のPythonのプログラム
ここも先述したEtherCATとほぼ同じテストプログラムです。
PROFINETで変更した箇所は「変数箇所(サーバー・ノードID)」と「print文の表記」だけです。
一応参考までに貼り付けておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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 var1 = client.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.Profinet_master") var2 = client.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.Profinet_slave") var3 = client.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.Profinet_slave_status") print("start\n") start = time.time() while time.time() - start <= 20: print("Master:",var1.get_value()," Slave:",var2.get_value()," Slave_status:",var3.get_value()) # get value of node as a python builtin time.sleep(1) finally: client.disconnect() |
PROFINETをラズパイとOPC UAで接続テストする
PROIFINETが正常の場合「スレーブの状態(Status)…0」であることをPythonで確認できました。
PROIFINETがわざと異常の場合「スレーブの状態(Status)…0以外」であることをPythonで確認できました。
無事PROFINETの情報をラズパイとPythonでデータ収集することができました。
PROFINETをラズパイとOPC UAで接続テスト動画
テスト動画をYoutubeにアップしています。
動画の方がテストの一連の流れが分かりやすいと思います。ぜひご覧ください。
産業用イーサネットをOPC UAとラズパイでデータ収集
最後にEtherCATとPROFINETの産業用イーサネットをまとめてPythonでデータ収集します。
OPC UAを使えば通信規格を超えて、IoTっぽくでデータを取得できることを実践してみます。
ラズベリーパイ3台でPROFINETのマスター・スレーブ、EtherCATのマスターを用意しました。
EtherCATのマスターとしたラズパイでPROFINETのデータを取集します。
そしてローカルホストの接続でEtherCATの情報もまとめて一緒にPythonで確認します。
産業用イーサネットをPythonでまとめてデータ収集する
OPC UAへのデータ登録方法に関してはEtherCATとPROFINET箇所で実施した内容と同じです。省略します。
Pythonのプログラムの変更点としてはクライアント接続を増やしています。
PROFINET側にはIPアドレスで、EtherCATはローカルホストで接続しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import sys import time sys.path.insert(0, "..") from opcua import Client if __name__ == "__main__": client_e = Client("opc.tcp://localhost:4840")#connect using ethercat client_p = Client("opc.tcp://192.168.100.121:4840")#connect using profinet try: client_e.connect() client_p.connect() # get a specific node knowing its node id var1 = client_e.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.ecat_m_enable") var2 = client_e.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.ecat_m_start") var3 = client_e.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.ecat_m_message") var4 = client_p.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.Profinet_master") var5 = client_p.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.Profinet_slave") var6 = client_p.get_node("ns=4;s=|var|CODESYS Control for Raspberry Pi MC SL.Application.PLC_PRG.Profinet_slave_status") print("start\n") start = time.time() while time.time() - start <= 20: print("Ecat_Enable:",var1.get_value()," Ecat_Start:",var2.get_value(), " Pnet_Master:",var4.get_value()," Pnet_status:",var6.get_value()) # get value of node as a python builtin #print("Ecat_Enable:",var1.get_value()," Ecat_Start:",var2.get_value()," Ecat_Message:",var3.get_value()) # get value of node as a python builtin #print("Pnet_Master:",var4.get_value()," Pnet_Slave:",var5.get_value()," Pnet_status:",var6.get_value()) # get value of node as a python builtin time.sleep(1) finally: client_e.disconnect() client_p.disconnect() |
産業用イーサネットをラズパイでまとめて接続テストする
最初に「EtherCATのEnable…False」「PROFINETのスレーブ状態(Status)…0」であることをPythonで確認できました。
次にEtherCATを起動して「EtherCATのEnable…True」「PROFINETのスレーブ状態(Status)…0」を確認しています。
途中でわざとPROFINETを停止させ「EtherCATのEnable…True」「PROFINETのスレーブ状態(Status)…0以外」を確認しました
無事EtherCATとPROFINETの情報をラズパイとPythonでデータ収集することができました。
産業用イーサネットをラズパイでまとめて接続したテスト動画
テスト動画をYoutubeにアップしています。
動画の方がテストの一連の流れが分かりやすいと思います。ぜひご覧ください。
Pythonの勉強会で発表させていただきました
今回の記事をネタにして名古屋開催のPython東海 第41回勉強会に参加させていただきました。
その際の資料が冒頭でも紹介していた下記スライドです。
Python東海の管理者様・運営者様、そして参加者様には深く御礼を申し上げます。
今回のような発表の機会をいただきありがとうございました。
まとめ・感想
ラズベリーパイ(raspberry pi)とPythonを使うことで産業用データを収集することができました。
ラズパイは無線・有線兼ね備えていますので、産業用のIoTデバイスとしても活躍できます。
産業用イーサネット・OPC UA含めて簡単に通信テストも可能です。
皆様もぜひ試してみてください。
コメント