EtherNet/IPの概要
EtherNet/IP(Ethernet Industrial Protocol)は、Ethernetを基盤とした産業用通信プロトコルで、機器間のリアルタイム通信を可能にします。このプロトコルは、**ODVA(Open DeviceNet Vendor Association)**によって管理されており、主に以下の用途で利用されています。
- プログラマブルロジックコントローラ(PLC)との通信
- 産業用センサーやアクチュエーターの制御
- 工場オートメーション全体のネットワーク構築

Pythonを使ってPLCと通信してみませんか?このガイドでは、EtherNet/IPを使ったPLC通信の基本を初心者向けにわかりやすく解説しています。初めての方でもステップバイステップで学べるので、ぜひチェックしてみてください!
EtherNet/IPの仕組み
EtherNet/IPは**CIP(Common Industrial Protocol)**に基づいており、以下の2種類の通信をサポートします。
- Explicit Messaging(明示的メッセージング)
デバイス間でリクエストとレスポンスをやり取りする方式です。設定データや診断データの送受信に使用されます。 - Implicit Messaging(暗黙的メッセージング)
高速なリアルタイム通信を可能にする方式で、制御データの定期的なやり取りに使用されます。
これらの通信方式を活用することで、機器間の迅速かつ信頼性の高いデータ交換が可能となります。
Pythonで使用するメリット
Pythonを使用してEtherNet/IPにアクセスするメリットは以下の通りです。
Pythonライブラリの選定

PythonでEtherNet/IP通信を実現するには、適切なライブラリを選定することが重要です。EtherNet/IPを扱えるライブラリは複数存在しますが、その中でも利用頻度が高く、便利なライブラリを紹介します。
EtherNet/IP対応のPythonライブラリ
- pycomm3
最も一般的で使いやすいライブラリです。特にAllen-Bradley社のPLC(ControlLogix、CompactLogixなど)との通信に適しており、公式ドキュメントやコミュニティサポートも充実しています。 - cpppo
スクリプト型のEtherNet/IPプロトコルツールで、主にデータ収集や監視に使用されます。ただし、初心者にはやや複雑であるため、まずはpycomm3を試すのがおすすめです。 - pylogix
pycomm3と似ていますが、やや簡素な機能に特化しており、小規模なプロジェクト向けです。
pycomm3の特徴と利点
pycomm3のインストール方法
pycomm3を使用するには、Python環境が必要です。以下の手順でインストールを行います。
- Pythonをインストールします(Python 3.8以上を推奨)。Pythonがインストールされていない場合、Python公式サイトからインストーラーをダウンロードしてください。
- Pythonパッケージマネージャー
pipを使用してpycomm3をインストールします。以下のコマンドを実行してください。
pip install pycomm3- インストールが成功したかを確認するには、次のコマンドを実行します。
python -m pycomm3 --helpエラーが表示されなければ、インストールは完了です。
基本的な接続と通信の実装
ここでは、Pythonライブラリのpycomm3を使って、EtherNet/IPデバイスとの基本的な通信を実装する方法を解説します。PLCとの接続設定、データの読み取り、データの書き込みについて順を追って説明します。
PLCとの接続方法
まず、EtherNet/IPデバイス(例: Allen-Bradley社のPLC)に接続する基本的なコードを示します。接続には、PLCのIPアドレスが必要です。
from pycomm3 import LogixDriver
# PLCのIPアドレスを指定して接続
ip_address = '192.168.1.10' # ここに接続先のIPアドレスを記入
with LogixDriver(ip_address) as plc:
print("接続に成功しました!")解説
データの読み取り
EtherNet/IP通信の基本は、PLC内のタグ(変数)の値を読み取ることです。以下の例では、PLC内のタグMyTagを読み取ります。
from pycomm3 import LogixDriver
ip_address = '192.168.1.10'
tag_name = 'MyTag'
with LogixDriver(ip_address) as plc:
value = plc.read(tag_name)
if value is not None:
print(f"{tag_name} の値: {value.value}")
else:
print(f"{tag_name} の読み取りに失敗しました。")解説
データの書き込み
次に、PLC内のタグに値を書き込む方法です。以下のコードは、タグMyTagに値42を設定します。
from pycomm3 import LogixDriver
ip_address = '192.168.1.10'
tag_name = 'MyTag'
new_value = 42
with LogixDriver(ip_address) as plc:
success = plc.write(tag_name, new_value)
if success:
print(f"{tag_name} に {new_value} を書き込みました。")
else:
print(f"{tag_name} への書き込みに失敗しました。")解説
接続と通信の注意点
- IPアドレスの設定
接続先のデバイスが同じネットワーク内にあることを確認してください。 - タグ名の確認
タグ名はPLCのプログラムで定義されているものである必要があります。正確なスペルを入力してください。 - エラー処理の追加
ネットワークの不具合や接続エラーに備えて、例外処理を実装することをおすすめします。
応用編:リアルタイムモニタリングとエラーハンドリング

