序章

このブログ記事では、3つの異なる EtherCATマスター ソフトウェア スタックを見ていきます。各オプションとアプローチについて、長所と短所、それらの主な違い、および予想されるコストを 見ていきます。この比較には、acontisテクノロジーの独自ソリューションであるEC-Masterと   2つのオープンソース実装が含まれています。この2つのオープンソース実装は、IgH によって 配布される EtherLab ® の一部としてのIgH EtherCAT - Master ®と、主にrt-labsによって動作されるSimple Open EtherCAT Master ( SOEM )です。3つのスタック全てソースコードとして入手可能でさまざまなオペレーティングシステムとプロセッサアーキテクチャ用にコンパイルできます。より多くの努力をする人もいれば、少ない努力で出来る人もいます。 
何が得られるか見てみましょう…

ペーパーワーク

2004年から2005年頃の初期のEtherCATマスターSWスタックの最適な仕様は、EtherCAT マスターサンプル コード ( MSC ) でした。 EtherCAT通信仕様バージョン1.0 には正確な マスタースタック定義が欠けていたためです。今日でも、後続のETG.1000 EtherCAT仕様 およびその他のドキュメントには、これらの正確なマスタースタック定義が欠けています。      マスタースタックに関するより多くの情報を得るために、ほとんどの人はMSCを再設計して、EtherCATネットワークの運用に必要なステート マシン、アルゴリズム、およびプロトコルを    理解する必要がありました。

acontis EC-Master

acontis technologies GmbH は 2001年に設立され、2004年からEtherCAT Technology Group ( ETG ) のメンバーになっているETG の初期メンバーの1社です。 acontisは、Windows オペレーティングシステム (OS) でのみ利用可能なベッコフのMSCに基づいて、独自のEtherCATマスター ソフトウェア (最終的にEC-Masterと命名) の開発を開始しました。     エラー処理はMSCの大きな欠落部分だったので、acontis は多くのエラー処理ルーチンを    追加しました。MSCには、すべてのエラーケースをキャプチャするという目的もありませんでした。時の経過とともに、ケーブル冗長性、ホットコネクト、マスター冗長性の開発、およびその他の多くの便利な機能も追加されました。
EC-Masterは20年の開発期間を経て、多数のオペレーティングシステム、プロセッサアーキテクチャ、およびイーサネット コントローラに移植されました。その過程で、acontisはEtherCATテクノロジーとリアルタイム アプリケーションに関する深い知識に到達しました。EC-Masterの顧客は、困難な問題に対するトラブルシューティング、サポート、および新しいソリューション発見に関して、acontisチームの応答性と知識を高く評価していると表明しています。

アーキテクチャー

EC-Masterは主にC++で記述されていますが、C/C++、C#、および Python用のアプリケーションプログラミングインターフェイス (API) があります。スタックはサードパーティのライブラリに殆ど依存せず、オペレーティング システムとイーサネット コントローラへの2つの非常に薄いインターフェイスしかありません。これらの抽象化レイヤーにより、新しいオペレーティングシステム、プロセッサアーキテクチャ、またはネットワークアダプターのサポートの実装が容易になります。

Figure 1 EC-Master のアーキテクチャ

誰がソフトウェアを保守していますか?

この製品は主に acontis technologies の従業員とチーム メンバーによって保守されていますが、世界中の 500 を超える顧客が、バグや問題を報告し、特定の問題に対する解決策を提案することで、ソース コードの改善に貢献しています。

ライセンス条項

主に2つの異なるライセンスタイプがあります。ソフトウェアは、ライブラリまたはソース コードとして購入できます。ライセンスは、特定のプロジェクト、オペレーティング システム、およびプロセッサ アーキテクチャに関連付けられています。通常、顧客は完全な機能を備えた評価パッケージから始めて、ソフトウェア開発キット (SDK) を購入します。顧客が製品を開発し、マーケティングと販売に移行した後、ランタイム ライセンスを購入できるようになり、オプションのメンテナンス サブスクリプションを利用して拡張サポートと製品アップデートを取得できます。

