2025.04.29, Version v3.2r0.
EtherCATライブラリAPIユーザーマニュアルファイルをダウンロードできます ここ.
1. 概要
1.1 QEC Mデバイスとは
QEC(Quicker, Easier Control with EtherCAT)は、ICOPが開発したEtherCATコントローラです。高い同期性とリアルタイム性を備え、開発の容易さも兼ね備えています。以下では、QECの構造、機能、そして性能について説明します。
QEC Mainデバイスは、86Duino Coding IDE 500+と互換性のあるEtherCAT Mainデバイスシステムです。EtherCAT MainデバイスとEtherCAT Subデバイス間のリアルタイムEtherCAT通信を提供します。86Duino IDEのEtherCATライブラリに加え、QEC MainデバイスはModbus、Ethernet TCP/IP、CANバスなどの産業用通信プロトコルもサポートし、豊富な高水準C/C++プログラミング言語を使用して迅速なアプリケーション開発を実現します
1.1.1 86Duino IDE とは?
86Duino統合開発環境(IDE)ソフトウェアを使えば、86DuinoボードとQEC Mainデバイスへのコード記述とアップロードが簡単に行えます。Windows、Mac OS やLinuxで動作します。この環境はJavaで記述されており、Arduino IDE、Processing、DJGPPなどのオープンソースソフトウェアをベースにしています。これらのソフトウェアは以下からダウンロードできます。 https://www.qec.tw/software/.

QEC Mainデバイスのソフトウェアである86Duino IDE は、コンフィギュレーションユーティリティ: 86EVAを提供します。これはユーザーがEtherCATネットワークのパラメータを編集するためのグラフィカル・ユーザー・インターフェイス・ツールであり、その機能は次のとおりです:
- EtherCAT Subデバイスの検索
- ENIファイルのインポート
- EtherCAT Mainデバイスの設定
- EtherCAT Subデバイスの設定
その他の詳細な機能については、86EVA ユーザーマニュアルを参照してください。 86EVA User Manual.
1.1.2 QEC EtherCAT Mainデバイスの構造
EtherCAT Mainデバイスソフトウェアは、DM&P社製のデュアルシステムアーキテクチャを備えたVortex86EX2 CPU上でのみ動作します。EtherCAT Mainデバイスソフトウェアは主に2つの部分に分かれており、それぞれがVortex86EX2 CPUのそれぞれのシステム上で動作します。
それぞれのシステムは以下のタスクを担当します。
- EtherCAT Mデバイスライブラリ
- C/C++ アプリケーション・インターフェイスを提供します:
- 初期化インターフェイス
- コンフィギュレーションインターフェイス
- プロセス・データ (PDO)・アクセス・インターフェイス
- EtherCATを介したCANアプリケーション・プロトコル(CoE)・アクセス・インターフェイス
- EtherCATを介したファイル(FoE)・アクセス・インターフェイス
- Subデバイス情報インターフェイス (SII)・ アクセス・ インターフェイス。
- 同期クロック (DC)・アクセス・インターフェイス
- C/C++ アプリケーション・インターフェイスを提供します:
- EtherCAT Mデバイスファームウェア
- EtherCAT Mainデバイス コア を実行します。
- プライマリ/セカンダリ・イーサネット・ドライバを制御し、 EtherCATフレームを送信します。
プログラムは、FreeDOSオペレーティングシステム上で動作するように設計されており、DJGPP 環境によって提供されるGCCコンパイラを使用してコンパイルされています。
1.1.3 ハードウェアプラットフォーム
EtherCAT Mainデバイスソフトウェアは、DM&P社製のデュアルシステムアーキテクチャを備えたVortex86EX2 CPU上でのみ動作します。マスターシステムとスレーブシステムに分かれており、それぞれが独自のオペレーティングシステムを実行します。システム間の通信は、デュアルポートRAMとイベント割り込みによって実現されます。
それぞれのタスクは次のとおりです。
- マスタシステム
- ユーザーのEtherCATアプリケーション
- ユーザーのHMIアプリケーション
- ユーザーのイーサネットアプリケーション
- など。
- スレーブシステム
- EtherCAT Mainデバイス ファームウェアの実行のみを担います。
ほとんどのアプリケーションはマスターシステム上で実行されるため、スレーブシステム上で実行されるEtherCAT Mainデバイスファームウェアは他のアプリケーションからの干渉を受けません。この設定により、スレーブシステムはEtherCAT Mainデバイスコアの実行に集中でき、EtherCATの同期機能とリアルタイム機能を確保できます。

1.1.4 デュアルシステムの同期
このセクションの主な議論は、デュアルシステムPDOデータの同期です。下図に示すように、ユーザーアプリケーションとEtherCAT Mainデバイス・ライブラリ・ブロックはマスタシステム上で実行され、リアルタイムEtherCAT Mainデバイスコアはスレーブシステム上で実行されます。
EtherCAT Mデバイス コアが Process Inputs 段階に到達すると、Ethernet ドライバーからすべての周期フレームを受信し、入力 PDO データを DPRAM にコピーします。
User Application段階に到達すると、EtherCAT Mainデバイス コアはマスターシステムへの周期割り込みをトリガーします。周期割り込みを受信すると、マスターシステムはEtherCAT Mainデバイスライブラリの割り込み処理手順を実行します。入力PDOデータをDPRAMからメインメモリに移動し、ユーザが登録した周期コールバックを呼び出し、周期コールバック完了後に出力PDOデータをメインメモリからDPRAMに転送し、非周期コマンドを処理して割り込み処理手順を終了します。この時点で、EtherCAT Mainデバイス コアのUser Applicationと割り込み処理手順は同時に完了します。
EtherCAT Mainデバイス コアが Write Outputs 段階に到達すると、出力 PDO データを DPRAM から Ethernetドライバの DMA にコピーし、フレームを送信します。
これらのタスクは、概説された手順に従って循環に実行され、デュアルシステムPDOデータの同期が保証されます。

1.2 主な機能
EtherCAT Technology Groupは、ETG.1500において、EtherCAT Mデバイスソフトウェア実装の2つのクラスを定義しました。この仕様では、明確に定義されたMデバイス機能セットを備えたMainデバイスクラスが定義されています。
簡単にするために、2 つの Mainデバイス クラスのみが定義されています:
- Class A: 標準EtherCAT Mainデバイス
- Class B: ミニマムEtherCAT Mainデバイス
以下に、Class A、Class B、および QEC Mainデバイスの比較を示します。
1.2.1 機能表
単語の使い方:
- shall: 等しい必要があります。
- should: 等しいことが推奨されます。
- may: 等しいことが許可されます。
- O: サポートされていることに相当します。
| 機能名 | 簡単な説明 | Class A | Class B | QEC Mデバイス |
|---|---|---|---|---|
| 基本的な機能 | ||||
| Service Commands | すべてのコマンドのサポート | shall if ENI import support | O | |
| IRQ field in datagram | データグラムヘッダーのSubデバイスからのIRQ情報を使用する | should | should | — |
| SubDevices with Device Emulation | アプリケーションコントローラの有無にかかわらずSubデバイスをサポート | shall | shall | O |
| EtherCAT State Machine | ESMの特別な動作のサポート | shall | shall | O |
| Error Handling | ネットワークまたはスレーブのエラーのチェック(ワーキング・カウンタ、など) | shall | shall | O |
| VLAN | VLANタグをサポート | may | may | — |
| EtherCAT Frame Types | EtherCATフレームのサポート | shall | shall | O |
| UDP Frame Types | UDPフレームをサポート | may | may | — |
| プロセス・データ交換 | ||||
| Cyclic PDO | 周期的なプロセス・データ交換 | shall | shall | O |
| Multiple Tasks | 異なるサイクルタスク、PDOの複数の更新レート | may | may | — |
| Frame repetition | 周期的なフレームを複数回送信して耐性を高める | may | may | — |
| ネットワークコンフィギュレーション | ||||
| Online scanning | EtherCAT Mデバイスに含まれるネットワーク構成機能 | at least one of them | O | |
| Reading ENI | ENIファイルから取得したネットワークコンフィギュレーション | at least one of them | O | |
| Compare Network configuration | 事前に構成されたネットワークと実際のネットワーク構成を起動時に比較する | shall | shall | O |
| Explicit Device Identification | ケーブル交換に対し、ホットコネクト防止に使用される識別 | should | should | O |
| Station Alias Addressing | Subデバイスで構成されたステーションエイリアスをサポート | may | may | — |
| Access to EEPROM | ESCレジスタ経由でEEPROMにアクセスするためのルーチンをサポート | Read shall / Write may | O | |
| メールボックスのサポート | ||||
| Support Mailbox | メールボックス転送の主な機能 | shall | shall | O |
| Mailbox Resilient Layer | フレーム損失時の回復レイヤーをサポート | shall | shall | O |
| Multiple Mailbox channels | 1台のデバイスへの同時メールボックスプロトコル転送 | may | may | — |
| Mailbox polling | Subデバイスのメールボックスの状態をポーリングする | shall | shall | — |
| EtherCATを介したCANアプリケーション層( CoE ) | ||||
| SDO Up/Download | 通常および迅速な転送 | shall | shall | O |
| Segmented Transfer | 分割転送 | shall | should | O |
| Complete Access | 一度にオブジェクト全体 (すべてのサブ・インデックスを含む) を転送 | shall | should (shall if ENI Import supported) | O |
| SDO Info service | オブジェクト辞書を読み取るサービス | shall | should | O |
| Emergency Message | 緊急メッセージを受信する | shall | shall | — |
| PDO in CoE | CoE経由で送信されるPDOサービス | may | may | — |
| EoE | ||||
| EoE protocol | イーサネットフレームをトンネリングするためのサービス。指定されたすべてのEoEサービスが含まれます。 | shall | shall if EoE support | — |
| Virtual Switch | 仮想スイッチ機能 | shall | shall if EoE support | — |
| EoE Endpoint to Operation Systems | EoE 層上のオペレーティング システムへのインターフェイス | should | should if EoE support | — |
| FoE | ||||
| FoE Protocol | FoEプロトコルをサポート | shall | shall if FoE support | O |
| Firmware Up/Download | パスワード、ファイル名は、アプリケーションにより与えられる | shall | should | O |
| Boot State | ファームウェアのアップ/ダウンロードのためのブート状態をサポート | shall | shall if FW UP/Download | — |
| SoE | ||||
| SoE Services | SoEサービスのサポート | shall | shall if SoE support | — |
| AoE | ||||
| AoE Protocol | AoEプロトコルをサポート | should | should | — |
| VoE | ||||
| VoE Protocol | 外部接続をサポート | may | may | — |
| 高精度時刻同期 (DC) との同期 | ||||
| DC support | 時刻同期のサポート | shall | shall if DC support | O |
| Continuous Propagation Delay compensation | 伝播遅延の連続計算 | should | should | — |
| Sync window monitoring | サブデバイスの同期差異の継続的な監視 | should | should | — |
| SubDevice-to-SubDevice Communication | ||||
| via MDevice | 情報はENIファイルで提供されるか、他のネットワーク構成の一部として提供される。データのコピーはMデバイススタックまたはMデバイスアプリケーションによって処理される。 | shall | shall | — |
| MDevice information | ||||
| MDevice Object Dictionary | Mデバイス オブジェクト ディクショナリのサポート (ETG.5001 MDP サブ プロファイル 1100) | should | may | — |
1.3 機能パック
1.3.1 ケーブルの冗長性
EtherCATケーブルの冗長性とは、ケーブル障害が発生した場合でも継続的に信頼性の高い通信を維持するEtherCAT通信システムの機能を指します。ケーブル冗長性では、両方向で動作するリングトポロジが採用されています。1つのケーブルに障害が発生するか、切断されても、別のケーブルパスが機能し通信が中断されません。ケーブル冗長性により、EtherCATネットワークの耐障害性が強化され、休止時間が最小限に抑えられ、システム全体の信頼性が向上します。
ケーブル冗長化において、ケーブルが断線しているかどうかについては、以下の3つのシナリオが挙げられます。以下では、ケーブル冗長化の仕組みと、各シナリオにおけるEtherCAT Mainデバイスコントローラの違いについて説明します。
- ケーブル断線なし
- 2つのSubデバイス間のケーブルが断線
- MainデバイスとSubデバイス間のケーブル断線
説明を簡単にするために、ここではいくつかの仮定を置きます:
- サイクル・タイムが 125μsに設定されていると仮定します。
- すべてのSubデバイスが入力 PDO のみ(出力 PDO なし)であると仮定すると、プロセス データ フレーム内の作業カウンタ (WKC) は、すべてのSubデバイスを通過するたびに 1 増加します。
- EtherCAT ネットワーク上にSubデバイスが 6 個しかなく、予想される動作カウンタ (EWKC) が 6 であると仮定します。
- プライマリ・ポートとセカンダリ・ポートは、すべてのサイクルで同時にプロセス・データ・フレームを送信します。
更に詳しいケーブル冗長性は以下WEBをご参照下さい。 EtherCAT機能パック:ケーブル冗長性.
1.4 ベンチマーク
EtherCATは、高い同期能力で知られるフィールドバス・テクノロジです。高度な同期を必要とするアプリケーションでは、多くの場合、リアルタイム性能と高制御周波数が求められます。これらの背景をもつユーザーは、通常、次のような仕様を考慮します:
- より短いサイクル・タイムをサポート
- より多くのプロセス・データをサポート
- より多くのEtherCAT Subデバイスのサポート
ただし、EtherCAT Mainデバイス がユーザーのアプリケーション要件を満たしているかどうかを評価するには、多くの場合、ベンチマーク測定が主な考慮事項となります。
詳細は以下のWEBをご参照ください。 EtherCAT MDevice Benchmark
1.4.1 EtherCAT Mainデバイス 周期フレームジッタ
DC SYNC0 を基準とする、EtherCAT Mainデバイス からの周期フレームの送信におけるジッタ。
- 参照ビデオ: https://youtu.be/O888jD4XUsY?si=NaI9gsafyA1D2DlK
1.5 同期
EtherCATネットワーク内のすべてのSubデバイス間の時間同期は、EtherCAT Subデバイスコントローラ (ESC) 内の分散クロック (DC) 単位に依存し、システム全体の一貫性を保証します。通常、最初のDC機能を持つSubデバイスがシステムの基準クロックとして機能し、他のDC機能を持つSubデバイスを同期させます。DCの詳細な説明については、1.5.3 DC同期を参照ください。

