EtherCAT ライブラリ API ユーザーマニュアル

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/.

86duinoIDE_500_Logo

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)・アクセス・インターフェイス
  • 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の同期機能とリアルタイム機能を確保できます。

Vortex86EX2_Dualcore_diagram

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データの同期が保証されます。

Vortex86EX2_Dualsystem

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 AClass BQEC Mデバイス
基本的な機能
Service Commandsすべてのコマンドのサポートshall if ENI import supportO
IRQ field in datagramデータグラムヘッダーのSubデバイスからのIRQ情報を使用するshouldshould
SubDevices with Device Emulationアプリケーションコントローラの有無にかかわらずSubデバイスをサポートshallshallO
EtherCAT State MachineESMの特別な動作のサポートshallshallO
Error Handlingネットワークまたはスレーブのエラーのチェック(ワーキング・カウンタ、など)shallshallO
VLANVLANタグをサポートmaymay
EtherCAT Frame TypesEtherCATフレームのサポートshallshallO
UDP Frame TypesUDPフレームをサポートmaymay
プロセス・データ交換
Cyclic PDO周期的なプロセス・データ交換shallshallO
Multiple Tasks異なるサイクルタスク、PDOの複数の更新レートmaymay
Frame repetition周期的なフレームを複数回送信して耐性を高めるmaymay
ネットワークコンフィギュレーション
Online scanningEtherCAT Mデバイスに含まれるネットワーク構成機能at least one of themO
Reading ENIENIファイルから取得したネットワークコンフィギュレーションat least one of themO
Compare Network configuration事前に構成されたネットワークと実際のネットワーク構成を起動時に比較するshallshallO
Explicit Device Identificationケーブル交換に対し、ホットコネクト防止に使用される識別shouldshouldO
Station Alias AddressingSubデバイスで構成されたステーションエイリアスをサポートmaymay
Access to EEPROMESCレジスタ経由でEEPROMにアクセスするためのルーチンをサポートRead shall / Write mayO
メールボックスのサポート
Support Mailboxメールボックス転送の主な機能shallshallO
Mailbox Resilient Layerフレーム損失時の回復レイヤーをサポートshallshallO
Multiple Mailbox channels1台のデバイスへの同時メールボックスプロトコル転送maymay
Mailbox pollingSubデバイスのメールボックスの状態をポーリングするshallshall
EtherCATを介したCANアプリケーション層( CoE )
SDO Up/Download通常および迅速な転送shallshallO
Segmented Transfer分割転送shallshouldO
Complete Access一度にオブジェクト全体 (すべてのサブ・インデックスを含む) を転送shallshould (shall if ENI Import supported)O
SDO Info serviceオブジェクト辞書を読み取るサービスshallshouldO
Emergency Message緊急メッセージを受信するshallshall
PDO in CoECoE経由で送信されるPDOサービスmaymay
EoE
EoE protocolイーサネットフレームをトンネリングするためのサービス。指定されたすべてのEoEサービスが含まれます。shallshall if EoE support
Virtual Switch仮想スイッチ機能shallshall if EoE support
EoE Endpoint to Operation SystemsEoE 層上のオペレーティング システムへのインターフェイスshouldshould if EoE support
FoE
FoE ProtocolFoEプロトコルをサポートshallshall if FoE supportO
Firmware Up/Downloadパスワード、ファイル名は、アプリケーションにより与えられるshallshouldO
Boot Stateファームウェアのアップ/ダウンロードのためのブート状態をサポートshallshall if FW UP/Download
SoE
SoE ServicesSoEサービスのサポートshallshall if SoE support
AoE
AoE ProtocolAoEプロトコルをサポートshouldshould
VoE
VoE Protocol外部接続をサポートmaymay
高精度時刻同期 (DC) との同期
DC support時刻同期のサポートshallshall if DC supportO
Continuous Propagation Delay compensation伝播遅延の連続計算shouldshould
Sync window monitoringサブデバイスの同期差異の継続的な監視shouldshould
SubDevice-to-SubDevice Communication
via MDevice情報はENIファイルで提供されるか、他のネットワーク構成の一部として提供される。データのコピーはMデバイススタックまたはMデバイスアプリケーションによって処理される。shallshall
MDevice information
MDevice Object DictionaryMデバイス オブジェクト ディクショナリのサポート (ETG.5001 MDP サブ プロファイル 1100)shouldmay

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同期を参照ください。