IgH EtherCAT Master® (EtherLab®)

IgH Gesellschaft für Ingenieurleistungen mbH は1995年に設立され、そのルーツは油圧学にあります。何年にもわたって、彼らはさまざまな特別な機械的および電気機械的プロジェクトで仕事を続けてきました。また、IgH は 2004 年 3 月のプレスリリースで ETG メンバーとしてリストされています。EtherLab® パッケージの一部としての IgH EtherCAT Master® の最初のリリースは 2006 年 8 月にさかのぼり、すでに EtherCAT サービス上の CAN アプリケーション プロトコル (CoE ) およびメールボックスを利用した EtherCAT サービス (EoE) を介したイーサネット トンネリング。最後の tarball は 2013 年に 1.5.2 でリリースされました。それ以来、継続配信の利点のためのバージョンが更新されていません。

アーキテクチャー

幸いなことに、IgH EtherCAT Master® に関する十分なドキュメントがあります。また、アーキテクチャの説明もあります。IgH EtherCAT Master® は Linux カーネル スペース モジュールとして 実装され、Preempt RT などの Linux リアルタイム拡張をサポートします。ネットワーク アダプタは、デバイス モジュールによって抽象化されます。IgH EtherCAT Master® は Linux オペレーティング システムに関連付けられており、Cで記述されています。

Figure 2 IgH EtherCAT Master® アーキテクチャ

この EtherCATマスタースタックの特別な動作の 1 つは、非周期データが周期フレームにパックされることです。これは、特にフレームの完全な受信に時間がかかる場合に、特定のスレーブが対応するサイクル時間に何らかの影響を与えます。

誰がソフトウェアを保守していますか?

IgH の Florian Pose は、このスタックが初めてリリースされて以来、このスタックのほぼすべての変更 (>90%) を担当しています。Florian の努力と忍耐力は称賛に値するものであり、他の貢献者のコミットを損なうことはありません。

ライセンス条項

IgH から入手できるソース コード全体は、GNU General Public License バージョン 2 (GPLv2) の下でライセンスされています。そのため、このソフトウェアのユーザーは派生品のソースコードも 配布する必要がある場合があることを考慮する必要があります。

シンプルオープン EtherCAT マスター (SOEM)

Flanders Mechatronics Technology Center (FMTC) は、2006 年にEtherCATマスター実装 (以前は EtherCAT マスター ライブラリ (EML) として知られていた)を公開することを決定しま した。インターネット上の特定のページによると、SOEMはFMTCのこのEtherCATマスターライブラリにそのルーツがあります。これは、 eCosオペレーティング システム用に作成され、テストされています。一部のソース ファイルでは、Special Machinefabriek Ketels vofの Arthur Ketels が作成者として名前が付けられています。また、TU/e Technische Universiteit Eindhovenは、ライセンスファイルに記載されています。

アーキテクチャー

SOEMは Cで記述されており、箱から出してすぐにユーザー空間アプリケーションとして実行されます。OS およびイーサネット アダプタは、2 つのインターフェイスによって抽象化されます。 これらのインターフェイスは、OS とネットワーク アダプター インターフェイスに依存し、約700 ~ 1000 行のコードで実装できます。多数の異なるオペレーティング システムおよびネットワーク  アダプタへの適応が利用可能です (サポートされているオペレーティング システム、CPU アーキテクチャ、およびイーサネット インターフェイスも参照してください)。

Figure 3 SOEM アーキテクチャー

誰がソフトウェアを保守していますか?

この実装は、主にrt-labsと Arthur Ketels の従業員によってサポートおよび維持されている ようです。最後の公式リリースは 2019 年7月 (v1.4.0) にさかのぼります。

ライセンス条項

IgH EtherCAT Master® と同様に、SOEM も GPLv2 の下でライセンスされていますが、この派生品をオープン ソース コミュニティと共有する必要なく、追加のアプリケーションコードをコンパイルすることが許可されているという特別な例外があります。rt-labsは、製品/プロジェクトごとに有料の商用ライセンスも提供しています。無料版と商用版の違いは明らかではありませんが、有料の商用ライセンスにはサポートとメンテナンスが含まれているようです。