ESCには3つの同期出力ピンがあります。 IRQ, SYNC0, SYNC1: ESCがEtherCAT循環フレームを受信した後に、IRQピンは上位層のマイクロコントローラ (µC) へ信号を生成します。SYNC0およびSYNC1ピンは、ESCのDC関連レジスタの設定に基づいて、周期的にマイクロコントローラに信号を生成します。したがって、EtherCAT Subデバイスに µC がない場合、同期機能はサポートされません。
EtherCAT には 3つの同期モードがあります:
- Free run(フリーラン)
- SM同期
- DC同期
1.5.1 Free run(フリーラン)
EtherCAT MainデバイスとすべてのEtherCAT Subデバイスはそれぞれ独自のローカルタイマーを持ち、サイクルタイムは独立しているため同期していません。下の図に示すように、EtherCAT MainデバイスとSubデバイス 1、Subデバイス 2、Subデバイス 3、そしてSubデバイス nはそれぞれ独自のサイクルタイムを持ち、その結果、不一致が生じています。 と このシナリオは、高い同期要件を持つアプリケーションには適していません。

1.5.2 SM同期
ESCが周期フレームを受信すると、IRQピンはSMイベントを生成します。このイベントは、µC内のローカルアプリケーションの実行をトリガーします。下の図に示すように、周期フレームは、Mデバイスが送信時と同じジッタでSubデバイスに受信されます。ジッタがゼロであると仮定しても、ハードウェアの伝播遅延が有限であるため、最後のSubデバイスは最初のSubデバイスよりも遅れて周期フレームを受信します。
伝播遅延により、サブデバイス間の SM イベントのタイミングにオフセットが生じ、SM 同期の精度は マイクロ秒 レベルになります。
各SubデバイスがSyncManager Parameter object (0x1C32.3/0x1C33.3) の Shift Time をサポートしている場合、すべてのSubデバイスの Output Valid と Input Latch を互いに近くなるように調整することが可能です。ただし、伝播遅延を計算できないため、調整は非常に困難です。

1.5.3 DC同期
SYNC0またはSYNC1 ピンは、ESCのDC関連レジスタのコンフィギュレーションに基づいて SYNCイベントを周期的に生成し、このイベントにより µC 内のローカル・アプリケーションの実行をトリガします。下の図に示すように、ジッタと伝播遅延は依然として存在し、循環フレームを受信した後に SMイベントがトリガされます。ただし、このDC同期方式では、SYNC0イベントは周期的にトリガされるため、ジッタや伝播遅延の影響を受けません。
SYNC0 イベントは DC ユニットによってトリガーされ、Subデバイス間のすべての SYNC0 イベントにはほとんどオフセットがないため、すべてのSubデバイスのシステム時間を同期するための APRW/FPRW コマンドの定期的な送信により、精度は ナノ秒 レベルに達します。
Subデバイスが SyncManager Parameter objects (0x1C32.3/0x1C33.3) の Shift Time をサポートしている場合は、これらのSubデバイスの Output Valid と Input Latch のタイミングを同じ時点に調整することが可能です。
ただし、図のGlobal Shift Timeの選択は重要であり、次の条件を満たす必要があります。
- すべてのSubデバイスが周期フレームを受信した後
- 次のサイクルの循環フレームを送信する前
- さまざまなDC同期方式に応じて、 DC同期 出力の準備を実行した後に選択する必要がある場合があります 出力の準備 :
- SM イベントが発生したときに µC をトリガーして 出力の準備 を実行します
- SYNC イベントが発生したときに、µC をトリガーして Output Valid を実行します。
修正されたグローバル・シフト時間は一意ではありません。サイクル時間の全間隔内で選択できます。さまざまな DC同期方式の詳細については、ETG.1020 EtherCATプロトコル拡張機能を参照してください。

2. 関数
QEC EtherCAT Mデバイス ライブラリ
EtherCATは、オートメーションおよび制御システムで広く使用されているリアルタイム産業用イーサネット通信プロトコルです。QEC-Mainデバイスは、C/C++で実装されたEtherCAT Mainデバイスライブラリで、Mainデバイス、汎用Subデバイス、CiA 402Subデバイス、そしてQEC Subデバイスシリーズ専用のクラスが含まれています。これらのクラスは、明確に定義された役割を持つだけでなく、将来の拡張性も考慮されています。

これらのクラスは、次の3つの部分に分けられます:
- EtherCAT Mデバイス
EtherCAT Mデバイス パートは、多様で柔軟な Mainデバイス 構成および操作機能を提供するだけでなく、EtherCAT Device パートによって呼び出される多様な EtherCAT Subデバイス 操作機能も提供します。
- EtherCATデバイス
EtherCAT デバイスパートは、PDO、CoE、FoE などの機能を操作できる汎用 EtherCAT Subデバイス クラスを提供し、CiA 402 Subデバイス 汎用クラスも含まれています。
- QECシリーズデバイス
QECシリーズデバイスパートは、ICOP社のQECシリーズSubデバイス専用の機能を提供し、ユーザーがより使いやすく、簡潔な方法でコード化できるようにします。
2.1 EtherCAT Mainデバイス
EtherCAT Mデバイス パートは、多様で柔軟な Mainデバイス構成および操作機能を提供するだけでなく、EtherCAT デバイスパートによって呼び出される多様な EtherCAT Subデバイス操作機能も提供します。
Ethercat MデバイスはEtherCAT Mデバイスパートにおける唯一のクラスであり、EtherCATファームウェアとの重要な通信ブリッジとして機能します。デュアルシステム通信においては、通信インターフェースの初期化、周期的なデータ交換の処理、非周期転送インターフェースの処理、割り込みイベントの管理などを担当します。APIにおいては、Mainデバイスの初期化、Mainデバイスの制御、およびSubデバイス情報へのアクセスに関連する機能を提供します。
EtherCAT Mデバイスパートと EtherCAT デバイスパートの主なクラス関係は「関連」であり、EtherCAT デバイスパートは EtherCAT Mデバイスパートに依存します。EthercatMasterのクラス関係は次の図に示されています。