Ethercat_synchronization

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はそれぞれ独自のサイクルタイムを持ち、その結果、不一致が生じています。     このシナリオは、高い同期要件を持つアプリケーションには適していません。

Ethercat_free_run_diagram

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 ValidInput Latch を互いに近くなるように調整することが可能です。ただし、伝播遅延を計算できないため、調整は非常に困難です。

Ethercat_sm-synchronous_diagram

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 ValidInput Latch のタイミングを同じ時点に調整することが可能です。

ただし、図のGlobal Shift Timeの選択は重要であり、次の条件を満たす必要があります。

  • すべてのSubデバイスが周期フレームを受信した後
  • 次のサイクルの循環フレームを送信する前
  • さまざまなDC同期方式に応じて、 DC同期 出力の準備を実行した後に選択する必要がある場合があります 出力の準備  :
    • SM イベントが発生したときに µC をトリガーして 出力の準備 を実行します
    • SYNC イベントが発生したときに、µC をトリガーして Output Valid を実行します。

修正されたグローバル・シフト時間は一意ではありません。サイクル時間の全間隔内で選択できます。さまざまな DC同期方式の詳細については、ETG.1020 EtherCATプロトコル拡張機能を参照してください。

Ethercat_dc-synchronous_diagram

2. 関数

QEC EtherCAT Mデバイス ライブラリ

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

Ethercat_classes

これらのクラスは、次の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_class_diagram
  • 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
    ECAT_MASTER_SHIFT
    • Mデバイス システム時間は参照クロックに同期されます。
    • すべての DC Subデバイスはリファレンス クロックに同期されます。
  • バス・シフト・モード - ECAT_BUS_SHIFT
    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 コールバック関数

qec_callback_function_diagram

このライブラリは、次の 3 種類のコールバックを提供します:

  • 周期コールバック(Cyclic Callback)
    周期コールバックの目的は、モーション制御、CNC制御、ロボット制御などの周期制御システムを実装できるようにすることです。リアルタイムEtherCAT Mデバイスコアは、指定された周期時間でEtherCAT Mデバイスライブラリへの周期割り込みをトリガーし、ACKを待機することでプロセスデータの同期を確保します。ユーザーが周期コールバックを登録している場合は、周期制御を実現するためにそれが呼び出されます。
  • エラー・コールバック(Error Callback)
    リアルタイムEtherCAT Mデバイスコアはエラーを検出すると、エラー割り込みをトリガーし、32ビットのエラーコードをEtherCAT Mデバイスライブラリに渡します。ユーザーがエラーコールバックを登録している場合、システムはそのコールバックを呼び出して、ユーザーに特定のエラーを通知します。
    エラー・コールバックでサポートされているエラー・コードは次のとおりです:
定義コード説明
ECAT_ERR_WKC_SINGLE_FAULT2000001ワーキング・カウンタに障害が発生しました
ECAT_ERR_WKC_MULTIPLE_FAULTS2000002複数のワーキング・カウンタに障害が発生しました
ECAT_ERR_SINGLE_LOST_FRAME2000003フレームが失われました
ECAT_ERR_MULTIPLE_LOST_FRAMES2000004フレームが複数回失われました
ECAT_ERR_CABLE_BROKEN2000007ケーブルが切断されました
ECAT_ERR_WAIT_ACK_TIMEOUT2001000循環的な割り込みACKの待機中にファームウェアがタイムアウトしました
  • イベント・コールバック(Event Callback)
    リアルタイムEtherCAT Mデバイスコアはイベントを検出すると、イベント割り込みをトリガーし、32ビットのイベントコードをEtherCAT Mデバイスライブラリに渡します。ユーザーがイベントコールバックを登録している場合、システムはそのコールバックを呼び出して、特定のイベントをユーザーに通知します。
    イベント・コールバックでサポートされているイベント・コードは次のとおりです:
定義コード説明
ECAT_EVT_STATE_CHANGED1000001Mデバイスの EtherCAT 状態が変更されました。
ECAT_EVT_CABLE_RECONNECTED1000002ケーブルが再接続しました

2.1.3 Subデバイス情報関数

このライブラリは、ネットワーク上のEtherCATSubデバイスに関する情報を取得するための関数を提供します。ネットワーク上のSubデバイスの数の問い合わせ、SubデバイスのベンダーID、製品コード、エイリアスアドレスをシーケンス番号から取得する機能、そしてこれらの情報を用いてSubデバイス番号を逆順に問い合わせる機能が含まれます。これらの機能は、Subデバイスのタイプを識別し、適切なEtherCATSubデバイスクラスを選択して接続するために使用されます。


2.1.4 制御関数

EtherCAT Mデバイスライブラリが提供する制御関数は、EtherCATネットワークの状態と動作を管理する上で非常に重要です。これらの関数を使用することで、ユーザーはネットワークを正確に制御し、MデバイスとSubデバイス間の信頼性の高い同期通信を実現できます。


2.2 EtherCATデバイス

EtherCAT デバイスパートは、PDO、CoE、FoE などの機能を操作できる汎用 EtherCAT Subデバイス クラスを提供し、CiA 402 Subデバイス 汎用クラスも含まれています。

EtherCAT デバイスパートとEtherCAT Mデバイスパートの主なクラス関係は関連であり、EtherCAT デバイスパートはEtherCAT Mデバイスパートに依存します。下図に示すように、_EthercatDevice_CommonDriverとEthercatMasterの間には関連関係があります。

Ethercat_device_diagram
  • 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のクラス関係性を次の図に示します:

_EthercatDevice_CommonDriver_diagram
  • EthercatMasterと_EthercatDevice_CommonDriverの間には、 EthercatMasterに依存する_EthercatDevice_CommonDriverにより、関連性があります。
  • 他のすべての EtherCATSubDevice クラスは、_EthercatDevice_CommonDriver から継承されます。

警告: このクラスを使用してオブジェクトを宣言することは禁止です。

情報関数

このライブラリは、ネットワーク上のEtherCATSubデバイスに関する情報を取得するための関数を提供します。これには、デバイス識別に使用されるベンダーID、製品コード、エイリアスアドレス、デバイス名などの重要な詳細情報が含まれます。さらに、EtherCATSubデバイスがCoE、FoE、DCなどの特定の機能をサポートしているかどうかの情報も提供します。このSubデバイス情報により、ユーザーはネットワーク内のデバイスの特性と機能を理解し、対応する設定および制御タスクを実行することができます。

分散クロック(DC)関数

Distributed Clocks(DC)は、EtherCATSubデバイスコントローラ(ESC)の重要な機能ユニットです。EtherCATネットワーク全体にわたる時刻同期メカニズムの実装を担い、すべてのSubデバイスが統一された時刻基準に従ってクロックを同期させることで、システム全体の時刻の一貫性を確保します。

システム同期のために、すべてのSubデバイスは1つのリファレンスクロックに同期されます。通常、同一セグメント内でMデバイスの後に位置する、分散クロック機能を備えた最初のESCがリファレンスクロック(システムタイム)を保持します。このシステムタイムは、他のデバイスおよびMデバイスのDCサブデバイスクロックを同期するためのリファレンスクロックとして使用されます。クロック同期では、伝播遅延、ローカルクロックソースのドリフト、およびローカルクロックオフセットが考慮されます