サポートされているオペレーティング システム、CPU アーキテクチャ、 およびイーサネットインターフェイス

次の表では、これらの EtherCAT ソフトウェア スタックでサポートされているオペレーティングシステム、CPU アーキテクチャ、イーサネット インターフェイスの組み合わせを比較しています。オペレーティング システムには、リアルタイム オペレーティング システム (RTOS) と非RTOS があります。CPUアーキテクチャには、ビッグエンディアンとリトルエンディアンに加えて、32ビットと 64 ビットが含まれます。

3 つのスタックはすべてソースコードで利用できるため、原則としてあらゆるOS、アーキテクチャ、およびネットワーク ハードウェアに多かれ少なかれ労力をかけて適応させることができます。したがって、現在すぐに使用できるものにのみ焦点を当てます。acontis はすでにこの情報を提供しており、この比較は顧客と可能性のために行っているため、EC-Master のステートメントのみを保証します。さらに、すべてのOS、アーキテクチャ、およびネットワーク アダプタのすべてのスタックをコンパイルできなかったため、ドキュメントに記載されている内容とソースコードに表示されている内容に依存しています。

x 完全なサポート
x1 誰かがプロジェクト/いくつかのプロジェクトでそれを使用または使用しようとした
x2 64ビット Windows 上の 32 ビット アプリケーションとして
x3 コードが存在する

表 1 サポートされている OS、CPU アーキテクチャ、およびネットワーク アダプタ

EC-Master は、プロセッサ アーキテクチャ、OS、およびネットワーク アダプタの 147 を超える さまざまな組み合わせをサポートします。IgH EtherCAT Master® 21 および SOEM 7. Linux用の 34 のソリューションが存在します (EC-Master による 26 および8オープン ソース)。注意すべき重要なことは、EC-Master で使用できる組み合わせの数であり、リストはまだ不完全です。完全なリストは、スタックのマニュアル ページにあります。また、SOEM は、Erika Enterprise RTOS をサポートする唯一のスタックであり、ロイヤリティフリーの車載用 OSEK/VDX 認定ハード RTOS です。

サポートされている EtherCAT マスター機能

サポートされている OS、アーキテクチャ、およびイーサネット アダプタを強調したので、マスター クラス A の EtherCAT マスター クラス ETG.1500 ドキュメントに従って、サポートされている機能も確認してみましょう。重要な機能には、EtherCAT ネットワーク情報ファイル (ENI) をインポートする可能性が含まれます ( EtherCAT XML マスター構成)、ドキュメント、エラー処理 およびサポート。

Feature name

Short description

ETG.1500

EC-Master

SOEM

IgH EtherCAT Master®

Basic Features

Service Commands

Support of all commands

shall if ENI import support

2

IRQ field in datagram

Use IRQ information from Slave in datagram header

should

Slaves with Device Emulation

Support Slaves with and without application controller

shall

EtherCAT State Machine

Support of ESM special behavior

shall

Error Handling

Checking of network or slave errors, e.g. Working Counter

shall

3

3

VLAN

Support VLAN Tagging

may

EtherCAT Frame Types

Support EtherCAT Frames

shall

UDP Frame Types

Support UDP Frames

may

Process Data Exchange

Cyclic PDO

Cyclic process data exchange

shall

Multiple Tasks

Different cycle tasks

Multiple update rates for PDO

may

1

Frame repetition

Send cyclic frames multiple times to increase immunity

may

Network Configuration

Online scanning

Network configuration functionality included in EtherCAT Master

at least one

of them

Reading ENI

Network Configuration taken from ENI file

at least one

of them

Compare Network configuration

Compare configured and existing network configuration during boot-up

shall

Explicit Device identification

Identification used for Hot Connect and prevention against cable swapping

should

Station Alias Addressing

Support configured station alias in slave,

i.e. enable 2nd Address and use it

may

Access to EEPROM

Support routines to access EEPROM via ESC register

read shall

write may