- EthercatMasterと _EthercatDevice_CommonDriver の間には関連があり、_EthercatDevice_CommonDriver は EthercatMasterに依存します。
- EthercatMaster と EthercatDevice_CiA402 の間には関連があり、EthercatMaster は EthercatDevice_CiA402 に依存します。
EtherCAT Mデバイス 設定
このライブラリは、ユーザーの多様なアプリケーション・ニーズを満たすために、ユーザーが選択できる様々なコンフィギュレーション変数を提供します。以下は、このライブラリによって提供されるコンフィギュレーション変数です。
typedef struct {
EthercatDcSyncMode DcSyncMode;
uint32_t StaticDriftCompensationFrames;
uint32_t StateMachineTimeoutI2P;
uint32_t StateMachineTimeoutP2S;
uint32_t StateMachineTimeoutS2O;
uint32_t ScanNetworkTimeout;
uint32_t StartMasterTimeout;
uint32_t StartDeviceTimeout;
uint32_t ErrorDetectWkcMultipleFaultsThreshold;
uint32_t ErrorDetectMultipleLostFramesThreshold;
uint32_t EnableErrorBusReactionSyncUnitToSafeOp:1,
EnableErrorBusReactionSyncUnitToSafeOpAutoRestart:1,
IgnoreBiosOverride:1;
} EthercatMasterSettings;DcSyncモード
デフォルト: ECAT_MASTER_SHIFT
DC同期モードでは、DCに接続された最初のSubデバイスがシステムリファレンスクロックとして機能し、他のSubデバイスをDCに同期させます。ただし、これはネットワーク上のすべてのSubデバイスのシステム時刻を同期するだけであり、EtherCAT Mデバイスは同期されません。DC同期モードが有効になっているアプリケーションでは、Mデバイスは通常、サブデバイスを正確かつ定期的に制御する必要があるため、Mデバイスはネットワーク上のすべてのSubデバイスとシステム時刻を同期させる必要があります。
この同期には 2つの方法があります:
- MDevice Shift Mode –
ECAT_MASTER_SHIFT
- Mデバイス システム時間は参照クロックに同期されます。
- すべての DC Subデバイスはリファレンス クロックに同期されます。
- バス・シフト・モード -
ECAT_BUS_SHIFT
- Mデバイス システムクロックは参照クロックに同期されます。
- すべての DC Subデバイスはリファレンス クロックに同期されます。
StaticDriftCompensationFrames
デフォルト: 30000
EtherCAT Mデバイスは、多数の個別の ARMW または FRMW ドリフト補正フレームを送信して、リファレンス クロックのシステム時間をすべての DC Subデバイスに配布します。
StateMachineTimeoutI2P
デフォルト: 3000 単位:ミリ秒
Init 状態から Pre-Operational状態への移行のタイムアウト時間
StateMachineTimeoutP2S
デフォルト:10000 単位:ミリ秒
Pre-Operational状態からSafe-Operational状態への移行のタイムアウト時間
StateMachineTimeoutS2O
デフォルト:10000 単位:ミリ秒
Safe-Operational状態からOperational状態への移行のタイムアウト時間
ScanNetworkTimeout
デフォルト: 5000 単位:ミリ秒
スキャン・ネットワークのタイムアウト時間。スキャン・ネットワーク操作は、 EthercatMaster::begin().で行われます。
StartMasterTimeout
デフォルト: 3000、単位: ミリ秒
Mデバイス を起動するための基本タイムアウト、Tbase。EthercatMaster::start() では、ファームウェアが EtherCAT を起動するように要求され、この要求のタイムアウトは起動タイムアウト、Tstartup と呼ばれます。
EtherCAT の起動タイムアウトは、次のように計算されます: Tstartup = Tbase + (TSubDevice × NSubDevices)。
ここで、NSubDevices は、ネットワーク上の Subデバイス の数です。
StartDeviceTimeout
デフォルト: 500、単位: ミリ秒
開始 Mデバイス の Subデバイス ごとのタイムアウト、TSubDevice。
ErrorDetectWkcMultipleFaultsThreshold
デフォルト: 3
Mデバイス は受信した EtherCAT データグラムのワーキングカウンタをチェックします。ワーキングカウンタが期待値と一致しない場合、エラーが検出されます。連続エラー数がこのパラメータを超えると、ECAT_ERR_WKC_MULTIPLE_FAULTS エラー割り込みがトリガーされます。
ErrorDetectMultipleLostFramesThreshold
デフォルト: 3
Mデバイスは、EtherCAT データグラムヘッダーのインデックスを使用して、送信されたすべての EtherCAT データグラムが受信されたかどうかを確認します。EtherCAT データグラムが失われた場合、エラーが検出されます。連続エラー数がこのパラメータを超えると、ECAT_ERR_MULTIPLE_LOST_FRAMES エラー割り込みがトリガーされます。
EnableErrorBusReactionSyncUnitToSafeOp
デフォルト: 0
このパラメータを 1 に設定すると、Mデバイスはアプリケーション コントローラを使用してSubデバイスの EtherCAT 状態を変更し、EtherCAT 状態マシン エミュレーションのみをサポートするSubデバイスの同期マネージャ チャネルを無効にします。
EnableErrorBusReactionSyncUnitToSafeOpAutoRestart
デフォルト: 1
このパラメータは、EnableErrorBusReactionSyncUnitToSafeOp が 1 に設定されている場合にのみ有効になります。このパラメータが 1 に設定されている場合、Mデバイス は、ETG.1020 EtherCAT プロトコル拡張機能で定義されている Mデバイスの同期ユニットの再起動動作に従って、同期ユニットの再起動を自動的に試行し、EtherCAT ステート マシンを動作状態に戻します。
IgnoreBiosOverride
デフォルト: 0
QEC-Mデバイスには、BIOS 内にいくつかの EtherCAT 設定パラメータがあります。このパラメータを 1 に設定すると、BIOS 内の EtherCAT 設定パラメータは無視されます。それ以外の場合は、無視されません。
2.1.1 初期化関数
EtherCAT Mデバイスを起動する前に、初期化する必要があります。このライブラリは、ユーザーの多様なアプリケーションニーズを満たすために、ユーザーが選択できる様々な設定パラメータを提供します。
2.1.2 コールバック関数

このライブラリは、次の 3 種類のコールバックを提供します:
- 周期コールバック(Cyclic Callback)
周期コールバックの目的は、モーション制御、CNC制御、ロボット制御などの周期制御システムを実装できるようにすることです。リアルタイムEtherCAT Mデバイスコアは、指定された周期時間でEtherCAT Mデバイスライブラリへの周期割り込みをトリガーし、ACKを待機することでプロセスデータの同期を確保します。ユーザーが周期コールバックを登録している場合は、周期制御を実現するためにそれが呼び出されます。 - エラー・コールバック(Error Callback)
リアルタイムEtherCAT Mデバイスコアはエラーを検出すると、エラー割り込みをトリガーし、32ビットのエラーコードをEtherCAT Mデバイスライブラリに渡します。ユーザーがエラーコールバックを登録している場合、システムはそのコールバックを呼び出して、ユーザーに特定のエラーを通知します。
エラー・コールバックでサポートされているエラー・コードは次のとおりです:
| 定義 | コード | 説明 |
ECAT_ERR_WKC_SINGLE_FAULT | 2000001 | ワーキング・カウンタに障害が発生しました |
ECAT_ERR_WKC_MULTIPLE_FAULTS | 2000002 | 複数のワーキング・カウンタに障害が発生しました |
ECAT_ERR_SINGLE_LOST_FRAME | 2000003 | フレームが失われました |
ECAT_ERR_MULTIPLE_LOST_FRAMES | 2000004 | フレームが複数回失われました |
ECAT_ERR_CABLE_BROKEN | 2000007 | ケーブルが切断されました |
ECAT_ERR_WAIT_ACK_TIMEOUT | 2001000 | 循環的な割り込みACKの待機中にファームウェアがタイムアウトしました |
- イベント・コールバック(Event Callback)
リアルタイムEtherCAT Mデバイスコアはイベントを検出すると、イベント割り込みをトリガーし、32ビットのイベントコードをEtherCAT Mデバイスライブラリに渡します。ユーザーがイベントコールバックを登録している場合、システムはそのコールバックを呼び出して、特定のイベントをユーザーに通知します。
イベント・コールバックでサポートされているイベント・コードは次のとおりです:
| 定義 | コード | 説明 |
ECAT_EVT_STATE_CHANGED | 1000001 | Mデバイスの EtherCAT 状態が変更されました。 |
ECAT_EVT_CABLE_RECONNECTED | 1000002 | ケーブルが再接続しました |
- attachCyclicCallback()
- detachCyclicCallback()
- attachErrorCallback()
- detachErrorCallback()
- attachEventCallback()
- detachEventCallback()
- errGetCableBrokenLocation1()
- errGetCableBrokenLocation2()
- evtGetMasterState()
2.1.3 Subデバイス情報関数
このライブラリは、ネットワーク上のEtherCATSubデバイスに関する情報を取得するための関数を提供します。ネットワーク上のSubデバイスの数の問い合わせ、SubデバイスのベンダーID、製品コード、エイリアスアドレスをシーケンス番号から取得する機能、そしてこれらの情報を用いてSubデバイス番号を逆順に問い合わせる機能が含まれます。これらの機能は、Subデバイスのタイプを識別し、適切なEtherCATSubデバイスクラスを選択して接続するために使用されます。
- getSlaveCount()
- getVendorID()
- getProductCode()
- getRevisionNumber()
- getSerialNumber()
- getAliasAddress()
- getSlaveNo()
2.1.4 制御関数
EtherCAT Mデバイスライブラリが提供する制御関数は、EtherCATネットワークの状態と動作を管理する上で非常に重要です。これらの関数を使用することで、ユーザーはネットワークを正確に制御し、MデバイスとSubデバイス間の信頼性の高い同期通信を実現できます。
- start()
- stop()
- update()
- setShiftTime()
- getShiftTime()
- getSystemTime()
- getWorkingCounter()
- getExpectedWorkingCounter()
2.2 EtherCATデバイス
EtherCAT デバイスパートは、PDO、CoE、FoE などの機能を操作できる汎用 EtherCAT Subデバイス クラスを提供し、CiA 402 Subデバイス 汎用クラスも含まれています。
EtherCAT デバイスパートとEtherCAT Mデバイスパートの主なクラス関係は関連であり、EtherCAT デバイスパートはEtherCAT Mデバイスパートに依存します。下図に示すように、_EthercatDevice_CommonDriverとEthercatMasterの間には関連関係があります。

- EthercatMasterと_EthercatDevice_CommonDriverの間には、 EthercatMasterに依存する_EthercatDevice_CommonDriverにより、関連性があります。
- 他のすべての EtherCAT Subデバイス クラスは、_EthercatDevice_CommonDriver から継承されます。
警告: このクラスを使用してオブジェクトを宣言することは禁止です。
2.2.1 _EthercatDevice_CommonDriver
_EthercatDevice_CommonDriver は、Subデバイス情報にアクセスするための機能だけでなく、PDO、SII、CoE、FoE、DC などのさまざまな EtherCAT 機能アクセス メソッドも提供する抽象クラスです。すべての EtherCAT Subデバイス クラスはこれを継承します。
_EthercatDevice_CommonDriverのクラス関係性を次の図に示します:

- EthercatMasterと_EthercatDevice_CommonDriverの間には、 EthercatMasterに依存する_EthercatDevice_CommonDriverにより、関連性があります。
- 他のすべての EtherCATSubDevice クラスは、_EthercatDevice_CommonDriver から継承されます。
警告: このクラスを使用してオブジェクトを宣言することは禁止です。
情報関数
このライブラリは、ネットワーク上のEtherCATSubデバイスに関する情報を取得するための関数を提供します。これには、デバイス識別に使用されるベンダーID、製品コード、エイリアスアドレス、デバイス名などの重要な詳細情報が含まれます。さらに、EtherCATSubデバイスがCoE、FoE、DCなどの特定の機能をサポートしているかどうかの情報も提供します。このSubデバイス情報により、ユーザーはネットワーク内のデバイスの特性と機能を理解し、対応する設定および制御タスクを実行することができます。
- getVendorID()
- getProductCode()
- getRevisionNumber()
- getSerialNumber()
- getAliasAddress()
- getSlaveNo()
- getDeviceName()
- getMailboxProtocol()
- getCoEDetails()
- getFoEDetails()
- getEoEDetails()
- getSoEChannels()
- isSupportDC()
分散クロック(DC)関数
Distributed Clocks(DC)は、EtherCATSubデバイスコントローラ(ESC)の重要な機能ユニットです。EtherCATネットワーク全体にわたる時刻同期メカニズムの実装を担い、すべてのSubデバイスが統一された時刻基準に従ってクロックを同期させることで、システム全体の時刻の一貫性を確保します。
システム同期のために、すべてのSubデバイスは1つのリファレンスクロックに同期されます。通常、同一セグメント内でMデバイスの後に位置する、分散クロック機能を備えた最初のESCがリファレンスクロック(システムタイム)を保持します。このシステムタイムは、他のデバイスおよびMデバイスのDCサブデバイスクロックを同期するためのリファレンスクロックとして使用されます。クロック同期では、伝播遅延、ローカルクロックソースのドリフト、およびローカルクロックオフセットが考慮されます
ESCは、ローカルアプリケーションをEtherCATシステム時間に同期させるためのSyncSignalを生成できます。SyncSignalは、直接 (たとえば、割り込みとして) 使用することも、デジタル出力の更新/デジタル入力のサンプリングに使用することもできます。さらに、LatchSignalに EtherCATシステム時間を基準としたタイム・スタンプを付けることができます。

The DC unit supports the generation of a base SyncSignal SYNC0 and a dependent SyncSignal SYNC1. The second SyncSignal (SYNC1) depends on SYNC0, it can be enerated with a predefined delay after SYNC0 pulses.
SYNC1サイクル時間が SYNC0サイクル時間よりも長い場合、次のように生成されます:
循環オペレーションの開始時間に達すると、SYNC0パルスが生成されます。SYNC1パルスは、SYNC0パルスから SYNC1サイクル時間の遅延後に生成されます。次のSYNC1パルスは、次の SYNC0パルスが生成され、そしてSYNC1サイクル時間が経過したときに生成されます。
次の図に、いくつかのコンフィギュレーション例を示します:

詳細な情報については、 ESC Hardware Data Sheet Section I.を参照してください。
プロセス・データ・オブジェクト(PDO)関数
プロセスデータとは、EtherCATネットワーク内のMデバイスとSubデバイス間で交換されるリアルタイム通信データを指します。このデータには、制御、監視、通信に使用される情報が含まれます。EtherCAT Mデバイスは、すべてのSubデバイスを制御および監視するためにプロセスデータを周期的に送信し、高い同期性と低遅延を実現します。
EtherCATSubデバイスコントローラ(ESC)内のフィールドバスメモリ管理ユニット(FMMU)は、デュアルポートメモリを論理アドレスにマッピングできます。すべてのSubデバイスノードは、EtherCAT Mデバイスから送信されたEtherCATフレームをチェックし、プロセスデータの論理アドレスとFMMUに設定されたアドレスを比較します。一致が見つかった場合、出力プロセスデータはデュアルポートメモリに転送され、入力プロセスデータはEtherCATフレームに挿入されます。
総体的に、プロセスデータは、EtherCATテクノロジの重要な部分であり、ロボット制御、CNC制御、オートメーション制御、その他の分野のリアルタイム・アプリケーションに適しています。
- pdoBitWrite()
- pdoBitRead()
- pdoGetOutputBuffer()
- pdoGetInputBuffer()
- pdoWrite()
- pdoWrite8()
- pdoWrite16()
- pdoWrite32()
- pdoWrite64()
- pdoRead()
- pdoRead8()
- pdoRead16()
- pdoRead32()
- pdoRead64()
CANopen over EtherCAT (CoE) 関数
CANopenは、コントローラ・エリア・ネットワーク (CAN) バスに基づく高度な通信プロトコルで、産業用アプリケーションの制御システムとデバイス間の通信に一般的に使用されます。 これにはデバイス間のデータ交換、構成、制御を容易にするために、一連の通信オブジェクト、データ型、およびネットワーク管理機能を定義します。
CANopenプロトコルには次の側面が含まれます:
- オブジェクト・ディクショナリ
デバイス間で交換されるすべてのデータ・オブジェクトと媒介変数を定義します。オブジェクト・ディクショナリには、変数、媒介変数、イベント、関数などの様々なタイプのオブジェクトが含まれます。 - PDO (プロセス・データ・オブジェクト)
リアルタイムのデータ転送に使用されます。 PDOを使用すると、デバイスは、固定された、またはイベント・トリガの方法で相互にデータを転送できるようになり、リアルタイム制御とデータ交換が可能になります。 - SDO (サービス・データ・オブジェクト)
デバイスの変数の設定と管理に使用されます。 SDOは、読み取り、書き込み、変数設定の機能を提供し、デバイスが設定情報を動的に交換できるようにします。

CoE (CAN application over EtherCAT )は、 EtherCATネットワークに基づくCANopenプロトコルです。これにより、 EtherCATネットワーク上でCANopenプロトコルを使用した通信が可能になります。オブジェクト・ディクショナリには、変数、アプリケーションデータ、およびプロセス・データ・インターフェイスとアプリケーションデータ間のマッピング情報 (PDOマッピング) が含まれます。そのエントリには、サービス・データ・オブジェクト (SDO) を介してアクセスできます。 SDOサービスは、主に2種類のコマンドで構成されています。SDOコマンドは、オブジェクトディクショナリに格納されているオブジェクトにアクセスするために使用され、SDO情報コマンドは、これらのオブジェクトの詳細を取得するために使用されます。
SDOコマンド
- sdoDownload()
- sdoDownload8()
- sdoDownload16()
- sdoDownload32()
- sdoDownload64()
- sdoUpload()
- sdoUpload8()
- sdoUpload16()
- sdoUpload32()
- sdoUpload64()
SDO情報コマンド
File over EtherCAT (FoE) 関数
File access over EtherCAT (FoE)は、EtherCATネットワークを介したファイル転送機能を可能にするEtherCATのプロトコル拡張です。ファームウェアやその他のファイルをEtherCATSubデバイスにダウンロードしたり、EtherCATSubデバイスからファームウェアやその他のファイルをアップロードしたりするための標準的な方法を規定しています。

SII EEPROM関数
下記の API はまだ開発中であり、使用は推奨されません。
EtherCATSubデバイスコントローラは、EtherCATSubデバイス情報(ESI)を保存するために、必須のNVRAM(通常はI²Cインターフェースを備えたシリアルEEPROM)を使用します。この情報には、ベンダーID、製品コード、メールボックス構成、FMMU、PDOなどが含まれます。ESCに応じて、1Kビットから最大4MビットまでのEEPROMサイズがサポートされます。
ESCコンフィギュレーション領域 (EEPROMワード・アドレス0~7) は、電源投入またはリセット後に ESCによって自動的に読み込まれます。PDIコンフィギュレーション、DC設定、およびコンフィギュレーションされたステーション・エイリアスが含まれます。 ESCコンフィギュレーション・データの一貫性は、チェックサムによって確保されます。詳細については、ESC Hardware Data Sheet Section I.を参照ください
2.2.2 EthercatDevice_Generic
EthercatDevice_Generic は、Subデバイス情報、PDO、CoE、FoE、DC などへのアクセスを含む、すべての EtherCAT Subデバイスを制御するために使用できる汎用 EtherCAT Subデバイス クラスです。
EthercatDevice_Genericのクラス関係を次の図に示します:

- 関係性 : EthercatDevice_Generic は、_EthercatDevice_CommonDriverから継承します。
- 基本クラス:_EthercatDevice_CommonDriver
初期化関数
EthercatDevice_Genericクラスの初期化に関連した関数。
2.2.3 EthercatDevice_CiA402
EthercatDevice_CiA402 は、CiA 402 標準をサポートするすべての EtherCAT サーボ ドライブを制御するように設計された汎用 CiA 402 EtherCAT Subデバイス クラスです。
一般的に使用される CiA 402 オブジェクトへのアクセス機能と、次のようないくつかの CiA 402 操作モードおよび機能グループの操作機能を提供します。
- Operation Modes
- Profile Position (pp)
- Profile Velocity (pv)
- Profile Torque (tq)
- Homing (hm)
- Cyclic Synchronous Position (csp)
- Cyclic Synchronous Velocity (csv)
- Cyclic Synchronous Torque (CST)
- Function Groups
- Touch Probe
CiA402 ドライブ プロファイルの実装指令。
EtherCAT ベースのサーボ ドライブ内で IEC 61800-7-201 を使用するための指令。
CiA 402 の詳細については、次のドキュメントを参照してください。
- CiA Draft Standard 402: CANopen device profile drives and motion control
- ETG.6010 Implementation Directive for CiA402 Drive Profile
- 現在使用されているCiA 402ドライブデバイスのユーザーマニュアル
EthercatDevice_CiA402 のクラス関係は次の図に示されています。

- EthercatDevice_CiA402 は _EthercatDevice_CommonDriver.
- 基本クラス:_EthercatDevice_CommonDriver
EthercatDevice_CiA402 クラスの詳細については、EtherCAT CiA402 API を参照してください。
2.3 QECシリーズ・デバイス
QEC シリーズ デバイス パートは、ICOP の QEC シリーズ Subデバイス専用の機能を提供し、ユーザーがよりフレンドリーで簡潔な方法でコーディングできるようにします。
QECシリーズ・デバイス部分とEtherCATデバイス部分の間の主なクラス関係は関連付けされており、QECシリーズ・デバイス部分はEtherCATデバイス部分に依存しています。以下の図に示すように、_ EthercatDevice_DmpCommonDriverと_ EthercatDevice_CommonDriver間に関連した関係があります。

クラス:
- _EthercatDevice_DmpCommonDriveから継承します。
- EthercatDevice_DmpDIQ_Generic
- EthercatDevice_DmpAIQ_Generic
- EthercatDevice_DmpHID_Generic
- EthercatDevice_DmpLCD_Generic
- EthercatDevice_DmpEM_Generic
- EthercatDevice_DmpStepper_Generic
2.3.1 _EthercatDevice_DmpCommonDriver
_EthercatDevice_DmpCommonDriver は、ICOP が開発した EtherCAT サブデバイス固有の機能への専用アクセス関数を提供する抽象クラスです。これらの機能には、システム監視(温度、電圧、電流)、注文情報、MTBF などが含まれます。
_EthercatDevice_DmpCommonDriverのクラス関係を次の図に示します:

- _EthercatDevice_DmpCommonDriverは _EthercatDevice_CommonDriver から継承します。
警告: このクラスを使用してオブジェクトを宣言することは禁止です。
システム監視関数
QECシリーズMCU搭載EtherCATSubデバイスはすべて、システム温度、システム電圧、システム電流、周辺電圧、周辺電流などのシステム監視情報を取得するためのCoEオブジェクトを提供しています。そのため、このライブラリはシステム監視情報を取得するための関数を提供し、ユーザーはシステムを迅速に監視し、障害の兆候を評価できます。
- getSystemTemperature()
- getSystemPowerVoltage()
- getSystemPowerCurrent()
- getPeripheralPowerVoltage()
- getPeripheralPowerCurrent()
- tryToGetSystemTemperature()
- tryToGetSystemPowerVoltage()
- tryToGetSystemPowerCurrent()
- tryToGetPeripheralPowerVoltage()
- tryToGetPeripheralPowerCurrent()
MTBF関数
MTBF は、平均故障間隔 (Mean Time Between Failures) の略です。これは、システムまたはコンポーネントの故障間隔の平均時間を測定する信頼性の指標です。これは、動作時間の合計をその時間内に発生した故障の数で割ることによって計算されます。その結果は、システムまたはコンポーネントの予想耐用年数を見積もるために使用できる平均値です。MTBFは、システムおよびコンポーネントの信頼性を追跡し、潜在的な設計上の欠陥や製造上の欠陥を特定するために役立つ指標です。また、予防保守スケジュールを決定するためにも使用できます。
QECシリーズMCU搭載EtherCATSubデバイスはすべて、MTBF関連情報を取得するためのCoEオブジェクトを提供しています。そのため、このライブラリはこれらのMTBF関連情報を取得するための関数を提供し、ユーザーまたはメーカーがこれらの情報を提供することで、デバイスの寿命や故障を評価・判断できるようにします
注文情報関数
QECシリーズのMCU搭載EtherCATSubデバイスはすべて、出荷前にデバイスに書き込まれる顧客注文関連情報を取得するためのCoEオブジェクトを提供しています。そのため、このライブラリは顧客注文情報を取得するための関数を提供し、必要に応じて問い合わせを容易にします。
2.3.2 EthercatDevice_DmpDIQ_Generic
EthercatDevice_DmpDIQ_Genericは、ICOPがデジタルI/O EtherCATSubデバイスモジュール向けに特別に開発したEtherCATSubデバイスクラスです。デジタル入力、デジタル出力、その他の機能のためのAPIを提供します。
2.3.3 EthercatDevice_DmpAIQ_Generic
EthercatDevice_DmpAIQ_Genericは、ICOPがアナログI/O EtherCATSubデバイスモジュール向けに特別に開発したEtherCATSubデバイスクラスです。アナログ入力、アナログ出力、その他の機能のためのAPIを提供します。
2.3.4 EthercatDevice_DmpHID_Generic
EthercatDevice_DmpHID_Genericは、ICOPがQEC EtherCAT Subデバイス HIDモジュール向けに特別に開発したEtherCAT Subデバイスクラスです。RS232/RS485、4×4キーパッド、16×2 LCM、手動パルスジェネレータ(MPG)、ブザー機能を備えています。
2.3.5 EthercatDevice_DmpLCD_Generic
EthercatDevice_DmpLCD_Genericは、ICOPがLCD EtherCATSubデバイスモジュール向けに特別に開発したEtherCATSubデバイスクラスです。様々な描画APIを提供します。
2.3.6 EthercatDevice_DmpStepper_Generic
EthercatDevice_DmpStepper_Genericは、DM&Pグループの3軸ステッピングモーターコントローラーEtherCAT Subデバイスモジュール用に開発されたEtherCAT Subデバイスクラスです。このモジュールは、モータードライバー、エンコーダ入力、その他のCNC関連機能を備えています。モーター制御セクションでは、CiA 402モードだけでなく、3軸同期Gコードモードもサポートしています。
3. 例
3.1 Subデバイス情報例
Subデバイス情報例
3.1.1 例 1: EthercatMaster クラス
EthercatMaster クラスを使用してSubデバイス情報を表示します。
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
void setup() {
Serial.begin(115200);
while (!Serial);
master.begin(); // Initialize EtherCAT Master in Pre-OP state
Serial.println("Starting EtherCAT Master...");
// Print Out All Slave Information
for (int i = 0; i < master.getSlaveCount(); i++) {
Serial.print("Slave ");
Serial.print(i);
Serial.print(" VID: ");
Serial.print(master.getVendorID(i), HEX);
Serial.print(", PID: ");
Serial.print(master.getProductCode(i), HEX);
Serial.print(", Rev: ");
Serial.print(master.getRevisionNumber(i), HEX);
Serial.print(", Ser: ");
Serial.print(master.getSerialNumber(i), HEX);
Serial.print(", Alias: ");
Serial.print(master.getAliasAddress(i));
Serial.println();
}
}
void loop() {
// put your main code here, to run repeatedly:
}3.1.2 例 2: EthercatDevice_Generic クラス
EthercatDevice_Generic クラスを使用してSubデバイス情報を表示します。
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic slave;
char name[256];
void setup() {
Serial.begin(115200);
while (!Serial);
master.begin(); // Initialize EtherCAT Master in Pre-Operational state
for (int i = 0; i < master.getSlaveCount(); i++) {
slave.attach(i, master); // Attach the slave to the master
Serial.print("Slave ");
Serial.println(i);
Serial.print(" Name: ");
Serial.println(slave.getDeviceName(name, 256));
Serial.print(" Vendor ID: 0x");
Serial.println(slave.getVendorID(), HEX);
Serial.print(" Product Code: 0x");
Serial.println(slave.getProductCode(), HEX);
Serial.print(" Revision Number: 0x");
Serial.println(slave.getRevisionNumber(), HEX);
Serial.print(" Serial Number: 0x");
Serial.println(slave.getSerialNumber(), HEX);
Serial.print(" Alias Address: ");
Serial.println(slave.getAliasAddress());
Serial.print(" Mailbox Protocol: 0x");
Serial.println(slave.getMailboxProtocol(), HEX);
Serial.print(" CoE Details: 0x");
Serial.println(slave.getCoEDetails(), HEX);
Serial.print(" FoE Details: 0x");
Serial.println(slave.getFoEDetails(), HEX);
Serial.print(" EoE Details: 0x");
Serial.println(slave.getEoEDetails(), HEX);
Serial.print(" SoE Channels: ");
Serial.println(slave.getSoEChannels());
Serial.print(" DC Supported: ");
Serial.println(slave.isSupportDC());
}
}
void loop() {
// put your main code here, to run repeatedly:
}3.1.3 例 3: EthercatDevice_CiA402 クラス
EthercatDevice_CiA402 クラスを使用してSubデバイス情報を表示します
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_CiA402 slave;
char name[256];
void setup() {
Serial.begin(115200);
while (!Serial);
master.begin(); // Initialize EtherCAT Master in Pre-Operational state
for (int i = 0; i < master.getSlaveCount(); i++) {
// Attach the slave to the master
if (slave.attach(i, master) < 0) {
continue; // Skip this slave if attachment fails
}
Serial.print("Slave ");
Serial.println(i);
Serial.print(" Name: ");
Serial.println(slave.getDeviceName(name, 256));
Serial.print(" Vendor ID: 0x");
Serial.println(slave.getVendorID(), HEX);
Serial.print(" Product Code: 0x");
Serial.println(slave.getProductCode(), HEX);
Serial.print(" Revision Number: 0x");
Serial.println(slave.getRevisionNumber(), HEX);
Serial.print(" Serial Number: 0x");
Serial.println(slave.getSerialNumber(), HEX);
Serial.print(" Alias Address: ");
Serial.println(slave.getAliasAddress());
Serial.print(" Mailbox Protocol: 0x");
Serial.println(slave.getMailboxProtocol(), HEX);
Serial.print(" CoE Details: 0x");
Serial.println(slave.getCoEDetails(), HEX);
Serial.print(" FoE Details: 0x");
Serial.println(slave.getFoEDetails(), HEX);
Serial.print(" EoE Details: 0x");
Serial.println(slave.getEoEDetails(), HEX);
Serial.print(" SoE Channels: ");
Serial.println(slave.getSoEChannels());
Serial.print(" DC Supported: ");
Serial.println(slave.isSupportDC());
}
}
void loop() {
// put your main code here, to run repeatedly:
}3.2 SDO アップロード/ダウンロード 例
SDO アップロード/ダウンロード 例
3.2.1 例 1: sdoUpload8()を使ったSDO アップロード
sdoUpload16()、sdoUpload32()、sdoUpload64() の使用方法は、戻り値の型の違いを除いて、sdoUpload8() と同様です
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
Serial.begin(115200);
master.begin();
device.attach(0, master);
Serial.print("1C12h.0 => ");
Serial.println(device.sdoUpload8(0x1C12, 0x00));
Serial.print("1C13h.0 => ");
Serial.println(device.sdoUpload8(0x1C13, 0x00));
// ...
}
void loop() {
// put your main code here, to run repeatedly:
}3.2.2 例e 2: sdoUpload()を使ったSDO アップロード
sdoUpload()を使ったSDO アップロード
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
Serial.begin(115200);
uint8_t value;
master.begin();
device.attach(0, master);
if (device.sdoUpload(0x1C12, 0x00, &value, sizeof(value)) >= 0) {
Serial.print("1C12h.0 => ");
Serial.println(value);
}
if (device.sdoUpload(0x1C13, 0x00, &value, sizeof(value)) >= 0) {
Serial.print("1C13h.0 => ");
Serial.println(value);
}
//...
}
void loop() {
// put your main code here, to run repeatedly:
}3.2.3 例 3: Abortコード付きsdoUpload()を使ったSDO アップロード
Abortード付きのsdoUpload()を使用したSDOアップロード。
存在しないオブジェクトから値を読み取るSDOアップロードコマンドを開始し、abortコード0x06020000が返されます。中止コードの詳細については、「SDO Abort Code」を参照してください。
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
Serial.begin(115200);
uint32_t abortcode;
uint8_t value;
master.begin();
device.attach(0, master);
if (device.sdoUpload(0xFFFF, 0xFF, &value, sizeof(value), &abortcode) == ECAT_ERR_DEVICE_COE_ERROR) {
Serial.print("Abort Code: 0x");
Serial.println(abortcode, HEX);
}
//...
}
void loop() {
// put your main code here, to run repeatedly:
}3.2.4 例 4: sdoDownload8()を使ったSDO ダウンロード
sdoDownload8() を使用した SDO ダウンロード。sdoDownload16()、sdoDownload32()、および sdoDownload64() の使用方法は、入力パラメータ タイプの違いを除いて、sdoDownload8() と同様です。
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
master.begin();
device.attach(0, master);
device.sdoDownload8(0x1C12, 0x00, 0);
device.sdoDownload8(0x1C13, 0x00, 0);
//...
}
void loop() {
// put your main code here, to run repeatedly:
}3.2.5 例 5: sdoDownload()を使ったSDO ダウンロード
sdoDownload() を使った SDOダウンロード
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
uint8_t value;
master.begin();
device.attach(0, master);
value = 0;
device.sdoDownload(0x1C12, 0x00, &value, sizeof(value));
value = 0;
device.sdoDownload(0x1C13, 0x00, &value, sizeof(value));
//...
}
void loop() {
// put your main code here, to run repeatedly:
}3.2.6 例 6: abortコード付きsdoDownload()を使ったSDO ダウンロード
abortコード付きsdoDownload() を使ったSDO ダウンロード
存在しないオブジェクトに値を書き込むために SDO ダウンロード コマンドを開始し、中止コード 0x06020000 が返されることを期待しています。中止コードの詳細については、SDO Abort Codeを参照してください。
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
Serial.begin(115200);
uint32_t abortcode;
uint8_t value = 0x01;
master.begin();
device.attach(0, master);
if (device.sdoDownload(0xFFFF, 0xFF, &value, sizeof(value), &abortcode) == ECAT_ERR_DEVICE_COE_ERROR) {
char buf[20];
sprintf(buf, "Abort Code: 0x%08lX", abortcode);
Serial.println(buf);
}
//...
}
void loop() {
// put your main code here, to run repeatedly:
}3.2.7 例 7: PDO マッピング構成の出力
PDO マッピング構成の出力
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
Serial.begin(115200);
uint8_t assign_nr, mapping_nr;
uint16_t mapping;
uint32_t entry;
master.begin();
device.attach(0, master);
// RxPDO Mapping List
assign_nr = device.sdoUpload8(0x1C12, 0x00);
for (int m = 0; m < assign_nr; m++) {
mapping = device.sdoUpload16(0x1C12, m + 1);
Serial.print(" RxPDO");
Serial.print(m + 1);
Serial.print(" (");
Serial.print(mapping, HEX);
Serial.println("h)");
mapping_nr = device.sdoUpload8(mapping, 0x00);
for (int n = 0; n < mapping_nr; n++) {
entry = device.sdoUpload32(mapping, n + 1);
Serial.print(" ");
char entryBuf[11]; // "XXXXXXXXh" + null
sprintf(entryBuf, "%08lXh", entry);
Serial.println(entryBuf);
}
}
// TxPDO Mapping List
assign_nr = device.sdoUpload8(0x1C13, 0x00);
for (int m = 0; m < assign_nr; m++) {
mapping = device.sdoUpload16(0x1C13, m + 1);
Serial.print(" TxPDO");
Serial.print(m + 1);
Serial.print(" (");
Serial.print(mapping, HEX);
Serial.println("h)");
mapping_nr = device.sdoUpload8(mapping, 0x00);
for (int n = 0; n < mapping_nr; n++) {
entry = device.sdoUpload32(mapping, n + 1);
Serial.print(" ");
char entryBuf[11];
sprintf(entryBuf, "%08lXh", entry);
Serial.println(entryBuf);
}
}
//...
}
void loop() {
// put your main code here, to run repeatedly:
}3.2.8 例 8: PDO マッピング設定
PDO マッピング設定
PDO マッピングをサポートする CiA 402 デバイス内の PDO に次のオブジェクトをマップします。
- Output PDO (RxPDO)
- Object 6040h: 制御ワード
- Object 607Ah: 目標位置
- Object 60FFh: 目標速度
- Object 6071h: 目標トルク
- Object 6060h: 動作モード
- Input PDO (TxPDO)
- Object 6041h: ステータスワード
- Object 6064h: 位置の実際の値
- Object 606Ch: 速度の実際の値
- Object 6077h: トルク実効値
- Object 6061h: 操作モードの表示
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
master.begin();
device.attach(0, master);
// 1C12
device.sdoDownload8(0x1C12, 0x00, 0);
device.sdoDownload8(0x1601, 0x00, 0);
device.sdoDownload32(0x1601, 0x01, 0x60400010);
device.sdoDownload32(0x1601, 0x02, 0x607A0020);
device.sdoDownload32(0x1601, 0x03, 0x60FF0020);
device.sdoDownload32(0x1601, 0x04, 0x60710010);
device.sdoDownload32(0x1601, 0x05, 0x60600008);
device.sdoDownload8(0x1601, 0x00, 5);
device.sdoDownload16(0x1C12, 0x1601, 1);
device.sdoDownload8(0x1C12, 0x00, 1);
// 1C13
device.sdoDownload8(0x1C13, 0x00, 0);
device.sdoDownload8(0x1A01, 0x00, 0);
device.sdoDownload32(0x1A01, 0x01, 0x60410010);
device.sdoDownload32(0x1A01, 0x02, 0x60640020);
device.sdoDownload32(0x1A01, 0x03, 0x606C0020);
device.sdoDownload32(0x1A01, 0x04, 0x60770010);
device.sdoDownload32(0x1A01, 0x05, 0x60610008);
device.sdoDownload8(0x1A01, 0x00, 5);
device.sdoDownload16(0x1C13, 0x1A01, 1);
device.sdoDownload8(0x1C13, 0x00, 1);
//...
}
void loop() {
// put your main code here, to run repeatedly:
}3.3 PDO リード/ライト 例
PDO リード/ライト 例
3.3.1 例 1: pdoBitRead()を使ったPDOからの1ビット読み取り
pdoBitRead() を使用して、入力PDOから1ビットを読み取ります。
16チャンネルのデジタル入力EtherCATSubデバイスには2バイトの入力PDOがあり、各ビットは1つのデジタル入力チャンネルに対応しています。チャンネル0と9の状態は1Hzの周期で出力されます。

サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
Serial.begin(115200);
master.begin();
device.attach(0, master);
master.start();
}
void loop() {
// Read and display the state of PDO bits
Serial.print("Bit0 => ");
Serial.print(device.pdoBitRead(0)); // Read PDO bit 0
Serial.print(", Bit9 => ");
Serial.println(device.pdoBitRead(9)); // Read PDO bit 9
delay(1000);
}3.3.2 例2: pdoRead8()を使って入力PDOから1バイトデータを読み取る
pdoRead8() を使用して入力 PDO からデータを読み取ります。
例 1 と同じです。
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
Serial.begin(115200);
master.begin();
device.attach(0, master);
master.start();
}
void loop() {
// Read specific bits using pdoRead8 and print their values
Serial.print("Bit0 => ");
Serial.print((device.pdoRead8(0) >> 0) & 1);
Serial.print(", Bit9 => ");
Serial.println((device.pdoRead8(1) >> 1) & 1);
delay(1000);
}3.3.3 例3: pdoRead()を使って入力PDOからデータを読み取る
pdoRead() を使って入力 PDO からデータを読み取ります。
例 1 と同じです。
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
uint16_t value;
void setup() {
Serial.begin(115200);
master.begin();
device.attach(0, master);
master.start();
}
void loop() {
device.pdoRead(0, &value, sizeof(value));
Serial.print("Bit0 => ");
Serial.print((value >> 0) & 1);
Serial.print(", Bit9 => ");
Serial.println((value >> 9) & 1);
delay(1000);
}3.3.4 例4: pdoBitWrite()を使って出力PDOにビットデータを書き込む
pdoBitWrite() を使って、出力PDOにビットを書き込みます。
16チャンネルのデジタル出力EtherCATサブデバイスには2バイトの出力PDOがあり、各ビットは1つのデジタル出力チャンネルに対応しています。チャンネル0と9は1Hzの周波数でトグルされます。

サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
master.begin();
device.attach(0, master);
master.start();
}
void loop() {
device.pdoBitWrite(0, 1);
device.pdoBitWrite(9, 1);
delay(1000);
device.pdoBitWrite(0, 0);
device.pdoBitWrite(9, 0);
delay(1000);
}3.3.5 例5: pdoWrite8()を使って出力PDOにバイトデータを書き込む
pdoWrite8() を使って出力 PDO にデータを書き込みます。
例 4 と同じです。
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
void setup() {
master.begin();
device.attach(0, master);
master.start();
}
void loop() {
device.pdoWrite8(0, 0x01);
device.pdoWrite8(1, 0x02);
delay(1000);
device.pdoWrite8(0, 0x00);
device.pdoWrite8(1, 0x00);
delay(1000);
}3.3.6 例6: pdoWrite()を使って出力PDOにデータを書き込む
pdoWrite() を使って出力 PDO にデータを書き込みます。
例 4 と同じです。
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
uint16_t value;
void setup() {
master.begin();
device.attach(0, master);
master.start();
}
void loop() {
value = 0x0201;
device.pdoWrite(0, &value, sizeof(value));
delay(1000);
value = 0x0000;
device.pdoWrite(0, &value, sizeof(value));
delay(1000);
}3.4 Callback 例
Callback 例
3.4.1 例 1: Cyclic callback
16チャンネルのデジタル出力EtherCATSubデバイスには2バイトの出力PDOがあり、各ビットは1つのデジタル出力チャンネルに対応しています。チャンネル0と9は1Hzの周波数でトグルされます。

サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
int toggle = 0;
int cycle_count = 0;
void MyCyclicCallback()
{
if (++cycle_count < 1000)
return;
cycle_count = 0;
toggle = !toggle;
device.pdoBitWrite(0, toggle);
device.pdoBitWrite(9, toggle);
}
void setup() {
Serial.begin(115200);
master.begin();
device.attach(0, master);
master.attachCyclicCallback(MyCyclicCallback);
master.start(1000000); // 1ms cycle
}
void loop() {
// put your main code here, to run repeatedly:
}3.4.2 例 2: Cyclic コールバック(FPU有効)
Cyclic コールバック(FPU有効)
コールバック関数が浮動小数点演算を必要とする場合は、FPU対応のコールバック関数を使用してください。詳細については、以下の関数の説明を参照してください。
attachCyclicCallback()attachErrorCallback()attachEventCallback()
サンプルコードは次のとおりです:
#include "Ethercat.h"
#define GRAVITY (9.80665)
EthercatMaster master;
EthercatDevice_Generic device;
int toggle = 0;
int cycle_count = 0;
double S = 0.0, T = 0.0;
double s = 0.0, t = 0.0;
void MyCyclicCallback()
{
S = (GRAVITY * T * T) / 2.0;
T += 0.001;
if (++cycle_count < 1000)
return;
cycle_count = 0;
toggle = !toggle;
device.pdoBitWrite(0, toggle);
device.pdoBitWrite(9, toggle);
}
void setup() {
Serial.begin(115200);
master.begin();
device.attach(0, master);
master.attachCyclicCallback(MyCyclicCallback, true);
master.start(1000000);
}
void loop() {
s = (GRAVITY * t * t) / 2.0;
t += 1.0;
Serial.print("S = ");
Serial.println(s, 6);
delay(1000);
}3.4.3 例 3: Error コールバック
各タイプのエラーの数を 1 秒ごとに出力します。
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
// Error counters
int wkc_single_fault_cnt = 0;
int wkc_multiple_faults_cnt = 0;
int single_lost_frame_cnt = 0;
int multiple_lost_frames_cnt = 0;
int cable_broken_cnt = 0;
int wait_ack_timeout_cnt = 0;
// Error callback function
void myErroCallback(uint32_t errorcode) {
switch (errorcode) {
case ECAT_ERR_WKC_SINGLE_FAULT:
wkc_single_fault_cnt++;
break;
case ECAT_ERR_WKC_MULTIPLE_FAULTS:
wkc_multiple_faults_cnt++;
break;
case ECAT_ERR_SINGLE_LOST_FRAME:
single_lost_frame_cnt++;
break;
case ECAT_ERR_MULTIPLE_LOST_FRAMES:
multiple_lost_frames_cnt++;
break;
case ECAT_ERR_CABLE_BROKEN:
cable_broken_cnt++;
break;
case ECAT_ERR_WAIT_ACK_TIMEOUT:
wait_ack_timeout_cnt++;
break;
}
}
void setup() {
Serial.begin(115200);
master.attachErrorCallback(myErroCallback);
master.begin();
master.start();
}
void loop() {
Serial.print("ECAT_ERR_WKC_SINGLE_FAULT = ");
Serial.println(wkc_single_fault_cnt);
Serial.print("ECAT_ERR_WKC_MULTIPLE_FAULTS = ");
Serial.println(wkc_multiple_faults_cnt);
Serial.print("ECAT_ERR_SINGLE_LOST_FRAME = ");
Serial.println(single_lost_frame_cnt);
Serial.print("ECAT_ERR_MULTIPLE_LOST_FRAMES = ");
Serial.println(multiple_lost_frames_cnt);
Serial.print("ECAT_ERR_CABLE_BROKEN = ");
Serial.println(cable_broken_cnt);
Serial.print("ECAT_ERR_WAIT_ACK_TIMEOUT = ");
Serial.println(wait_ack_timeout_cnt);
delay(1000);
}3.4.4 例4: Event コールバック
各タイプのエラーの数を 1 秒ごとに出力します。
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
// Event counters
int state_changed_cnt = 0;
int cable_reconnected_cnt = 0;
// Event callback function
void myEventCallback(uint32_t eventcode) {
switch (eventcode) {
case ECAT_EVT_STATE_CHANGED:
state_changed_cnt++;
break;
case ECAT_EVT_CABLE_RECONNECTED:
cable_reconnected_cnt++;
break;
}
}
void setup() {
Serial.begin(115200);
master.attachEventCallback(myEventCallback);
master.begin();
master.start();
}
void loop() {
Serial.print("ECAT_EVT_STATE_CHANGED = ");
Serial.println(state_changed_cnt);
Serial.print("ECAT_EVT_CABLE_RECONNECTED = ");
Serial.println(cable_reconnected_cnt);
delay(1000);
}3.5 DC 例
DC 例
3.5.1 Example 1: Enable DC synchronization
DC同期を有効にする
EthercatDevice_Genericクラスを使用して、CiA 402 EtherCATSubデバイスの位置制御を実装します。CiA 402の制御モードは周期同期位置モードに設定され、正確なタイミングを実現するためにDC同期が有効になっています。
デフォルトの PDO マッピングは次のとおりです。
- Output PDO (RxPDO)
| Byte 0 | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 |
| Controlword | Target Position | ||||
- Input PDO (TxPDO)
| Byte 0 | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 |
| Statusword | Position Actual Value | ||||
サンプルコードは次のとおりです:
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_Generic device;
uint32_t position = 0;
// Cyclic callback function, executed every 1ms
void MyCyclicCallback() {
// Check if the device is in "Operation Enable" state (0x27)
if ((device.pdoRead8(0) & 0x6F) != 0x27)
return;
// Increment target position by 1000 and write it to PDO
device.pdoWrite32(2, position += 1000);
}
void setup() {
Serial.begin(115200);
while (!Serial); // Wait for Serial to be ready
master.begin();
device.attach(0, master); // Attach slave device (slave ID 0)
device.setDc(1000000); // Enable Distributed Clock (1ms cycle)
device.sdoDownload8(0x6060, 0x00, 8); // Set mode of operation to CSP (mode 8)
// Register the cyclic callback function
master.attachCyclicCallback(MyCyclicCallback);
master.start(1000000, ECAT_SYNC); // Start EtherCAT master with 1ms sync cycle
// Read current position and set as initial target position
position = device.pdoRead32(2);
device.pdoWrite32(2, position);
// Transition through CiA 402 state machine to reach "Operation Enable"
device.pdoWrite8(0, 0x80); // Shutdown
delay(1000);
device.pdoWrite8(0, 0x06); // Switch On
delay(1000);
device.pdoWrite8(0, 0x07); // Enable Voltage
delay(1000);
device.pdoWrite8(0, 0x0F); // Operation Enable
delay(1000);
}
void loop() {
// put your main code here, to run repeatedly:
}3.6 QEC Subデバイス: デジタル入出力
#include "Ethercat.h"
EthercatMaster master;
EthercatDevice_QECR00DF0H slave;
void setup() {
Serial.begin(115200);
master.begin();
slave.attach(0, master);
master.start();
}
void loop() {
Serial.println(slave.digitalReadAll());
delay(4000);
}3.7 QEC Subデバイス: HID
#include "Ethercat.h" // Include the EtherCAT Library
EthercatMaster EcatMaster; // Create an EtherCAT Master Object
EthercatDevice_QECR11HU9S Slave1; // Create an EtherCAT Slave Object for QEC R11HU9S
int incomingByte = 0; // Variable for incoming serial data
char read_ch; // Variable for read serial data (char)
void setup() {
Serial.begin(115200); // Initialize serial communication at 115200 baud rate
// Initialize the EtherCAT Master. If successful, all slaves enter PRE OPERATIONAL state
EcatMaster.begin();
// Attach QECR11HU9S slave device to the EtherCAT Master at position 0
Slave1.attach(0, EcatMaster);
// Start the EtherCAT Master. If successful, all slaves enter OPERATIONAL state
// FreenRun Mode, and the parameter 1000000 sets the cycle time in nanoseconds
EcatMaster.start(1000000, ECAT_FREERUN);
// Configure UART settings for two COM ports of the slave device
Slave1.uartSetBaud(COM1, 115200); // Set baud rate for COM1
Slave1.uartSetFormat(COM1, SERIAL_8N1); // Set data format for COM1
Slave1.uartSetBaud(COM2, 115200); // Set baud rate for COM2
Slave1.uartSetFormat(COM2, SERIAL_8N1); // Set data format for COM2
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// Send the byte via UART COM1 of the slave device
Slave1.uartWrite(COM1, incomingByte);
while (Slave1.uartQueryRxQueue(COM2) <1) Slave1.update();// Because the function is non-blocking, so we need to call update(); by ourselves
// Read the received character from slave's UART COM2
if((read_ch = (char)Slave1.uartRead(COM2)) > 0) {
// Print the received data to the serial monitor
Serial.print("COM2 receive: ");
Serial.println(read_ch);
}
}
}3.8 QEC Subデバイス: ステッピングモータコントローラ
#include "Ethercat.h" // Include the EtherCAT Library
EthercatMaster EcatMaster; // Create an EtherCAT Master Object
EthercatDevice_QECR11MP3S Slave1; // Create an EtherCAT Slave Objects for QECR11MP3S
// Callback function for cyclic updates
void myCallback() {
Slave1.update(); // Update the Ethercat slave
}
void setup() {
Serial.begin(115200);
// Initialize the EtherCAT Master. If successful, all slaves enter PRE OPERATIONAL state
EcatMaster.begin();
// Attach the QECR11MP3S to the EtherCAT Master at position 0
Slave1.attach(0, EcatMaster);
// Set a cyclic callback for the Ethercat Master
EcatMaster.attachCyclicCallback(myCallback);
// Start the EtherCAT Master. If successful, all slaves enter OPERATIONAL state
// Sync Mode, and the parameter 1000000 sets the cycle time in nanoseconds
EcatMaster.start(1000000, ECAT_SYNC);
// Enable motor (G-code) to prepare the device for movement commands
Slave1.machineServoOn();
}
void loop() {
// Move to position X=100 at speed F=1000. This command moves the machine axis to position 100
// at a feed rate of 1000. The operation will take some time to complete.
Slave1.machineGcode("G1 X100 F1000");
delay(6000); // Wait for the command to be processed
// Move back to position X=0 at speed F=10000. This command returns the machine axis to the starting position
// at a faster feed rate of 10000. This operation is quicker due to the higher feed rate.
Slave1.machineGcode("G1 X0 F10000");
delay(1000); // Wait for the command to be processed
}付録
A.1 エラーリスト
ほとんどの関数では、返される値が0未満の場合、エラーであることを示し、その値はエラー・コードを表します。エラー・コードがある場合は、エラーの原因と修正処置を下記で確認できます。
| 定義 | コード |
ECAT_SUCCESS | 0 |
ECAT_ERR_MODULE_INIT_FAIL | -100 |
ECAT_ERR_MODULE_GET_VERSION_FAIL | -101 |
ECAT_ERR_MODULE_VERSION_MISMATCH | -102 |
ECAT_ERR_MODULE_GENERIC_TRANSFER_INIT_FAIL | -103 |
ECAT_ERR_MASTER_DOWNLOAD_SETTINGS_FAIL | -200 |
ECAT_ERR_MASTER_SET_DEVICE_SETTINGS_FAIL | -201 |
ECAT_ERR_MASTER_GET_GROUP_INFO_FAIL | -202 |
ECAT_ERR_MASTER_GET_MASTER_INFO_FAIL | -203 |
ECAT_ERR_MASTER_GET_DEVICE_INFO_FAIL | -204 |
ECAT_ERR_MASTER_SET_GROUP_SETTINGS_FAIL | -205 |
ECAT_ERR_MASTER_MAPPING_INIT_FAIL | -206 |
ECAT_ERR_MASTER_INTERRUPT_INIT_FAIL | -207 |
ECAT_ERR_MASTER_ACTIVE_FAIL | -208 |
ECAT_ERR_MASTER_ENI_INITCMDS_FAIL | -209 |
ECAT_ERR_MASTER_NO_DEVICE | -210 |
ECAT_ERR_MASTER_ACYCLIC_INIT_FAIL | -300 |
ECAT_ERR_MASTER_ACYCLIC_REQUEST_FAIL | -301 |
ECAT_ERR_MASTER_ACYCLIC_BUSY | -302 |
ECAT_ERR_MASTER_ACYCLIC_TIMEOUT | -303 |
ECAT_ERR_MASTER_ACYCLIC_ERROR | -304 |
ECAT_ERR_MASTER_ACYCLIC_WRONG_STATUS | -405 |
ECAT_ERR_MASTER_GENERIC_SEND_FAIL | -400 |
ECAT_ERR_MASTER_GENERIC_RECV_FAIL | -401 |
ECAT_ERR_MASTER_NOT_BEGIN | -1000 |
ECAT_ERR_MASTER_WRONG_BUFFER_SIZE | -1001 |
ECAT_ERR_MASTER_REDUNDANCY_NO_DC | -1002 |
ECAT_ERR_MASTER_MEMORY_ALLOCATION_FAIL | -1003 |
ECAT_ERR_MASTER_OSLAYER_INIT_FAIL | -1004 |
ECAT_ERR_MASTER_NIC_INIT_FAIL | -1005 |
ECAT_ERR_MASTER_BASE_INIT_FAIL | -1006 |
ECAT_ERR_MASTER_CIA402_INIT_FAIL | -1007 |
ECAT_ERR_MASTER_SETUP_PDO_FAIL | -1008 |
ECAT_ERR_MASTER_SCAN_NETWORK_FAIL | -1009 |
ECAT_ERR_MASTER_START_MASTER_FAIL | -1010 |
ECAT_ERR_MASTER_CYCLETIME_TOO_SMALL | -1011 |
ECAT_ERR_MASTER_DUMP_OUTPUT_PDO_FAIL | -1012 |
ECAT_ERR_MASTER_CONFIG_DEVICE_FAIL | -1013 |
ECAT_ERR_MASTER_CONFIG_MAPPING_FAIL | -1014 |
ECAT_ERR_MASTER_WAIT_BUS_SYNC_TIMEOUT | -1015 |
ECAT_ERR_MASTER_WAIT_MASTER_SYNC_TIMEOUT | -1016 |
ECAT_ERR_MASTER_CYCLIC_START_FAIL | -1017 |
ECAT_ERR_MASTER_WRONG_BUFFER_POINTER | -1018 |
ECAT_ERR_MASTER_ENI_INIT_FAIL | -1050 |
ECAT_ERR_MASTER_ENI_MISMATCH | -1051 |
ECAT_ERR_MASTER_STOPPED | -1100 |
ECAT_ERR_MASTER_STARTED | -1101 |
ECAT_ERR_MASTER_NOT_IN_PREOP | -1102 |
ECAT_ERR_MASTER_NOT_IN_SAFEOP | -1103 |
ECAT_ERR_MASTER_NOT_IN_OP | -1104 |
ECAT_ERR_MASTER_II_TRANSITION_FAIL | -1200 |
ECAT_ERR_MASTER_IP_TRANSITION_FAIL | -1201 |
ECAT_ERR_MASTER_PS_TRANSITION_FAIL | -1202 |
ECAT_ERR_MASTER_SO_TRANSITION_FAIL | -1203 |
ECAT_ERR_DEVICE_NOT_EXIST | -2000 |
ECAT_ERR_DEVICE_NOT_ATTACH | -2001 |
ECAT_ERR_DEVICE_NO_MAILBOX | -2002 |
ECAT_ERR_DEVICE_NO_DC | -2003 |
ECAT_ERR_DEVICE_WRONG_INPUT | -2004 |
ECAT_ERR_DEVICE_MEMORY_ALLOCATION_FAIL | -2005 |
ECAT_ERR_DEVICE_VENDOR_ID_MISMATCH | -2006 |
ECAT_ERR_DEVICE_PRODUCT_CODE_MISMATCH | -2007 |
ECAT_ERR_DEVICE_NO_SUCH_FUNCTION | -2008 |
ECAT_ERR_DEVICE_FUNCTION_NOT_INIT | -2009 |
ECAT_ERR_DEVICE_BUSY | -2010 |
ECAT_ERR_DEVICE_TIMEOUT | -2011 |
ECAT_ERR_DEVICE_NO_DATA | -2012 |
ECAT_ERR_DEVICE_SII_READ_FAIL | -2100 |
ECAT_ERR_DEVICE_SII_WRITE_FAIL | -2101 |
ECAT_ERR_DEVICE_PDO_NOT_EXIST | -2200 |
ECAT_ERR_DEVICE_PDO_OUT_OF_RANGE | -2201 |
ECAT_ERR_DEVICE_FOE_NOT_SUPPORT | -2300 |
ECAT_ERR_DEVICE_FOE_REQUEST_FAIL | -2310 |
ECAT_ERR_DEVICE_FOE_TIMEOUT | -2311 |
ECAT_ERR_DEVICE_FOE_ERROR | -2312 |
ECAT_ERR_DEVICE_FOE_BUFFER_TOO_SMALL | -2313 |
ECAT_ERR_DEVICE_FOE_READ_FAIL | -2314 |
ECAT_ERR_DEVICE_FOE_WRITE_FAIL | -2315 |
ECAT_ERR_DEVICE_COE_SDO_NOT_SUPPORT | -2400 |
ECAT_ERR_DEVICE_COE_SDO_INFO_NOT_SUPPORT | -2401 |
ECAT_ERR_DEVICE_COE_BUSY | -2410 |
ECAT_ERR_DEVICE_COE_REQUEST_FAIL | -2411 |
ECAT_ERR_DEVICE_COE_TIMEOUT | -2412 |
ECAT_ERR_DEVICE_COE_ERROR | -2413 |
ECAT_ERR_DEVICE_CIA402_NOT_EXIST | -2500 |
ECAT_ERR_DEVICE_CIA402_ADD_FAIL | -2501 |
ECAT_ERR_DEVICE_CIA402_TYPE_MISMATCH | -2502 |
ECAT_ERR_DEVICE_CIA402_NO_MODE_SUPPORT | -2503 |
ECAT_ERR_DEVICE_CIA402_WRONG_MODE | -2504 |
ECAT_ERR_DEVICE_CIA402_MODE_NOT_SUPPORT | -2505 |
ECAT_ERR_DEVICE_CIA402_CHANGE_WRONG_STATE | -2506 |
ECAT_ERR_DEVICE_CIA402_WRITE_OBJECT_FAIL | -2507 |
ECAT_ERR_DEVICE_CIA402_NO_SUCH_TOUCH_PROBE | -2580 |
ECAT_ERR_DEVICE_CIA402_NO_SUCH_TOUCH_PROBE_SOURCE | -2581 |
ECAT_ERR_DEVICE_EOE_NOT_SUPPORT | -2600 |
ECAT_ERR_DEVICE_EOE_NO_SUCH_PORT | -2601 |
ECAT_ERR_DEVICE_EOE_TOO_MUCH_CONTENT | -2602 |
ECAT_ERR_DEVICE_EOE_BUSY | -2610 |
ECAT_ERR_DEVICE_EOE_REQUEST_FAIL | -2611 |
ECAT_ERR_DEVICE_EOE_TIMEOUT | -2612 |
ECAT_ERR_GROUP_WRONG_INPUT | -3000 |
ECAT_ERR_GROUP_NOT_ATTACH | -3001 |
A.2 エラーの説明と修正処置
エラーコードの詳細と修正処置
A.3 エラー・コールバック・コード
エラー・コールバック・コードのリスト:
ECAT_ERR_WKC_SINGLE_FAULT | ワーキング・カウンタ障害 | 2000001 |
ECAT_ERR_WKC_MULTIPLE_FAULTS | ワーキング・カウンタの複数の障害 | 2000002 |
ECAT_ERR_SINGLE_LOST_FRAME | 単一のフレームが失われました | 2000003 |
ECAT_ERR_MULTIPLE_LOST_FRAMES | 複数のフレームが失われました | 2000004 |
ECAT_ERR_LOST_SLAVE | Lost SubDevice. | 2000005 |
ECAT_ERR_STATE_MISMATCH | 状態の不一致です | 2000006 |
ECAT_ERR_CABLE_BROKEN | ケーブルの断線です | 2000007 |
ECAT_ERR_WAIT_ACK_TIMEOUT | ACKタイムアウト待ちです | 2001000 |
A.4 イベント・コールバック・コード
イベント・コールバック・コードのリスト:
ECAT_EVT_STATE_CHANGED | 状態が変更されました | 1000001 |
ECAT_EVT_CABLE_RECONNECTED | ケーブルを再接続しました | 1000002 |
A.5 SDOアボート・コード
ETG.1000.6に定義されたCoE SDOアボート・コード:
| Value | Meaning |
| 0x05030000 | トグル・ビットは変更されていません |
| 0x05040000 | SDOプロトコルのタイムアウト |
| 0x05040001 | クライアント/サーバーのコマンドの指定子が無効であるか、不明です。 |
| 0x05040005 | メモリ不足です |
| 0x06010000 | オブジェクトへのアクセスがサポートされていません |
| 0x06010001 | 書き込み専用オブジェクトへ読み取りを試みます |
| 0x06010002 | 読み取り専用オブジェクトに書き込みを試みます |
| 0x06010003 | サブインデックスに書き込むことはできません。書き込みアクセスの場合はSI0を0にする必要があります |
| 0x06010004 | SDO完全アクセスは、ENUMオブジェクト・タイプのような可変長のオブジェクトではサポートされていません |
| 0x06010005 | オブジェクトの長さがメールボックスのサイズを超えています |
| 0x06010006 | オブジェクトがRxPDOにマップされ、SDOダウンロードがブロックされました |
| 0x06020000 | オブジェクトがオブジェクト・ディレクトリに存在しません |
| 0x06040041 | オブジェクトは PDO にマッピングできません |
| 0x06040042 | マップされるオブジェクトの数と長さは PDOの長さを超えます |
| 0x06040043 | 一般的な媒介変数の非互換性理由 |
| 0x06040047 | デバイスの一般的な内部非互換性 |
| 0x06060000 | ハードウェア・エラーによりアクセスに失敗しました |
| 0x06070010 | データ型が一致せず、サービス変数の長さが一致しません |
| 0x06070012 | データ型が一致せず、サービス変数の長さが長すぎます |
| 0x06070013 | データ型が一致せず、サービス変数の長さが短すぎます |
| 0x06090011 | サブインデックスが存在しません |
| 0x06090030 | 媒介変数の値の範囲を超えました(書き込みアクセスの場合のみ) |
| 0x06090031 | 書き込まれた変数の値が高すぎます |
| 0x06090032 | 書き込まれた変数の値が低すぎます |
| 0x06090036 | 最大値が最小値より小さいです |
| 0x08000000 | 一般的なエラーです |
| 0x08000020 | データをアプリケーションに転送または保存することはできません。 注: これは、理由の詳細が特定できない場合の一般的な中止コードです。より詳細な中止コード(0x08000021、0x08000022)のいずれかを使用することをお勧めします。 |
| 0x08000021 | ローカル制御のため、データをアプリケーションに転送または保存することはできません。 注: 「ローカル制御」とは、アプリケーション固有の理由を意味します。 ESM固有の制御を意味するものではありません。 |
| 0x08000022 | 現在のデバイスの状態のため、データをアプリケーションに転送または保存できません。 注: 「デバイスの状態」とは、ESMの状態を意味します。 |
| 0x08000023 | オブジェクト・ディクショナリの動的生成が失敗するか、オブジェクト・ディクショナリが存在しません |
Data Typeを参照ください
ETG.1000.6で定義されている基本データ型:
| インデックス (hex) | オブジェクト・タイプ | 名前 |
| 0001 | DEFTYPE | BOOLEAN |
| 0002 | DEFTYPE | INTEGER8 |
| 0003 | DEFTYPE | INTEGER16 |
| 0004 | DEFTYPE | INTEGER32 |
| 0005 | DEFTYPE | UNSIGNED8 |
| 0006 | DEFTYPE | UNSIGNED16 |
| 0007 | DEFTYPE | UNSIGNED32 |
| 0008 | DEFTYPE | REAL32 |
| 0009 | DEFTYPE | VISIBLE_STRING |
| 000A | DEFTYPE | OCTET_STRING |
| 000B | DEFTYPE | UNICODE_STRING |
| 000C | DEFTYPE | TIME_OF_DAY |
| 000D | DEFTYPE | TIME_DIFFERENCE |
| 000F | DEFTYPE | DOMAIN |
| 0010 | DEFTYPE | INTEGER24 |
| 0011 | DEFTYPE | REAL64 |
| 0012 | DEFTYPE | INTEGER40 |
| 0013 | DEFTYPE | INTEGER48 |
| 0014 | DEFTYPE | INTEGER56 |
| 0015 | DEFTYPE | INTEGER64 |
| 0016 | DEFTYPE | UNSIGNED24 |
| 0018 | DEFTYPE | UNSIGNED40 |
| 0019 | DEFTYPE | UNSIGNED48 |
| 001A | DEFTYPE | UNSIGNED56 |
| 001B | DEFTYPE | UNSIGNED64 |
| 001D | DEFTYPE | GUID |
| 001E | DEFTYPE | BYTE |
| 002D | DEFTYPE | BITARR8 |
| 002E | DEFTYPE | BITARR16 |
| 002F | DEFTYPE | BITARR32 |
A.7 EtherCATネットワーク情報
EtherCATネットワーク情報(ENI)には、EtherCATネットワークを構成するために必要な設定が含まれています。このXMLベースのファイルには、Mデバイスの一般情報と、Mデバイスに接続されたすべてのSubデバイスの設定が含まれています。EtherCAT構成ツールは、ESIファイルを読み込むか、ネットワーク上のすべてのSubデデバイスをオンラインスキャンします。その後、ユーザーはPDOマッピングやDCの有効化など、関連するEtherCAT設定を行い、ENIファイルをエクスポートできます。

