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

Abblidung 3 SOEM Architektur

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
(ETG.5001 MDP sub profile 1100)

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

Tabelle 3 Fehlerbehandlung

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" );

Snippet 2 EC-Master Initialisierung