Mailbox Support

Support Mailbox

Main functionality for mailbox transfer

shall

3

Mailbox Resilient Layer

Support underlying resilient layer

shall

Multiple Mailbox channels

 

may

Mailbox polling

Polling Mailbox state in slaves

 

shall

3

CAN application layer over EtherCAT (CoE)

SDO Up/Download

Normal and expedited transfer

shall

Segmented Transfer

Segmented transfer

shall

4

Complete Access

Transfer the entire object (with all sub-indices) at once

shall

4

SDO Info service

Services to read object dictionary

shall

Emergency Message

Receive Emergency messages

shall

EoE

EoE protocol

Services for tunneling Ethernet frames. includes all specified EoE services

shall

Virtual Switch

Virtual switch functionality

shall

EoE Endpoint to Operation Systems

Interface to the Operation System on top of the EoE layer

should

FoE

FoE Protocol

Support FoE Protocol

shall

Firmware Up-/Download

Password, FileName should be given by the application

shall

Boot State

Support Boot-State for Firmware Up/Download

shall

SoE

SoE Services

Support SoE Services

shall

AoE

AoE Protocol

Support AoE Protocol

should

VoE

VoE Protocol

External Connectivity supported

may

Synchronization with Distributed Clock (DC)

DC support

Support of Distributed Clock

shall

Continuous Propagation Delay compensation

Continuous Calculation of the propagation delay

should

5

Sync window monitoring

Continuous monitoring of the Synchronization difference in the slaves

should

5

Slave-to-Slave Communication

via Master

Information is given in ENI file or can be part of any other network configuration

Copying of the data can be handled by master stack or master’s application

shall

Master information

Master Object Dictionary

Support of Master Object Dictionary
(ETG.5001 MDP sub profile 1100)

should

1 IgH EtherCAT Master® 内で Process Data Domain と呼ばれる
2 APRW、FPRW、BRW はサポートされない
3基本サポート
4ダウンロードのみサポートされる
5実装方法の例が利用可能

表 2 EtherCAT マスター クラス (ETG.1500) の機能

ソースコード自体のほぼすべての情報を検索する必要があったため、上記の表に 情報を入力することは、オープン ソース ソリューションにとって困難でした。これは、どの機能がサポートされているかに関するドキュメントが通常利用できないためです。IgH のドキュメントは SOEM よりも完全ですが、acontis のドキュメントが最も優れていることが証明されています。

EtherCAT データグラムの IRQ フィールドがチェックされていない場合、トポロジと  スレーブ状態の変化はすぐには検出されません。アプリケーションにツールの変更 などが含まれている場合、これが問題になる可能性があります。

多くのスレーブ メーカーは、必須の CoE 初期化コマンド (「InitCmds」) を EtherCAT スレーブ情報 (ESI) (EtherCAT デバイス記述) ファイルで定義しています。この情報は ESI ファイルでのみ利用可能であり、EEPROM には通常デフォルト値しか含まれていないため、スレーブの EEPROM から読み取ることはできません。ESI ファイルを ENI に処理してスタックで読み込むことができない場合、これらの InitCmds は、これらのスレーブが動作状態 (OP) に到達するように手動で実装する必要があります → そのスレーブのすべてのリビジョンの状態変更ごとに。これは面倒な場合があります。詳細については、付録を参照してください。

2つのオープン ソース スタックには、ENI インポート機能もスレーブ間通信機能も ないため、Safety over EtherCAT (FSoE = FailSafe over EtherCAT) もサポートしていま せん。これらがプロジェクトの要件または潜在的に将来の要件である場合は、    オープンソース スタックの使用を再検討する必要があります。

Problem

Short description

EC-Master

SOEM

IgH EtherCAT Master®

During network startup (typically unrecoverable error)

Master Configuration Missing

 

1

1

Bus mismatch - Line crossed

Support Slaves with and without application controller

1

Bus mismatch - Missing Slaves

Swap cables between IN and OUT port

1

1

Bus mismatch – Slave Swap

Not all configured slaves (as defined in the configuration file) could be found when scanning the actual connected bus