EtherCAT Technology Groupは、EtherCAT Mデバイスソフトウェアがネットワーク構成セクションにおいて、オンラインスキャンまたはENIの読み取りの少なくとも1つをサポートすることを規定しています。しかし、このライブラリは両方をサポートしています。ENIの読み取りの場合、このライブラリは現在、ネットワーク構成のためにENIファイルから部分的な情報のみを抽出します。
抽出された情報には次のものが含まれます:
EtherCATConfig : Config : SubDevice : Info
- 使用要素
- VendorId
- ProductCode
- 属性
- 識別 : 値
- 目的
ネットワーク上のEtherCATSubデバイスがENIファイルで指定されたSubデバイスと一致するかどうかを確認するために使用されます。確認ルールは以下のとおりです。- ENI ファイル内のSubデバイスの数が、ネットワーク上のSubデバイスの数と一致しているかどうかを確認します。
- ENIファイル内のIdentification: Value属性を持つSubデバイスについて、ネットワーク上に一致するエイリアスアドレス、Identification: Value属性、ベンダーID、製品コードを持つSubデバイスが存在するかどうかを確認します。該当するSubデバイスが存在する場合、一致が成功したことを示します。
- 一致しない Identification: Value 属性を持つSubデバイス、またはこの属性を持たないSubデバイスの場合は、ネットワーク上で同じシーケンス番号を持つSubデバイスのベンダー ID と製品コードが一致するかどうかを確認します。
EtherCATConfig : Config : SubDevice : Mailbox
- 使用要素
- Send : MailboxSendInfoType : Start
- Recv : MailboxRecvInfoType : Start
- 目的
EtherCAT Subデバイスのメールボックスの物理開始アドレスを構成するために使用されます。
EtherCATConfig : Config : SubDevice : Mailbox : CoE
- 使用要素
- InitCmds : InitCmd : Index
- InitCmds : InitCmd : SubIndex
- InitCmds : InitCmd : Data
- InitCmds : InitCmd : Timeout
- 属性
- InitCmds : InitCmd : CompleteAccess
- 目的
EtherCAT ステート マシンを Pre-Operational 状態に切り替えた後、EthercatMaster::begin()で EtherCAT Subデバイスの CoE 初期化コマンドを実行します。
EtherCATConfig : Config : SubDevice : ProcessData
- 使用要素
- Recv : BitLength
- Send : BitLength
- 目的
EtherCAT Subデバイスの出力プロセス データと入力プロセス データのビット長は、関連する構成のためにファームウェアに提供されます。
EtherCATConfig : Config : SubDevice : ProcessData : Sm
- 使用要素
- SyncManagerSettings : StartAddress
- SyncManagerSettings : ControlByte
- SyncManagerSettings : Enable
- 目的
EtherCAT Subデバイスのプロセス データの同期マネージャ レジスタを構成するために使用されます。
EtherCATConfig : Config : SubDevice : DC
- 使用要素
- CycleTime0
- CycleTime1
- ShiftTime
- 目的
EtherCAT サブデバイスの DC パラメータを構成するために使用されます。
86Duinoリファレンスのテキストは、Arduinoリファレンスを改変したもので、Creative Commons Attribution-ShareAlike 3.0ライセンスに基づいてライセンスされています。リファレンス内のコードサンプルはパブリックドメインとして公開されています。
詳細情報やサンプルのご要望については、info@icop.com.tw までメールをお送りいただくか、最寄りの ICOP 支店 までお電話いただくか、ワールドワイド正規販売代理店までお問い合わせください。