EtherCATは、1つのEthernetフレームが装置内のスレーブを順に通過し、各機器が通過中のフレームから自分宛てのデータを読み、応答を書き込んで次へ送る産業用Ethernetです。Beckhoff Automationが開発し、いまはEtherCAT Technology Group(ETG)が仕様を管理しています。この記事では、フレームとワーキングカウンタの読み方、InitからOpまでの状態遷移、分散クロックで1マイクロ秒未満の同期を得る条件を、公式資料に沿って整理しました。PythonのpysoemとLinuxのIgH EtherCAT Masterでスレーブを検出するコードを示し、PROFINETとの違い、OPC UAで上位システムへデータを吸い上げるときの課題、採用を見送る条件まで扱います。
まとめ|EtherCATは多軸モーション同期と配線短縮が要る装置で選ぶ
EtherCATが効くのは、数十軸のサーボやI/Oを100マイクロ秒前後の周期でそろえて動かしたい装置です。マスタは標準のEthernetポートで済み、スレーブ側の専用チップがフレームを止めずに処理するため、軸数が増えても周期が伸びにくい。分散クロックを使えば、軸間の同期ずれは1マイクロ秒を大きく下回ります。
向かないのは、制御周期の要らないデータ収集だけが目的の構成です。工場の稼働データをMESやクラウドへ送る用途なら、EtherCATの内側へ手を入れるより、PLCやゲートウェイからOPC UAやMQTTで取り出すほうが工数は小さい。EtherCATは装置の内側を担う規格で、上位との接続は別の層で設計します。
マスタを自前で組むなら、ライセンスで選択肢が分かれます。社内検証はpysoem、Linuxの装置コントローラはIgH EtherCAT Master、製品へ組み込むならSOEMの商用ライセンスを検討する、という順で考えると迷いません。
EtherCATの定義と通過しながら読み書きするオンザフライ処理の仕組み
Beckhoffが開発しETGが管理する規格の位置づけとIEC 61158との関係
EtherCATはEthernet for Control Automation Technologyの略です。物理層は一般的なEthernetと同じ100BASE-TXで、ETGの技術解説によると銅線ならノード間100メートルまで、それを超える区間は100BASE-FXなどの光ファイバへ切り替えます。プロトコルはIEC 61158、安全通信はIEC 61784として国際規格に取り込まれています。
産業用ネットワーク全体の中での位置は、フィールドバスと産業用Ethernetの分類・規格選定で整理したとおりです。新規設置ノードの構成比ではPROFINET、EtherNet/IPに次ぐ3番手で、多軸モーションの装置メーカーに採用が厚い規格と捉えておくと選定の会話が進めやすくなります。
1フレームで全スレーブを巡回する処理とEtherType 0x88A4の意味
通常のEthernetは、宛先ごとに別のフレームを送ります。EtherCATは逆で、マスタが送るのは全スレーブ分のデータを詰めた1つのフレームです。各スレーブはフレームを受信し終えるのを待たず、通過している最中に自分の担当箇所を読み書きし、そのまま次のスレーブへ流す。末端で折り返したフレームがマスタへ戻った時点で、全機器との入出力が終わっています。
フレームはEtherTypeに0x88A4を持ち、IPやTCPを経由しません。ETGはこの方式で有効データ率が90パーセントを超えるとしています。小さなI/Oごとにヘッダを付けて往復させる方式と比べ、ヘッダの割合が下がるためです。1セグメントに接続できる機器は最大65,535台、マスタから見たアドレス空間は4GBの論理アドレスとして扱われます。
EtherCATフレームの構造とデータグラム・ワーキングカウンタの読み方
EtherCATヘッダ2バイトと最大15個のデータグラムが並ぶ配置
Beckhoffのフレーム構造の解説では、Ethernetヘッダの後ろにEtherCATヘッダ、その後ろにデータグラムが並びます。EtherCATヘッダは長さ11ビット・予約1ビット・種別4ビットの計2バイトで、スレーブ用チップが受け付ける種別は0x1だけです。
Ethernetヘッダ | EtherCATヘッダ(2B) | データグラム1 | ... | データグラムN(最大15) | FCS
データグラム = Cmd(1B) Idx(1B) Address(4B) Len11bit+R3bit+C1bit+M1bit(2B) IRQ(2B)
+ Data(nB) + WKC(2B)
データグラムのヘッダは合計10バイトです。Addressには、配線順の位置で指す方式、設定済みの局アドレスで指す方式、論理アドレスで指す方式のいずれかが入ります。Mビットは後続のデータグラムがあるかを示す。フレーム全体が64バイトに満たないときは1〜32バイトの埋め草が足されます。
ワーキングカウンタの加算規則と期待値で通信の欠落を検出する手順
各データグラムの末尾には16ビットのワーキングカウンタ(WKC)があります。スレーブは自分宛ての処理に成功すると、この値を加算して次へ渡す。読み出し成功で1、書き込み成功で1、読み書きコマンドでは読み出しだけの成功で1、書き込みだけで2、両方成功で3を足します。
実装上の使い方は単純です。マスタは構成時に期待値を計算しておき、戻ってきたWKCと毎周期比べる。一致しなければ、どこかのスレーブが応答していないか、Opへ入っていないということです。後述のpysoemではexpected_wkcが期待値、receive_processdata()の戻り値が実測値になります。ケーブル抜けを例外ではなくカウンタの不一致で知るため、WKCの監視を書かないマスタは、出力が止まっていても気付けません。
マスタとスレーブの構成要素とESIファイル・状態遷移の実装手順
標準NICで動くマスタと専用ESCを積むスレーブの通信処理の役割分担
ETGの解説では、マスタ(MainDevice)は専用のインターフェースカードを要さず、オンボードや安価な標準NICで実装できます。一方、スレーブ(SubDevice)はEtherCAT SubDevice Controller(ESC)をASIC、FPGA、またはマイコン内蔵の形で積みます。オンザフライ処理はこのESCがハードウェアで行うため、スレーブのCPU負荷には左右されません。
構成情報は3種類のファイルに分かれます。ベンダーが配るXML形式の機器記述ファイルがESI、スレーブのEEPROMに入った基本情報がSII、マスタが起動時に読むネットワーク構成がENIです。マスタにはClass A(標準)とClass B(機能を絞った組み込み向け)の区分があり、受託で装置コントローラを作る場合は、どちらのクラスに合わせるかで実装範囲が変わります。
Init・Pre-Op・Safe-Op・Opの4状態とBootstrapで許される通信
スレーブの状態はEtherCAT State Machine(ESM)が管理します。Beckhoffの状態遷移の解説をもとに、各状態で許される通信をまとめました。
| 状態 | メールボックス | プロセスデータ | マスタが行う処理 |
|---|---|---|---|
| Init | 不可 | 不可 | メールボックス用の設定 |
| Pre-Op | 可 | 不可 | PDO割り当てとFMMU設定 |
| Safe-Op | 可 | 入力のみ | 出力は安全状態で保持 |
| Op | 可 | 入出力 | 出力を実機へ反映 |
| Bootstrap | FoEのみ | 不可 | ファームウェア更新 |
実装で詰まりやすいのはSafe-OpからOpへの遷移です。Safe-Opでは入力だけが更新され、出力はウォッチドッグで安全状態に保たれる。マスタが有効なプロセスデータを送り始める前にOpを要求すると、スレーブが拒否してSafe-Op+エラーへ落ちます。先に周期送信を始めてからOpを要求する順序を守ってください。
分散クロック(DC)同期の仕組みと1マイクロ秒未満のジッタを得る条件
先頭のDC対応スレーブを基準時計にして伝搬遅延を補正する流れ
多軸のサーボを同時に動かすには、各スレーブが同じ時刻に出力を切り替える必要があります。ETGの解説によると、分散クロック(DC)では最初のDC対応スレーブの時計を基準とし、その時刻を周期的に他の全機器へ配ります。フレームは配線上を順に進むため、スレーブごとに届くまでの伝搬遅延が異なる。この遅延を起動時に測って補正することで、ジッタは1マイクロ秒を大きく下回るとされています。
基準がマスタのPCではなくスレーブ側にある点が要です。PCの時計はOSの割り込みで揺れるため、基準にすると装置全体が揺れる。ESCに内蔵された時計どうしを合わせる設計のおかげで、マスタが汎用OSでも軸間の同期は保てます。
SYNC0周期の設定とマスタ側の送信ゆらぎで同期が崩れる失敗例
DCを有効にしたスレーブは、設定した周期の同期信号(SYNC0)で出力を切り替えます。pysoemのサンプルではdc_sync(act=True, sync0_cycle_time=10_000_000)のようにナノ秒単位で10ミリ秒を指定しています。
失敗の典型は、SYNC0の周期とマスタがフレームを送る周期がずれる構成です。スレーブの時計がそろっていても、マスタからの新しい指令値がSYNC0に間に合わなければ、その周期は前回値のまま動く。マスタ側の周期タスクはリアルタイムOSのスケジューリングやリアルタイム拡張を入れたLinuxで組み、送信のゆらぎを周期の数パーセント以内に抑えます。汎用OS上のPythonで回すループは、検証用と割り切ってください。
PythonのpysoemでEtherCATスレーブを検出しSDOを読む手順
SOEM・IgH・pysoemのライセンスと動作環境から選ぶマスタ実装
オープンソースのマスタは主に3つあります。2026年10月20日時点の版とライセンスは次のとおりです。
| 実装 | 最新版 | ライセンス | 動作環境 |
|---|---|---|---|
| SOEM | v2.0.1(2026年10月15日) | GPLv3と商用 | Linux・Windows |
| IgH EtherCAT Master | 1.6.13(2026年9月15日) | GPL v2以降 | Linux |
| pysoem | 1.1.13(2026年1月11日) | MIT | Linux・macOS・Windows |
SOEMのリポジトリはGPLv3と商用のデュアルライセンスで、商用製品に組み込むならライセンス購入が必要になる可能性が高いと明記しています。IgH EtherCAT MasterはLinuxのカーネルモジュールとして動き、ethercatコマンドで状態を確認できます。pysoemはSOEMをPythonから呼ぶラッパーです。pysoem自体はMITですが、内部のSOEMには別の条件が付くため、製品へ同梱する前にSOEM側のライセンスを確かめてください。
pysoemでスレーブ一覧を取りベンダーIDとプロダクトコードを照合する
pysoemの動作要件では、LinuxはGCCと管理者権限、Windowsは64ビット版PythonとNpcap(WinPcap互換モードで導入)が必要です。まずインストールし、EtherCATを接続したNICの名前を調べます。
pip install pysoem
python -c "import pysoem; [print(a.name, a.desc) for a in pysoem.find_adapters()]"
次のスクリプトは、接続されたスレーブを列挙し、ESCから読んだベンダーIDとプロダクトコードを表示します。config_init()の後はスレーブがPre-Opにいるため、メールボックス経由のSDO読み出しも通ります。
import sys
import pysoem
master = pysoem.Master()
master.open(sys.argv[1]) # find_adaptersで調べたNIC名(Linuxなら eth0 など)
try:
if master.config_init() <= 0:
raise SystemExit("スレーブが見つかりません")
for pos, s in enumerate(master.slaves):
# 0x1018:01 はCoEのIdentityオブジェクトにあるベンダーID
vendor = int.from_bytes(s.sdo_read(0x1018, 1), byteorder="little")
print(f"{pos}: {s.name} man=0x{s.man:08X} id=0x{s.id:08X} sdo_vendor=0x{vendor:08X}")
finally:
master.close()
manとidはSIIから読んだ値、sdo_read(0x1018, 1)はCoEオブジェクトの読み出しで取った値です。両者が一致しない、または想定した並び順と違う場合は、配線順かESIの取り違えを疑います。公式サンプルも、起動時に期待する機器構成と照合し、違えば停止する作りになっています。
SAFEOPからOPへ遷移させてワーキングカウンタを監視するループ
プロセスデータを動かすには、PDOのマッピング、Safe-Opの確認、周期送信の開始、Opの要求をこの順で行います。pysoemのタイムアウトはマイクロ秒単位です。
import time
master.config_map()
if master.state_check(pysoem.SAFEOP_STATE, timeout=50_000) != pysoem.SAFEOP_STATE:
raise SystemExit("SAFEOPに到達しないスレーブがあります")
master.state = pysoem.OP_STATE
master.send_processdata() # 先に有効なプロセスデータを1回送る
master.receive_processdata(timeout=2000)
master.write_state() # 全スレーブへOPを要求
master.state_check(pysoem.OP_STATE, timeout=50_000)
while True:
master.send_processdata()
wkc = master.receive_processdata(timeout=100_000)
if wkc != master.expected_wkc:
print("WKC不一致:応答しないスレーブかOP外のスレーブがあります")
time.sleep(0.01)
Linuxの装置コントローラでIgH EtherCAT Masterを使う場合は、同じ確認をコマンドで行えます。
ethercat master # マスタとNICの状態
ethercat slaves # 例: 1 5555:0 PREOP + EL3162 2C. Ana. Input 0-10V
ethercat pdos -p 1 # 位置1のスレーブのSyncManagerとPDO割り当て
ethercat upload -p 1 0x1018 1 # SDO 0x1018:01(ベンダーID)を読む
ethercat states -p 1 OP # 位置1のスレーブへOPを要求
ethercat slavesの出力は、位置・エイリアス・状態・エラーフラグ・名前の順です。エラーフラグがEなら、スキャンか構成に失敗しています。pdosのTxとRxはスレーブから見た向きなので、マスタ側の入出力と逆になる点に注意してください。
PROFINET・EtherNet/IPとの違いとEtherCATを選ぶ装置側の条件
定時性の作り方で分かれる三方式とEtherCATが向く多軸モーション
主要な産業用Ethernetは、定時性をどこで作るかが違います。EtherNet/IPは標準のEthernetスイッチと時刻同期で周期を守り、PROFINETのIRTは専用機能を持つスイッチで時間枠を予約する。EtherCATは前述のとおり、フレームがスレーブを通過する間にESCが処理します。
この処理方式の差が、選ぶ場面を分けます。ETGが掲げる設計目標は周期100マイクロ秒以下、ジッタ1マイクロ秒以下で、異常の検出は15マイクロ秒未満。多軸のモーション同期が装置の価値そのものなら、EtherCATを第一候補にします。上位のIT機器と同じ配線に載せたい、既存のPLCがPROFINETやEtherNet/IPで統一されている、という条件が勝つ場合は、そちらに合わせたほうが保守の体制を一本化できます。
CoE・SoE・EoE・FoEのメールボックスで既存資産を持ち込む範囲
EtherCATは上位プロトコルを自前で持たず、既存の規格をメールボックスで運ぶ設計です。CoEはCANopenのオブジェクトディクショナリをそのまま使い、PDOとSDOの概念もCAN通信とCANopenの機器プロファイルから引き継いでいます。SoEはIEC 61800-7-204のサーボプロファイル、FoEはファイル転送、EoEはEthernetフレームのトンネリングです。
実務で最初に押さえるのはCoEです。サーボやI/Oの設定はほぼCoEのインデックスで行うため、CANopen機器の扱いに慣れた技術者なら設定作業はそのまま通用する。EoEは、保守用PCやカメラのようなEthernet機器をEtherCATセグメントへつなぐ経路で、ETGの解説ではSwitchportと呼ぶ機器を介して接続します。安全通信は別枠のFSoEで、IEC 61784-3に規定されSIL 3まで対応します。
上位システムへのデータ吸い上げとOPC UA併用で詰まる実装上の課題
制御周期と収集周期を分けてゲートウェイで間引く上位連携構成の判断
工場のデータ収集で最初に起きる誤解は、EtherCATの周期のままMESやクラウドへ値を送ろうとすることです。100マイクロ秒周期の値をすべて上位へ流すと、1軸あたり毎秒1万件になり、データベースもネットワークも持ちません。制御の周期と収集の周期は、桁が違うものとして分けて設計します。
扱いやすいのは、EtherCATマスタを兼ねるPLCや産業用PCの上で、値を集計してからOPC UAの情報モデルとして公開する構成です。最大値・平均値・異常発生時の前後データのように、意味のある単位へ間引いてから渡す。クラウドへ送る区間はSparkplug BのようなMQTT上の規約へ載せ替えると、機器の死活と値を一緒に扱えます。収集方式の選び分けはPLCのデータ収集の四方式で整理しています。
EtherCATの内側を触らず上位で受ける判断と受託開発の切り分け方
ここは言い切ります。データ収集だけが目的なら、EtherCATのマスタを新たに書かないでください。稼働中の装置のEtherCATへ別のマスタを足すことはできず、既存マスタの構成を変えれば装置メーカーの保証範囲から外れる場合がある。値はPLC側から取り出すのが原則です。
EtherCATのマスタ実装まで踏み込むのは、自社で装置そのものを作る場合と、PCベースの制御へ置き換える場合に限られます。その場合も、制御周期の実装はRTOSやリアルタイムLinuxの経験がある体制で行い、上位連携とは発注を分けたほうが責任の境界が明確になる。当社では、装置やPLCから取り出したデータをOPC UAやMQTTで集約し、可視化や予兆検知までつなぐ構成をAI/IoTソリューションとして請けています。既設ラインの切替手順は産業用ネットワークの導入手順もあわせて確認してください。
よくある質問
EtherCATの仕組みと導入でよく寄せられる質問をまとめました。
EtherCATとは簡単に言うとどのような通信ですか?
工場の装置の中で、コントローラとサーボやセンサーをEthernetケーブルでつなぐ通信規格です。コントローラが送った1つのフレームが機器を順番に通り抜け、各機器は通過中に自分の分のデータを読み書きします。宛先ごとにやり取りを繰り返さないため短い周期で全機器と通信でき、複数のモーターを同じタイミングで動かす装置に向いています。
EtherCATの通信速度と周期はどれくらいですか?
伝送速度は100 Mbit/sで、ETGは全二重のため理論上はその2倍を扱えるとしています。設計目標は周期100マイクロ秒以下、同期のジッタは1マイクロ秒以下です。ただし実際の周期は、接続台数とデータ量、そしてマスタ側の送信周期をどこまで安定させられるかで決まります。カタログの数値をそのまま約束せず、実機の構成で見積もってください。
EtherCATに一般的なEthernetスイッチやLANケーブルは使えますか?
ケーブルは100BASE-TXの一般的なEthernetケーブルが使え、銅線ならノード間100メートルまでです。一方、スレーブの間に一般的なスイッチを挟む構成は前提にしていません。保守用PCなどのEthernet機器は、ETGがSwitchportと呼ぶ機器を介してつなぎ、EoEでフレームを運びます。100メートルを超える区間は光ファイバへ切り替えます。
EtherCATとPROFINETはどちらを選ぶべきですか?
多軸モーションの同期精度が装置の性能を決めるならEtherCATを、工場全体でPLCがPROFINETに統一されているならPROFINETを選ぶのが基本です。性能差より、既存設備と保守体制との整合のほうが運用費に効きます。規格全体の比較は、産業用ネットワークの分類と選定軸を整理した記事で扱っています。
EtherCATのマスタは自作できますか?
できます。マスタは標準のNICで動くため、SOEMやIgH EtherCAT Master、PythonならpysoemといったOSSで実装できます。ただし制御周期を安定させるにはリアルタイム性のあるOSが要り、SOEMを製品に組み込むなら商用ライセンスの検討も必要です。稼働中の装置へ別のマスタを足すことはできないため、データ収集が目的ならPLC側から取り出してください。
関連記事
- 産業用ネットワークとは?フィールドバスと産業用Ethernetの分類・規格選定を実装目線で解説:EtherCATを含む規格全体の分類と選定軸
- 産業用ネットワークの導入手順|既存設備を止めずに移行する構成設計と切替の進め方:既設ラインを止めずに切り替える手順
- OPC UAとは?情報モデルとOPC Classicとの違い・採用判断を実装目線で解説:EtherCATの値を上位へ渡す情報モデル
- Modbusとは?RTUとTCPの違い・レジスタとファンクションコードを実装目線で解説:計測器やインバータで残るフィールドバス
- IoTゲートウェイとは?プロトコル変換の役割とクラウド直結との使い分け:装置とクラウドをつなぐ層の判断