1

1

Cabling – Controller not connected to the network

The number of slaves is as configured, but the order is not the same

4

1

InitCmd error

Remove the bus cable from the Controller

1

2

Distributed Clocks synchronization issues

 

2

Permanent errors while network is operational

Slave switches to a lower state (SafeOp, PreOp, Init)

Slave will typically create an AL-Status IRQ and AL status error code

Master Controller - Cable disconnected

Disconnect the controller from the bus during operation

Master Controller - Cable reconnected

Reconnect the controller to the bus during operation

Network - Cable disconnected

Other cable disconnected or slave without power supply

Network - Cable reconnected

Plug-in cable or power-up slave

A Slave is faulty in a way, that no frame is responded to the master at all

ecatRescueScan(): Scans all connected slaves including closing ports

Intermittent errors/warnings

Frame loss

 

3

Working Counter Error (WKC) in cyclic data

 

5

Huge jitter for TX time

 

3

3

DC: DCM out-of-sync notification

 

2

1「そのまま」ではなく、手動でプログラムする必要がある
2 init コマンドはサポートされていない
3設計上検出が非常に困難
4スレーブが見つからない
5スレーブ X が失われた

表 3 エラー処理

これらすべてのテスト ケースと結果に関する詳細なレポートは、要求に応じて取得できます。表が示すように、IgH のエラー処理は SOEM よりわずかに優れています。 オープンソース スタックにエラー処理が欠けている最大の領域は、ネットワークの起動時です。

結論

プラットフォーム (CPU、OS、ネットワーク アダプタなど) やその他の要件に応じて、 多くの優れたソリューションを利用できます。非常に静的で、小規模で、自明なネットワークを使用している場合は、オープンソースの実装が適している可能性があります。ただし、EtherCAT ネットワーク構成が変更されやすい、および/または非常に複雑な場合 (たとえば、ドライブ、モジュラー デバイス プロファイル (MDP) を含む)、 またはデフォルト構成 (PDO など) を調整する必要がある異なる HW/SW リビジョンの有無にかかわらずスレーブマッピング、Init コマンド) の場合、acontis EC-Masterのような ENI ファイルをインポートできるスタックを選択する必要があります。

付録: Yaskawa シグマ ドライブを初期化するためのコード スニペット

オープンソース

以下に、Yaskawa シグマ ドライブの PDO 構成を初期化するための SOEM テスト コードを示します。この場合、PreOp から SafeOP への状態変化について書かれています。このような PDO 構成をスレーブに書き込むことは、IgH ソリューションと似ています。すべてのインデックス、サブインデックス、および値を評価、コピー、および/または計算し、ハードコーディングする必要があります。単一の InitCmds のコメントなどのメタ情報がありません。特に設定ミスやエラーが発生した場合、何が起こっているのかを理解するのははるかに困難です。ESI および ENI ファイルを操作する方が明らかに便利です。EC-Masterのお客様はそうおっしゃっています。次のリストの下も参照してください。