ESCは、ローカルアプリケーションをEtherCATシステム時間に同期させるためのSyncSignalを生成できます。SyncSignalは、直接 (たとえば、割り込みとして) 使用することも、デジタル出力の更新/デジタル入力のサンプリングに使用することもできます。さらに、LatchSignalに EtherCATシステム時間を基準としたタイム・スタンプを付けることができます。

Ethercat_dc_diagram

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サイクル時間が経過したときに生成されます。
次の図に、いくつかのコンフィギュレーション例を示します:

Ethercat_dc_diagram-1

詳細な情報については、 ESC Hardware Data Sheet Section I.を参照してください。

プロセス・データ・オブジェクト(PDO)関数

プロセスデータとは、EtherCATネットワーク内のMデバイスとSubデバイス間で交換されるリアルタイム通信データを指します。このデータには、制御、監視、通信に使用される情報が含まれます。EtherCAT Mデバイスは、すべてのSubデバイスを制御および監視するためにプロセスデータを周期的に送信し、高い同期性と低遅延を実現します。

EtherCATSubデバイスコントローラ(ESC)内のフィールドバスメモリ管理ユニット(FMMU)は、デュアルポートメモリを論理アドレスにマッピングできます。すべてのSubデバイスノードは、EtherCAT Mデバイスから送信されたEtherCATフレームをチェックし、プロセスデータの論理アドレスとFMMUに設定されたアドレスを比較します。一致が見つかった場合、出力プロセスデータはデュアルポートメモリに転送され、入力プロセスデータはEtherCATフレームに挿入されます。

総体的に、プロセスデータは、EtherCATテクノロジの重要な部分であり、ロボット制御、CNC制御、オートメーション制御、その他の分野のリアルタイム・アプリケーションに適しています。

CANopen over EtherCAT (CoE) 関数

CANopenは、コントローラ・エリア・ネットワーク (CAN) バスに基づく高度な通信プロトコルで、産業用アプリケーションの制御システムとデバイス間の通信に一般的に使用されます。 これにはデバイス間のデータ交換、構成、制御を容易にするために、一連の通信オブジェクト、データ型、およびネットワーク管理機能を定義します。

CANopenプロトコルには次の側面が含まれます:

  • オブジェクト・ディクショナリ
    デバイス間で交換されるすべてのデータ・オブジェクトと媒介変数を定義します。オブジェクト・ディクショナリには、変数、媒介変数、イベント、関数などの様々なタイプのオブジェクトが含まれます。
  • PDO (プロセス・データ・オブジェクト)
    リアルタイムのデータ転送に使用されます。 PDOを使用すると、デバイスは、固定された、またはイベント・トリガの方法で相互にデータを転送できるようになり、リアルタイム制御とデータ交換が可能になります。
  • SDO (サービス・データ・オブジェクト)
    デバイスの変数の設定と管理に使用されます。 SDOは、読み取り、書き込み、変数設定の機能を提供し、デバイスが設定情報を動的に交換できるようにします。
CoE_diagram

CoE (CAN application over EtherCAT )は、 EtherCATネットワークに基づくCANopenプロトコルです。これにより、 EtherCATネットワーク上でCANopenプロトコルを使用した通信が可能になります。オブジェクト・ディクショナリには、変数、アプリケーションデータ、およびプロセス・データ・インターフェイスとアプリケーションデータ間のマッピング情報 (PDOマッピング) が含まれます。そのエントリには、サービス・データ・オブジェクト (SDO) を介してアクセスできます。 SDOサービスは、主に2種類のコマンドで構成されています。SDOコマンドは、オブジェクトディクショナリに格納されているオブジェクトにアクセスするために使用され、SDO情報コマンドは、これらのオブジェクトの詳細を取得するために使用されます。

SDOコマンド

SDO情報コマンド

File over EtherCAT (FoE) 関数

