acontis EC-Master vs Open Source (IgH EtherCAT-Master® (EtherLab®) und Simple Open EtherCAT Master (SOEM))
Einleitung
In diesem Blogartikel betrachten wir drei verschiedene EtherCAT Master Software Stacks. Für jede Option und Lösung schauen wir in die Vor- und Nachteile, Hauptunterschiede und die zu erwartenden Kosten. Der Vergleich beinhaltet die acontis technologies firmeneigene Lösung der EC-Master und zwei Open Source Implementierungen. Die zwei Open Source Implementierungen in diesem Artikel sind der IgH EtherCAT-Master® als Teil des EtherLab® verteilt durch die IgH und der Simple Open EtherCAT Master (SOEM) hauptsächlich gepflegt durch die rt-labs. Alle drei Stacks sind als Quellcode verfügbar und können für verschiedene Betriebssysteme und Prozessorarchitekturen kompiliert werden. Manche mit mehr, manche mit weniger Aufwand. Mal sehen was wir bekommen…
Papierarbeit
Die beste Spezifikation für einen EtherCAT Master Stack in den frühen Tagen um 2004 und 2005 war der EtherCAT Master Sample Code (MSC). Da die EtherCAT Communication Specification Version 1.0 präzise Definitionen für eine Master Stack vermisste. Sogar heute noch, vermissen die nachfolgenden ETG.1000 EtherCAT Spezifikationen und andere Dokumente diese präzisen Master Stack Definitionen. Um mehr Informationen über den Master Stack zu erhalten musste/muss nahezu jeder den MSC durcharbeiten um die Statusmaschinen, Algorithmen und Protokolle, die benötigt werden ein EtherCAT Netzwerk zu betreiben, zu verstehen.
acontis EC-Master
Die acontis technologies GmbH wurde 2001 gegründet und ist seit 2004 Mitglied der EtherCAT Technology Group (ETG) und daher eines der ersten Mitglieder der ETG. acontis startete die Entwicklung ihrer eigenen EtherCAT Master Software (schließlich EC-Master) auf Basis des MSC von Beckhoff da dieser nur für das Betriebssystem Windows verfügbar war und ist. Die acontis fügt viele Fehlerbehandlungsroutinen hinzu, da diese größtenteils im MSC fehlten. Der MSC hatte jedoch auch nicht den Anspruch jeden Fehlerfall abzudecken. Über die Zeit wurde die Entwicklung der Cable Redundancy, Hot Connect und Master Redundancy, sowie viele weitere nützliche Funktionen hinzugefügt.
Nach 20 Jahren Entwicklung, wurde der EC-Master für zahlreiche Betriebssysteme, Prozessorarchitekturen und Netzwerkadapter portiert. Auf diesem Weg erlangte die acontis fundierte Kenntnis über die EtherCAT Technologie, Echtzeitanwendungen und -systeme. Kunden des EC-Master schätzen die Reaktionszeit und das Fachwissen des acontis-Teams, speziell wenn es zur Fehlersuche, Unterstützung oder zur Findung neuer Lösungsansätze für herausfordernde Probleme kommt.
Architektur
Der EC-Master ist hauptsächlich in C++ geschrieben, zusätzlich gibt es Programmierschnittstellen (APIs) für C/C++, C# und Python. Der Stack hat nahezu keine Abhängigkeiten zu Drittanbieterbibliotheken und nur zwei sehr dünne Schnittstellen zum Betriebssystem und dem Netzwerkadapter. Diese sehr dünnen Abstraktionsschichten machen es so einfach die Unterstützung neuer Betriebssysteme, Prozessorarchitekturen oder Netzwerkadapter zu implementieren.
Abbildung 1 EC-Master Architektur
Wer pflegt die Software?
Das Produkt wird hauptsächlich von den Mitarbeitern und Teammitgliedern der acontis technologies gewartet, aber auch deren 500 weltweite Kunden tragen zur Verbesserung des Quellcodes bei, indem Sie Fehler und Schwächen melden und Lösungen für bestimmte Probleme vorschlagen.
Lizenzbestimmungen
Es gibt hauptsächlich zwei verschiedene Lizenztypen: Die Software kann als Bibliothek oder als Quellcode erworben werden. Die Lizenz ist an ein spezifisches Projekt, Betriebssystem und Prozessorarchitektur gebunden. Kunden starten normalerweise mit einem vollumfänglichen Evaluierungspaket und kaufen ein Software Development Kit (SDK) nachdem sie Ihr Produkt entwickelt und in die Vermarktung und Verkauf übergehen. Laufzeitlizenzen und optionale Wartungsverträge für erweiterte Unterstützung und Produktaktualisierungen sind verfügbar.
IgH EtherCAT Master® (EtherLab®)
Die IgH Gesellschaft für Ingenieurleistungen mbH wurde 1995 gegründet und hat ihre Wurzeln in der Hydraulik. Über die Jahre arbeiteten sie an vielen speziellen mechanischen und elektromechanischen Projekten. Laut einer Pressemitteilung vom März 2004 ist auch die IgH seit damals als ein ETG Mitglied gelistet. Die erste Veröffentlichung des IgH EtherCAT Master® als Teil des EtherLab® Pakets geht auf den August 2006 zurück und unterstützte schon damals das CAN application protocol over EtherCAT services (CoE) und Ethernet tunneled over EtherCAT services (EoE) mit der Hilfe von "Mailboxen". Der letzte "tarball" wurde mit der Version 1.5.2 2013 veröffentlicht, seitdem wurde die Version nicht erhöht zum Vorteil einer "continues delivery".
Architektur
Zum Glück gibt es eine substantielle Dokumentation für den IgH EtherCAT Master®. Sowie eine Beschreibung der Architektur. Der IgH EtherCAT Master® ist als ein Linux Kernel Space Modul implementiert und unterstützt Linux Echtzeiterweiterungen wie Preempt RT. Netzwerkadapter sind als Gerätemodul abstrahiert. Der IgH EtherCAT Master® ist dadurch an das Linux Betriebssystem gebunden. Geschrieben ist er in C.
Abbildung 2 IgH EtherCAT Master® Architektur
Ein spezielles Verhalten dieses EtherCAT Master Stack, welches uns aufgefallen ist, ist dass azyklische Daten in zyklischen Nachrichten verschickt werden. Dies hat einen gewissen Effekt auf die Zykluszeit wie sie EtherCAT Slaves wahrnehmen, speziell wenn die Zeit nach Empfang des kompletten Rahmens genommen wird.
Wer pflegt die Software?
Florian Pose von der IgH ist nahezu für alle Änderungen (>90%) in diesem Stack verantwortlich, seit dem er das erste Mal veröffentlicht wurde. Florian's Arbeitseinsatz, Ausdauer und Beharrlichkeit sind bewundernswert, ohne dabei die Leistungen der anderen Beitragenden zu untergraben.
Lizenzbestimmungen
Der komplette Quellcode der IgH ist lizenziert unter der GNU General Public License version 2 (GPLv2). Dabei zu beachten ist, dass Benutzer dieser Software jeglichen Quellcode abgeleiteter Arbeiten auch veröffentlichen muss.
Simple Open EtherCAT Master (SOEM)
Das Flanders Mechatronics Technology Centre (FMTC) entschied sich 2006 ihre EtherCAT Master Implementierung (zuvor als EtherCAT master library (EML) bekannt) als Open Source zu veröffentlichen. Bezieht man sich auf bestimmte Internetseiten, hat SOEM seine Wurzeln in dieser EtherCAT Master Bibliothek von FMTC. Es wurde für das Betriebssystem eCos geschrieben und darauf getestet. Einige der Quellcode Dateien betiteln Arthur Ketels der Speciaal Machinefabriek Ketels v.o.f. als ihren Author. Auch die TU/e Technische Universiteit Eindhoven ist in der Lizenzdatei erwähnt.
Architektur
SOEM ist in C geschrieben und ist direkt als "User Space" Anwendung ausführbar. Betriebssystem und Ethernetadapter sind durch zwei Schnittstellen abstrahiert. Diese Schnittstellen sind vom Betriebssystem und dem Netzwerkadapter abhängig und können mit rund 700-1000 Zeilen Code implementiert werden. Adaptionen zu einigen verschiedenen Betriebssystemen und Netzwerkadapter sind verfügbar (siehe Unterstütze Betriebssysteme, CPU Architekturen und Ethernet-Schnittstellen).
Wer pflegt die Software?
Diese Implementierung scheint von den Mitarbeitern der rt-labs und Arthur Ketels gepflegt zu werden. Die letzte offizielle Veröffentlichung ist auf den Juli 2019 (v1.4.0) datiert.
Lizenzbestimmungen
Ähnlich zum IgH EtherCAT Master®, ist SOEM auch unter der GPLv2 lizensiert, jedoch mit einer speziellen Ausnahme, welche es erlaubt ihn mit weiterem Anwendungscode zu kompilieren ohne diesen mit der Open Source Gemeinschaft teilen zu müssen. rt-labs bietet unter anderem eine kommerzielle Lizenz per Product/Project an. Es ist jedoch nicht ersichtlich was der Unterschied zwischen der frei zugänglichen und der kommerziellen Version ist. Wahrscheinlich ist in der bezahlbaren kommerziellen Version Unterstützung und Wartung enthalten.
Unterstützte Betriebssysteme, CPU-Architekturen und Ethernet-Schnittstellen
In der folgenden Tabelle vergleichen wir welche Kombinationen an Betriebssystemen, Prozessorarchitekturen und Ethernetadaptern durch diese EtherCAT Software Stacks unterstützt werden. Unter den Betriebssystemen befinden sich Echtzeitbetriebssysteme (RTOS) und Nicht-RTOS. Die Prozessorarchitekturen beinhalten 32 und 64-bit mit big und little-endian.
Da alle drei Stacks als Quellcode verfügbar sind, ist es prinzipiell möglich diese mit mehr oder weniger Aufwand an ein Betriebssystem, Prozessorarchitektur oder Netzwerkhardware anzupassen. Aus diesem Grund fokussieren wir uns darauf was direkt von der Stange erhältlich ist. Da die acontis technologies diese Informationen bereits veröffentlicht und wir diesen Vergleich für unsere Kunden und Potenzielle machen, garantieren wir nur die Angaben zum EC-Master. Desweitern konnten wir nicht jeden Stack für jedes Betriebssystem, Prozessorarchitektur und Netzwerkadapter kompilieren, deshalb verlassen wir uns was wir in der Dokumentation und Quellcode zum jeweilen Open Source Stack sehen.
x volle Unterstützung
x1 jemand nutzte oder versuchte es in einem Projekt oder Projekten zu nutzen
x2 als 32-bit Anwendung auf einem 64-bit Windows
x3 es ist Code vorhanden
Tabelle 1 Unterstützte OS, CPU Architekturen und Netzwerkadapter
Der EC-Master unterstützt mehr als 147 dverschiedene Kombinationen an Prozessorarchitekturen, Betriebssystemen und Netzwerkadaptern. IgH EtherCAT Master® 21 und SOEM 7. 34 Lösungen für Linux existieren (26 durch den EC-Master und 8 durch Open Source). Beachtlich ist die Zahl an Kombinationen beim EC-Master und die Liste ist noch immer unvollständig. Eine vollständige Liste kann auf der Benutzerhandbuchseite zum Stack gefunden werden. Weiter zu beachten ist, SOEM ist der einzige Stack welcher das Erika Enterprise RTOS unterstützt, ein gebührenfreies automotive OSEK/VDX zertifiziertes hartes RTOS.
Unterstützte EtherCAT Master Features
Nachdem wir die unterstützten Betriebssysteme, Prozessorarchitekturen und Ethernetadapter betrachtet haben, überprüfen wir die unterstützten Merkmale wie im EtherCAT Master Classes ETG.1500 Dokument für einen Class A Master beschrieben. Wichtige Eigenschaften beinhalten die Möglichkeit EtherCAT Network Information files (ENI) (EtherCAT XML Master Configuration) einzulesen, Dokumentation, Fehlerbehandlung und Support.
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 ruft Process Data Domain innerhalb des IgH EtherCAT Master®
2 APRW, FPRW, BRW nicht unterstützt
3 grundsätzliche Unterstützung
4 nur Download unterstützt
5 Beispiele wie zu implementieren vorhanden
Tabelle 2 EtherCAT Master classes (ETG.1500) features
Die vorherige Tabelle für die Open Source Lösungen auszufüllen war herausfordernd, da wir fast alle Informationen im Quellcode selbst suchen mussten. Dies liegt daran dass normalerweise keine Dokumentation darüber verfügbar ist, welche Funktionen unterstütze Funktionen sind. Die IgH Dokumentation ist vollständiger als die des SOEM, jedenfalls stellte sich die acontis Dokumentation als die Beste heraus.
Wenn das IRQ Feld im EtherCAT Datagram nicht überprüft wird, werden Slave Statusübergänge nicht sofort detektiert. Falls die Anwendung z.B. Werkzeugwechsel beinhaltet sollte dies beachtet werden.
Viele Slave-Hersteller definieren erforderliche CoE Init Commands (“InitCmds”) in der EtherCAT Slave Information (ESI) (EtherCAT Devices Description) Datei. Diese Information ist nur in der ESI Datei verfügbar und kann nicht aus dem EEPROM des Slaves ausgelesen werden, da das EEPROM normalerweise nur deren Standardwerte enthält. Wenn ESI Dateien nicht in eine ENI Datei prozessiert werden können und nicht vom Stack eingelesen werden können, müssen diese InitCmds manuell implementiert werden um den Operational Zustand (OP) zu erreichen → für jeden Zustandswechsel für jede Revision dieses Slaves. Dies kann sehr anstrengend werden. Bitte lesen Sie den Anhang für weitere Details.
Soweit wir das sagen können haben die zwei Open Source Stacks keine ENI-Unterstützung noch Slave-to-Slave Kommunikationseinrichtungen, was zur Folge hat das sie kein Safety over EtherCAT (FSoE = FailSafe over EtherCAT) unterstützen. Sollten dies Anforderungen oder potentielle Anforderungen in Ihrem Projekt sein, sollten Sie die Verwendung dieser Open Source Stacks überdenken.
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 Nicht “out of the box”, muss manuell programmiert werden
2 Keine InitCmds unterstützt
3 Per Design sehr schwierig zu entdecken
4 Keine Slaves gefunden
5 Slave X verloren
Ein detaillierter Bericht über diese Testfälle und deren Resultate kann auf Anfrage bezogen werden. Wie die Tabelle zeigt ist die Fehlerbehandlung im IgH Stack etwas besser als im SOEM. Der größte Bereich in dem die Open Source Stacks Schwierigkeiten in der Fehlerbehandlung haben ist während des Aufstartens des Netzwerks.
Fazit
Abhängig von Ihrer Platform (CPU, OS, Netzwerkadapter, usw.) und anderen Anforderungen sind viele gute Lösungen verfügbar. Sofern sie ein sehr statisches, kleines und triviales Netzwerk haben, könnten die Open Source Implementierungen eine gute Wahl sein. Ist jedoch Ihr EtherCAT Netzwerk anfällig für Änderungen und/oder sehr komplex (beinhaltet z.B. Antriebe, Modular Device Profiles (MDP)) oder Slaves in gleichen oder unterschiedlichen HW/SW Revisionen in denen Sie die Standardkonfiguration (z.B. PDO mapping, Init commands) anpassen müssen, dann sollten Sie einen Stack wählen der zumindest ENI Dateien importieren kann z.B. der acontis EC-Master.
Anhang: Code Snippets um einen Yaskawa Sigma Drive zu intialisieren
Open Source
Untenstehend finden Sie einen Auszug aus dem SOEM Testcode um die PDO Configuration eines Yaskawa Sigma Drive zu initialisieren. Dieser Auszug stellt den Zustandswechsel von PreOp zu SafeOp dar. Eine solche PDO configuration zu schreiben ist mit der IgH Lösung ähnlich. All die Indizes, Sub-Indizes und Werte müssen ausgewertet, kopiert und/oder berechnet und hart kodiert werden. Meta-Informationen wie z.B. ein Kommentar für das einzelne InitCmd vermisst man. Im Fall einer Fehlkonfiguration oder Fehler zu verstehen was vor sich geht ist dann deutlich schwieriger. Das Arbeiten mit ESI und ENI Dateien ist offensichtlich viel angenehmer. Dies sagen uns zumindest unsere Kunden. Beachten Sie auch die weiter unten stehende Auflistung.
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;
}
Snippet 1 Testcode Yaskawa Sigma Antrieb Initialisierung
EC-Master
Wie bereits beschrieben liefern in aller Regel EtherCAT Slave-Hersteller eine ESI Datei mit ihren Geräten. Die Sammlung aller ESI Dateien ihrer Slaves beschreiben ihr EtherCAT Netzwerk. Diese Dateisammlung wird meist in eine ENI Datei prozessiert –meist mit einer grafischen Anwendung (e.g. EC-Engineer)–. Diese ENI beinhaltet die ganze Netzwerkbeschreibung. Neben vieler anderer Informationen auch die Kommandos (InitCmds) die ausgeführt werden sollen bei jedem Statuswechsel eines jeden Slaves in jeder Revision. Der EC-Master liest all diese Informationen ein. Wann immer eine Zustandsänderung zum EC-Master kommandiert wird und vom Stack zu den Slaves, werden diese Zustandsänderung bezogenen InitCmds an den Slave geschickt/kommandiert. Nun stellen Sie sich vor, sie haben Slaves in unterschiedlichen Revisionen und müssen die PDO Konfiguration mit unterschiedlichen Initialisierungssequenzen und spezifischen Regel oder Attributen ändern. Dies auf einem höheren Abstraktionsniveau zu tun spart Zeit und Geld. Um den EC-Master zu initialisieren werden in der Regel nur die unten fett gedruckt gelisteten Funktionen benötigt. Dieser Auszug initialisiert einen multi-threaded EC-Master und das angeschlossene Netzwerk inklusive Fehlerbehandlung, Logging und vieles mehr...
/* 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" );