ここでは、EtherNet/IP通信をさらに高度に活用するためのリアルタイムモニタリングの方法と、エラー発生時の対処法について解説します。これらを実装することで、システムの信頼性を向上させることができます。
リアルタイムモニタリングの実装
リアルタイムモニタリングでは、定期的にデバイスのデータを取得し、状態を監視します。以下の例では、Pythonのtimeモジュールを使用して1秒ごとにタグの値を取得します。
from pycomm3 import LogixDriver
import time
ip_address = '192.168.1.10'
tag_name = 'MyTag'
with LogixDriver(ip_address) as plc:
print("リアルタイムモニタリングを開始します。Ctrl+Cで停止してください。")
try:
while True:
value = plc.read(tag_name)
if value is not None:
print(f"{tag_name} の現在値: {value.value}")
else:
print(f"{tag_name} の読み取りに失敗しました。")
time.sleep(1) # 1秒待機
except KeyboardInterrupt:
print("モニタリングを停止しました。")解説
エラーハンドリングの実装
EtherNet/IP通信では、ネットワークの切断やタグ名の誤りなど、さまざまなエラーが発生する可能性があります。これらの問題に対処するために、例外処理を追加することが重要です。
以下は、基本的なエラーハンドリングを実装した例です。
from pycomm3 import LogixDriver, CommError
ip_address = '192.168.1.10'
tag_name = 'MyTag'
try:
with LogixDriver(ip_address) as plc:
print("接続に成功しました。")
value = plc.read(tag_name)
if value is not None:
print(f"{tag_name} の値: {value.value}")
else:
print(f"{tag_name} の読み取りに失敗しました。")
except CommError as e:
print(f"通信エラーが発生しました: {e}")
except Exception as e:
print(f"予期しないエラーが発生しました: {e}")解説
応用例:特定条件でのアラート通知
リアルタイムモニタリング中に、特定条件を満たした場合にアラートを出す機能を追加することも可能です。以下は、タグの値が閾値を超えた場合に警告を出す例です。
from pycomm3 import LogixDriver
import time
ip_address = '192.168.1.10'
tag_name = 'MyTag'
threshold = 100 # 閾値
with LogixDriver(ip_address) as plc:
print("モニタリングを開始します。Ctrl+Cで停止してください。")
try:
while True:
value = plc.read(tag_name)
if value is not None:
print(f"{tag_name} の現在値: {value.value}")
if value.value > threshold:
print(f"警告: {tag_name} の値が閾値 {threshold} を超えました!")
else:
print(f"{tag_name} の読み取りに失敗しました。")
time.sleep(1)
except KeyboardInterrupt:
print("モニタリングを停止しました。")応用機能のポイント
- モニタリングの効率化
データ取得間隔を調整し、必要以上に負荷をかけない設計が重要です。 - 通知機能との連携
Pythonの外部ライブラリ(例:smtplibによるメール通知やSlack API)を使用して、条件を満たした場合に通知を送る仕組みを構築することも可能です。
まとめと注意点
Pythonを使用してEtherNet/IPデバイスと通信する方法について解説してきました。この章では、これまでの内容を振り返りつつ、導入を検討する際の注意点と次のステップについてまとめます。
PythonでEtherNet/IPを扱う利点
実装時の注意点
次のステップ
- 小規模プロジェクトでの試験運用
実際のシステムに導入する前に、テスト環境で動作を検証し、問題点を洗い出してください。 - データ解析や可視化の追加
取得したデータを利用して、ダッシュボードを作成するなど、システム全体の効率を高める方法を検討しましょう。Pythonのmatplotlibやpandasライブラリが役立ちます。 - 他のプロトコルとの統合
ModbusやOPC UAといった他の産業用通信プロトコルと統合することで、より包括的な監視・制御システムを構築できます。 - 通知機能の実装
Slackやメールでのアラート通知を追加することで、異常検知時に迅速な対応が可能になります。
おわりに
PythonとEtherNet/IPライブラリを組み合わせることで、産業用通信の自動化と効率化が容易になります。本記事を参考に、まずは小さな実験プロジェクトから始め、実用レベルのシステムへと発展させていってください。実装中に不明点が出た場合は、公式ドキュメントやコミュニティを活用して問題解決を図りましょう。

ここまで読んでいただきありがとうございます!
UdemyのPythonコースにはオンラインで学習ができる動画コンテンツがたくさんあります。
当ブログのような文章メインの説明では足りない箇所を補えると思うので、もっと詳しく勉強したいという方はぜひチェックしてみてください!


コメント