static int YaskawaSigmaDrivePDOConfiguration (uint16 slave)
{
    int retval = 0;
    uint8 ui8Val = 0;
    uint16 ui16Val = 0;
    uint32 ui32Val = 0;
    ui8Val = 0;
    retval += ec_SDOwrite(slave, 0x1c12, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    retval += ec_SDOwrite(slave, 0x1c13, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    ui8Val = 0;
    retval += ec_SDOwrite(slave, 0x1a00, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    ui32Val = 0x60410010;
    retval += ec_SDOwrite(slave, 0x1a00, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1617166368;
    retval += ec_SDOwrite(slave, 0x1a00, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1618411536;
    retval += ec_SDOwrite(slave, 0x1a00, 0x3, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1626603552;
    retval += ec_SDOwrite(slave, 0x1a00, 0x4, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1616969736;
    retval += ec_SDOwrite(slave, 0x1a00, 0x5, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 8;
    retval += ec_SDOwrite(slave, 0x1a00, 0x6, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1622736312;
    retval += ec_SDOwrite(slave, 0x1a00, 0x7, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1622802464;
    retval += ec_SDOwrite(slave, 0x1a00, 0x8, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui8Val = 8;
    retval += ec_SDOwrite(slave, 0x1a00, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    ui8Val = 0;
    retval += ec_SDOwrite(slave, 0x1a01, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    ui32Val = 1614872592;
    retval += ec_SDOwrite(slave, 0x1a01, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1617166368;
    retval += ec_SDOwrite(slave, 0x1a01, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui8Val = 2;
    retval += ec_SDOwrite(slave, 0x1a01, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    ui8Val = 0;
    retval += ec_SDOwrite(slave, 0x1a02, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    ui32Val = 1614872592;
    retval += ec_SDOwrite(slave, 0x1a02, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1617166368;
    retval += ec_SDOwrite(slave, 0x1a02, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui8Val = 2;
    retval += ec_SDOwrite(slave, 0x1a02, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    ui8Val = 0;
    retval += ec_SDOwrite(slave, 0x1a03, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    ui32Val = 1614872592;
    retval += ec_SDOwrite(slave, 0x1a03, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1617166368;
    retval += ec_SDOwrite(slave, 0x1a03, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1618411536;
    retval += ec_SDOwrite(slave, 0x1a03, 0x3, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui8Val = 3;
    retval += ec_SDOwrite(slave, 0x1a03, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    ui8Val = 0;
    retval += ec_SDOwrite(slave, 0x1600, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    ui32Val = 1614804056;
    retval += ec_SDOwrite(slave, 0x1600, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1618608160;
    retval += ec_SDOwrite(slave, 0x1600, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1627324448;
    retval += ec_SDOwrite(slave, 0x1600, 0x3, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1618018320;
    retval += ec_SDOwrite(slave, 0x1600, 0x4, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1618083856;
    retval += ec_SDOwrite(slave, 0x1600, 0x5, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1616904200;
    retval += ec_SDOwrite(slave, 0x1600, 0x6, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 8;
    retval += ec_SDOwrite(slave, 0x1600, 0x7, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1622671376;
    retval += ec_SDOwrite(slave, 0x1600, 0x8, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui8Val = 8;
    retval += ec_SDOwrite(slave, 0x1600, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    ui8Val = 0;
    retval += ec_SDOwrite(slave, 0x1601, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    ui32Val = 1614807056;
    retval += ec_SDOwrite(slave, 0x1601, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1618608160;
    retval += ec_SDOwrite(slave, 0x1601, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui8Val = 2;
    retval += ec_SDOwrite(slave, 0x1601, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    ui8Val = 0;
    retval += ec_SDOwrite(slave, 0x1602, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    ui32Val = 1614807056;
    retval += ec_SDOwrite(slave, 0x1602, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1627324448;
    retval += ec_SDOwrite(slave, 0x1602, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui8Val = 2;
    retval += ec_SDOwrite(slave, 0x1602, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    ui8Val = 0;
    retval += ec_SDOwrite(slave, 0x1603, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    ui32Val = 1614807056;
    retval += ec_SDOwrite(slave, 0x1603, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui32Val = 1618018320;
    retval += ec_SDOwrite(slave, 0x1603, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE);
    ui8Val = 2;
    retval += ec_SDOwrite(slave, 0x1603, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    ui16Val = 5633;
    retval += ec_SDOwrite(slave, 0x1c12, 0x1, FALSE, sizeof(ui16Val), &ui16Val, EC_TIMEOUTSAFE);
    ui8Val = 1;
    retval += ec_SDOwrite(slave, 0x1c12, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    ui16Val = 6657;
    retval += ec_SDOwrite(slave, 0x1c13, 0x1, FALSE, sizeof(ui16Val), &ui16Val, EC_TIMEOUTSAFE);
    ui8Val = 1;
    retval += ec_SDOwrite(slave, 0x1c13, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    ui8Val = 8;
    retval += ec_SDOwrite(slave, 0x6060, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE);
    while(EcatError) printf("%s", ec_elist2string());

    printf("Servo slave %d set, retval = %d\n", slave, retval);
    return 1;
}

スニペット 1 テスト コード Yaskawa シグマ ドライブの初期化

EC-Master

前に説明したように、EtherCAT スレーブ メーカーは通常、デバイスと一緒に ESI   ファイルを提供します。スレーブのすべての ESI ファイルのコレクションは、EtherCAT ネットワークを記述します。通常、このファイルコレクションは、ほとんどがグラフィカル ツール ( EC-Engineerなど) を使用して処理され、ENIに変換されます。このENIにはネットワークの説明全体が含まれています。他の多くの情報に加えて、すべてのリビジョンのすべてのスレーブの状態変化ごとにコマンド (InitCmds) が実行されます。EC-Masterは、このすべての情報を読み取ります。スレーブ状態の変更がEC-Masterに命令されるたびにスタックから、およびスタックからスレーブへ、これらの状態が  変更され、接続された InitCmd もスレーブに送信/コマンドされます。異なるリビジョンのスレーブがあり、特定のルール セットまたは属性が関連付けられた異なる初期化シーケンスで PDO 構成を変更する必要があるとします。より高いレベルでこれを行うと、時間とお金の両方を節約できます。EC-Masterを初期化するには、主に以下に示す 4つの太字の機能が必要です。このスニペットは、マルチスレッドEC マスター全体と、エラー処理、ロギングなどを含む接続されたネットワークを初期化します...

/* initialize EtherCAT master */
EC_T_INIT_MASTER_PARMS oInitParms;
OsMemset(&oInitParms, 0, sizeof(EC_T_INIT_MASTER_PARMS));
oInitParms.dwSignature                   = ATECAT_SIGNATURE;
oInitParms.dwSize                        = sizeof(EC_T_INIT_MASTER_PARMS);
oInitParms.pLinkParms                    = pAppParms->apLinkParms[0];
oInitParms.dwBusCycleTimeUsec            = pAppParms->dwBusCycleTimeUsec;
oInitParms.dwMaxAcycFramesQueued         = MASTER_CFG_MAX_ACYC_FRAMES_QUEUED;
OsMemcpy(&oInitParms.LogParms, &pAppContext->LogParms, sizeof(EC_T_LOG_PARMS));
oInitParms.LogParms.dwLogLevel = pAppParms->dwMasterLogLevel;
CHECK_MASTER_CALL( ecatInitMaster(&oInitParms), "Cannot initialize EC-Master: %s (0x%lx))\n" );

/* create cyclic task to trigger jobs */
CREATE_CYCLIC_TASK_TO_TRIGGER_JOBS

/* configure master */
CHECK_MASTER_CALL( ecatConfigureMaster(pAppParms->eCnfType,
                                       "YaskawaSigmaDrive.xml",
                                       (EC_T_DWORD)OsStrlen("YaskawaSigmaDrive.xml")),
                   "Cannot configure EC-Master: %s (0x%lx))\n" );

/* register client */
CHECK_MASTER_CALL( ecatRegisterClient(EcMasterNotifyCallback, pAppContext, &RegisterClientResults), "ERROR: Cannot register client: %s (0x%lx))\n" );
pAppContext->pNotificationHandler->SetClientID(RegisterClientResults.dwClntId);

/* state transition to OP */
CHECK_STATE_TRANSITION( ecatSetMasterState(ETHERCAT_STATE_CHANGE_TIMEOUT, eEcatState_INIT),   "INIT" );
CHECK_STATE_TRANSITION( ecatSetMasterState(ETHERCAT_STATE_CHANGE_TIMEOUT, eEcatState_PREOP),  "PREOP" );
CHECK_STATE_TRANSITION( ecatSetMasterState(ETHERCAT_STATE_CHANGE_TIMEOUT, eEcatState_SAFEOP), "SAFEOP" );
CHECK_STATE_TRANSITION( ecatSetMasterState(ETHERCAT_STATE_CHANGE_TIMEOUT, eEcatState_OP),     "OP" );

スニペット 2 EC マスターの初期化