acontis EC-Master vs オープンソース (IgH EtherCAT-Master® (EtherLab®) および Simple Open EtherCAT Master (SOEM))
序章
このブログ記事では、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つの非常に薄いインターフェイスしかありません。これらの抽象化レイヤーにより、新しいオペレーティングシステム、プロセッサアーキテクチャ、またはネットワークアダプターのサポートの実装が容易になります。
誰がソフトウェアを保守していますか?
この製品は主に 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 アーキテクチャ、およびイーサネット インターフェイスも参照してください)。
誰がソフトウェアを保守していますか?
この実装は、主に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 |
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 が失われた
これらすべてのテスト ケースと結果に関する詳細なレポートは、要求に応じて取得できます。表が示すように、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" );