File access over EtherCAT (FoE)は、EtherCATネットワークを介したファイル転送機能を可能にするEtherCATのプロトコル拡張です。ファームウェアやその他のファイルをEtherCATSubデバイスにダウンロードしたり、EtherCATSubデバイスからファームウェアやその他のファイルをアップロードしたりするための標準的な方法を規定しています。

FoE_diagram
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_diagram
  • 関係性 : 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_diagram
  • _EthercatDevice_DmpCommonDriverは _EthercatDevice_CommonDriver から継承します。

警告: このクラスを使用してオブジェクトを宣言することは禁止です。

システム監視関数

QECシリーズMCU搭載EtherCATSubデバイスはすべて、システム温度、システム電圧、システム電流、周辺電圧、周辺電流などのシステム監視情報を取得するためのCoEオブジェクトを提供しています。そのため、このライブラリはシステム監視情報を取得するための関数を提供し、ユーザーはシステムを迅速に監視し、障害の兆候を評価できます。

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 0Byte 1Byte 2Byte 3Byte 4Byte 5
ControlwordTarget Position
  • Input PDO (TxPDO)
Byte 0Byte 1Byte 2Byte 3Byte 4Byte 5
StatuswordPosition 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_SUCCESS0
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アボート・コード:

ValueMeaning
0x05030000トグル・ビットは変更されていません
0x05040000SDOプロトコルのタイムアウト
0x05040001クライアント/サーバーのコマンドの指定子が無効であるか、不明です。
0x05040005メモリ不足です
0x06010000オブジェクトへのアクセスがサポートされていません
0x06010001書き込み専用オブジェクトへ読み取りを試みます
0x06010002読み取り専用オブジェクトに書き込みを試みます
0x06010003サブインデックスに書き込むことはできません。書き込みアクセスの場合はSI0を0にする必要があります
0x06010004SDO完全アクセスは、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)オブジェクト・タイプ名前
0001DEFTYPEBOOLEAN
0002DEFTYPEINTEGER8
0003DEFTYPEINTEGER16
0004DEFTYPEINTEGER32
0005DEFTYPEUNSIGNED8
0006DEFTYPEUNSIGNED16
0007DEFTYPEUNSIGNED32
0008DEFTYPEREAL32
0009DEFTYPEVISIBLE_STRING
000ADEFTYPEOCTET_STRING
000BDEFTYPEUNICODE_STRING
000CDEFTYPETIME_OF_DAY
000DDEFTYPETIME_DIFFERENCE
000FDEFTYPEDOMAIN
0010DEFTYPEINTEGER24
0011DEFTYPEREAL64
0012DEFTYPEINTEGER40
0013DEFTYPEINTEGER48
0014DEFTYPEINTEGER56
0015DEFTYPEINTEGER64
0016DEFTYPEUNSIGNED24
0018DEFTYPEUNSIGNED40
0019DEFTYPEUNSIGNED48
001ADEFTYPEUNSIGNED56
001BDEFTYPEUNSIGNED64
001DDEFTYPEGUID
001EDEFTYPEBYTE
002DDEFTYPEBITARR8
002EDEFTYPEBITARR16
002FDEFTYPEBITARR32

A.7 EtherCATネットワーク情報

EtherCATネットワーク情報(ENI)には、EtherCATネットワークを構成するために必要な設定が含まれています。このXMLベースのファイルには、Mデバイスの一般情報と、Mデバイスに接続されたすべてのSubデバイスの設定が含まれています。EtherCAT構成ツールは、ESIファイルを読み込むか、ネットワーク上のすべてのSubデデバイスをオンラインスキャンします。その後、ユーザーはPDOマッピングやDCの有効化など、関連するEtherCAT設定を行い、ENIファイルをエクスポートできます。

Ethercat_network_information

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 支店 までお電話いただくか、ワールドワイド正規販売代理店までお問い合わせください。

上部へスクロール