EtherCATライブラリ

2026.01.07, Version v3.3r0.

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統合開発環境(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デバイスの構造

More about QEC EtherCAT MDevice Architecture

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 ハードウェアプラットフォーム

More about QEC Hardware Platform

EtherCAT Mainデバイスソフトウェアは、DM&P社製のデュアルシステムアーキテクチャを備えたVortex86EX2 CPU上でのみ動作します。マスターシステムとスレーブシステムに分かれており、それぞれが独自のオペレーティングシステムを実行します。システム間の通信は、デュアルポートRAMとイベント割り込みによって実現されます。

それぞれのタスクは次のとおりです。

  • マスタシステム
    • ユーザーのEtherCATアプリケーション
    • ユーザーのHMIアプリケーション
    • ユーザーのイーサネットアプリケーション
    • など。
  • スレーブシステム
    • EtherCAT Mainデバイス ファームウェアの実行のみを担います。

ほとんどのアプリケーションはマスターシステム上で実行されるため、スレーブシステム上で実行されるEtherCAT Mainデバイスファームウェアは他のアプリケーションからの干渉を受けません。この設定により、スレーブシステムはEtherCAT Mainデバイスコアの実行に集中でき、EtherCATの同期機能とリアルタイム機能を確保できます。

Vortex86EX2_Dualcore_diagram

1.1.4 デュアルシステムの同期

More about QEC Daul-System Synchronization

このセクションの主な議論は、デュアルシステム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: サポートされていることに相当します。
Feature Table
機能名簡単な説明Class AClass BQEC MDevice
基本的な機能
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/DownloadO
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 ケーブルの冗長性

More about Cable Redundancy

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デバイス からの周期フレームの送信におけるジッタ。


1.5 同期

More about Synchronization

The time synchronization among all SubDevices in an EtherCAT network relies on the Distributed Clocks (DC) unit within the EtherCAT SubDevice Controller (ESC), ensuring consistency across the entire system. Typically, the first SubDevice with DC serves as the system reference clock to synchronize other SubDevices with DC.
For a more detailed explanation of DC, please refer to Distributed Clocks.

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(フリーラン)

More about Free Run Mode

EtherCAT MainデバイスとすべてのEtherCAT Subデバイスはそれぞれ独自のローカルタイマーを持ち、サイクルタイムは独立しているため同期していません。下の図に示すように、EtherCAT MainデバイスとSubデバイス 1、Subデバイス 2、Subデバイス 3、そしてSubデバイス nはそれぞれ独自のサイクルタイムを持ち、その結果、不一致が生じています。     このシナリオは、高い同期要件を持つアプリケーションには適していません。

Ethercat_free_run_diagram

1.5.2 SM同期

More about SM-Synchronous Mode

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同期

More about DC-Synchronous Mode

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デバイス情報へのアクセスに関連する機能を提供します。

The main class relationship between the EtherCAT MDevice part and the EtherCAT Device part is association, with the EtherCAT Device part depending on the EtherCAT MDevice part.

The class relationships of EthercatMaster are illustrated in the following diagram:
EthercatMaster_class_diagram

2.1.1 EtherCAT MDevice Settings

This library offers a variety of configuration parameters for users to choose from, aiming to meet the diverse application needs of users.

Below are the configuration parameters provided by this library.
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  単位:ミリ秒
Base timeout for start MDevice, Tbase.
   EthercatMaster::start(), the firmware is requested to start EtherCAT, and the timeout for this request is referred to as startup timeout, Tstartup.
EtherCATの起動タイムアウト時間は次のように計算されます: Tstartup = Tbase + (TSubDevice × NSubDevices) .
Here, NSubDevices is the number of SubDevices on the network.

StartDeviceTimeout
デフォルト: 500  単位:ミリ秒
Timeout per SubDevice for start MDevice, TSubDevice.

ErrorDetectWkcMultipleFaultsThreshold
デフォルト: 3
The MDevice should check the Working Counter of a received EtherCAT datagram. If the Working Counter does not match with the expected value an error is detected. When the number of consecutive errors exceeds this parameter, an ECAT_ERR_WKC_MULTIPLE_FAULTS   

ErrorDetectMultipleLostFramesThreshold
デフォルト: 3
The MDevice may use the index of the EtherCAT datagram header to check if all sent EtherCAT datagrams will be received. If EtherCAT datagrams are lost an error is detected. When the number of consecutive errors exceeds this parameter, an 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.2 Initialization Functions

EtherCAT Mデバイスを起動する前に、初期化する必要があります。このライブラリは、ユーザーの多様なアプリケーションニーズを満たすために、ユーザーが選択できる様々な設定パラメータを提供します。

機能説明
begin()Initialize the EtherCAT MDevice, scan all EtherCAT SubDevices on the network, and switch the EtherCAT state machine to the Pre-Operational state.
end()Deinitialize the EtherCAT MDevice.
isRedundancy()Check if the EtherCAT MDevice has cable redundancy enabled.
ibraryVersion( )Get the EtherCAT MDevice library version.
firmwareVersion( )EtherCATファームウェアのバージョンを取得します。
readSettings()Read the current EtherCAT MDevice settings.
saveSettings()Save the EtherCAT MDevice settings.

2.1.3 Control Functions

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

機能説明
start()Start the EtherCAT MDevice, configure the SM, FMMU, and DC registers of all SubDevices, and switch the EtherCAT state machine to the Operational state.
stop()Stop the EtherCAT MDevice.
update()Update process data and handle acyclic commands.
setShiftTime()Set the Global Shift Time for DC-Synchronous mode.
getShiftTime()Get the Global Shift Time for DC-Synchronous mode.
getSystemTime()Get the system time of the current cycle.
getWorkingCounter()Get the working counter for the current cycle.
getExpectedWorkingCounter()期待されるワーキング・カウンタ値を取得します。

2.1.4 Callback Functions

qec_callback_function_diagram

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

(循環コールバック、エラーコールバック、イベントコールバックなど)

周期コールバックの目的は、モーション制御、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ケーブルが再接続しました

Functions:

機能説明
attachCyclicCallback()Register a cyclic callback.
detachCyclicCallback()Unregister the cyclic callback.
attachErrorCallback()Register an error callback.
detachErrorCallback()Unregister the error callback.
attachEventCallback()Register an event callback.
detachEventCallback()Unregister the event callback.
errGetCableBrokenLocation1()Get cable broken location 1. (Error Callback only)
errGetCableBrokenLocation2()Get cable broken location 2. (Error Callback only)
evtGetMasterState()Get the EtherCAT MDevice state. (Event Callback only)

2.1.5 SubDevice Information Functions

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

機能説明
getSlaveCount()Get the number of SubDevices on the network.
getVendorID()Get the Vendor ID of the specified SubDevice.
getProductCode()Get the Product Code of the specified SubDevice.
getRevisionNumber()Get the Revision Number of the specified SubDevice.
getSerialNumber()Get the Serial Number of the specified SubDevice.
getAliasAddress()Get the Alias Address of the specified SubDevice.
getSlaveNo()Find the sequence number of a matching SubDevice on the network.

2.2 EtherCATデバイス

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

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

Diagram
Ethercat_device_diagram

2.2.1 _EthercatDevice_CommonDriver

_EthercatDevice_CommonDriver は、Subデバイス情報にアクセスするための機能だけでなく、PDO、SII、CoE、FoE、DC などのさまざまな EtherCAT 機能アクセス メソッドも提供する抽象クラスです。すべての EtherCAT Subデバイス クラスはこれを継承します。

_EthercatDevice_CommonDriverのクラス関係性を次の図に示します:
_EthercatDevice_CommonDriver_diagram
2.2.1.1 Information Functions

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

機能説明
getVendorID()Get the Vendor ID.
getProductCode()Get the Product Code.
getRevisionNumber()Get the Revision Number.
getSerialNumber()Get the Serial Number.
getAliasAddress()Get the Alias Address.
getSlaveNo()Get the sequence number on the EtherCAT network.
getDeviceName()Get the device name.
getMailboxProtocol()Get the supported mailbox protocol types.
getCoEDetails()Get the details about CoE support.
getFoEDetails()Get the details about FoE support.
getEoEDetails()Get the details about EoE support.
getSoEChannels()Get the number of SoE channels supported.
isSupportDC()Check if the SubDevice supports Distributed Clock.
2.2.1.2 Process Data Objects (PDO) Functions

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

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

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

機能説明
pdoBitWrite()Write 1-bit output process data.
pdoBitRead()Read 1-bit input process data.
pdoGetOutputBuffer()Get the memory pointer of output process data.
pdoGetInputBuffer()Get the memory pointer of input process data.
pdoWrite()Write multiple bytes of output process data.
pdoWrite8()Write 8-bit output process data.
pdoWrite16()Write 16-bit output process data.
pdoWrite32()Write 32-bit output process data.
pdoWrite64()Write 64-bit output process data.
pdoRead()Read multiple bytes of input process data.
pdoRead8()Read 8-bit input process data.
pdoRead16()Read 16-bit input process data.
pdoRead32()Read 32-bit input process data.
pdoRead64()Read 64-bit input process data.
2.2.1.3 CANopen over EtherCAT (CoE) Functions

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

About CANopen

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

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

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

SDOコマンド

機能説明
sdoDownload()Write multiple bytes of data to the object.
sdoDownload8()Write 8-bit value to the object.
sdoDownload16()Write 16-bit value to the object.
sdoDownload32()Write 32-bit value to the object.
sdoDownload64()Write 64-bit value to the object.
sdoUpload()Read multiple bytes of data from the object.
sdoUpload8()Read 8-bit value from the object.
sdoUpload16()Read 16-bit value from the object.
sdoUpload32()Read 32-bit value from the object.
sdoUpload64()Read 64-bit value from the object.

SDO情報コマンド

機能説明
getODlist()Get a list of objects in the Object Dictionary.
getObjectDescription()Get the object description.
getEntryDescription()Get the entry description of the object.
2.2.1.4 File over EtherCAT (FoE) Functions

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

FoE Diagram
FoE_diagram

Functions:

機能説明
readFoE()Read a file from the EtherCAT SubDevice.
writeFoE()Write a file to the EtherCAT SubDevice.
2.2.1.5 Distributed Clock (DC) Functions

The Distributed Clocks (DC) is an essential functional unit within the EtherCAT SubDevice Controller (ESC).

More about Distributed Clock (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.を参照してください。

Functions:

機能説明
setDc()Configure DC parameters.
2.2.1.6 SII EEPROM Functions

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.を参照ください

機能説明
readSII()Read multiple bytes of data from the SII EEPROM.
readSII8()Read 8-bit value from the SII EEPROM.
readSII16()Read 16-bit value from the SII EEPROM.
readSII32()Read 32-bit value from the SII EEPROM.
writeSII()Write multiple bytes of data to the SII EEPROM.
writeSII8()Write 8-bit value to the SII EEPROM.
writeSII16()Write 16-bit value to the SII EEPROM.
writeSII32()Write 32-bit value to the SII EEPROM.

2.2.2 EthercatDevice_Generic

EthercatDevice_Generic は、Subデバイス情報、PDO、CoE、FoE、DC などへのアクセスを含む、すべての EtherCAT Subデバイスを制御するために使用できる汎用 EtherCAT Subデバイス クラスです。

EthercatDevice_Genericのクラス関係を次の図に示します:
EthercatDevice_Generic_diagram
2.2.2.1 Initialization Functions

EthercatDevice_Genericクラスの初期化に関連した関数。

機能説明
attach()Initialize the object and attach it to EthercatMaster.
detach()Deinitialize the object and detach from EthercatMaster.

2.2.3 EthercatDevice_CiA402

EthercatDevice_CiA402 は、CiA 402 標準をサポートするすべての EtherCAT サーボ ドライブを制御するように設計された汎用 CiA 402 EtherCAT Subデバイス クラスです。

More about 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デバイス専用の機能を提供し、ユーザーがよりフレンドリーで簡潔な方法でコーディングできるようにします。

The main class relationship between the QEC-Series Device part and the EtherCAT Device part is association, with the QEC-Series Device part depending on the EtherCAT Device part.

As shown in the diagram below

As shown in the diagram below, there is an association relationship between _EthercatDevice_DmpCommonDriver and _EthercatDevice_CommonDriver.

クラス:

  • _EthercatDevice_DmpCommonDriveから継承します。
  • EthercatDevice_DmpDIQ_Generic
  • EthercatDevice_DmpAIQ_Generic
  • EthercatDevice_DmpHID_Generic
  • EthercatDevice_DmpStepper_Generic

2.3.1 _EthercatDevice_DmpCommonDriver

_EthercatDevice_DmpCommonDriver は、ICOP が開発した EtherCAT サブデバイス固有の機能への専用アクセス関数を提供する抽象クラスです。これらの機能には、システム監視(温度、電圧、電流)、注文情報、MTBF などが含まれます。

_EthercatDevice_DmpCommonDriverのクラス関係を次の図に示します:
_EthercatDevice_DmpCommonDriver_diagram
2.3.1.1 System Monitoring Functions

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

機能説明
getSystemTemperature()システム温度を取得します。
getSystemPowerVoltage()Get the system power voltage.
getSystemPowerCurrent()Get the system power current.
getPeripheralPowerVoltage()Get the peripheral power voltage.
getPeripheralPowerCurrent()Get the peripheral power current.
tryToGetSystemTemperature()Try to get the system temperature in a non-blocking manner.
tryToGetSystemPowerVoltage()Try to get the system power voltage in a non-blocking manner.
tryToGetSystemPowerCurrent()Try to get the system power current in a non-blocking manner.
tryToGetPeripheralPowerVoltage()Try to get the peripheral power voltage in a non-blocking manner.
tryToGetPeripheralPowerCurrent()Try to get the peripheral power current in a non-blocking manner.
2.3.1.2 MTBF Functions

MTBF は、平均故障間隔 (Mean Time Between Failures) の略です。これは、システムまたはコンポーネントの故障間隔の平均時間を測定する信頼性の指標です。これは、動作時間の合計をその時間内に発生した故障の数で割ることによって計算されます。その結果は、システムまたはコンポーネントの予想耐用年数を見積もるために使用できる平均値です。MTBFは、システムおよびコンポーネントの信頼性を追跡し、潜在的な設計上の欠陥や製造上の欠陥を特定するために役立つ指標です。また、予防保守スケジュールを決定するためにも使用できます。

QECシリーズMCU搭載EtherCATSubデバイスはすべて、MTBF関連情報を取得するためのCoEオブジェクトを提供しています。そのため、このライブラリはこれらのMTBF関連情報を取得するための関数を提供し、ユーザーまたはメーカーがこれらの情報を提供することで、デバイスの寿命や故障を評価・判断できるようにします

機能説明
getWorkingHours()Get the working hours.
getBootTimes()Get the boot times.
tryToGetWorkingHours()Try to get the working hours in a non-blocking manner.
tryToGetBootTimes()Try to get the boot times in a non-blocking manner.
2.3.1.3 Order Information Functions

QECシリーズのMCU搭載EtherCATSubデバイスはすべて、出荷前にデバイスに書き込まれる顧客注文関連情報を取得するためのCoEオブジェクトを提供しています。そのため、このライブラリは顧客注文情報を取得するための関数を提供し、必要に応じて問い合わせを容易にします。

機能説明
getCustomer()Get the working hours.Get customer information.
getOrderNumber()注文番号を取得します。
getInvoiceNumber()請求書番号を取得します。
getDeliveryDate()納入日を取得します。

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_DmpCIQ_Generic

EthercatDevice_DmpCIQ_Generic is an EtherCAT SubDevice class specifically developed by ICOP for Compound I/O EtherCAT SubDevice modules. It encompasses Digital I/O, Analog I/O, and RS232/RS485 functionalities.


2.3.5  EthercatDevice_DmpHID_Generic

EthercatDevice_DmpHID_Genericは、ICOPがQEC EtherCAT Subデバイス HIDモジュール向けに特別に開発したEtherCAT Subデバイスクラスです。RS232/RS485、4×4キーパッド、16×2 LCM、手動パルスジェネレータ(MPG)、ブザー機能を備えています。


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 &lt; master.getSlaveCount(); i++) {
    slave.attach(i, master); // Attach the slave to the master
    Serial.print(&quot;Slave &quot;);
    Serial.println(i);

    Serial.print(&quot;                Name: &quot;);
    Serial.println(slave.getDeviceName(name, 256));

    Serial.print(&quot;           Vendor ID: 0x&quot;);
    Serial.println(slave.getVendorID(), HEX);

    Serial.print(&quot;        Product Code: 0x&quot;);
    Serial.println(slave.getProductCode(), HEX);

    Serial.print(&quot;     Revision Number: 0x&quot;);
    Serial.println(slave.getRevisionNumber(), HEX);

    Serial.print(&quot;       Serial Number: 0x&quot;);
    Serial.println(slave.getSerialNumber(), HEX);

    Serial.print(&quot;       Alias Address: &quot;);
    Serial.println(slave.getAliasAddress());

    Serial.print(&quot;    Mailbox Protocol: 0x&quot;);
    Serial.println(slave.getMailboxProtocol(), HEX);

    Serial.print(&quot;         CoE Details: 0x&quot;);
    Serial.println(slave.getCoEDetails(), HEX);

    Serial.print(&quot;         FoE Details: 0x&quot;);
    Serial.println(slave.getFoEDetails(), HEX);

    Serial.print(&quot;         EoE Details: 0x&quot;);
    Serial.println(slave.getEoEDetails(), HEX);

    Serial.print(&quot;        SoE Channels: &quot;);
    Serial.println(slave.getSoEChannels());

    Serial.print(&quot;        DC Supported: &quot;);
    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:

}

付録

A.1 エラーリスト

ほとんどの関数では、返される値が0未満の場合、エラーであることを示し、その値はエラー・コードを表します。エラー・コードがある場合は、エラーの原因と修正処置を下記で確認できます。

Error List
定義コード
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アボート・コード

The CoE SDO Abort Codes defined in ETG.1000.6.

SDO Abort Code List:
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で定義されている基本データ型:

Data Type List:
インデックス (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ネットワーク情報

More about the ENI

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

上部へスクロール