Einführung

Dieser Leitfaden bietet eine Schritt-für-Schritt-Anleitung für die Implementierung des EtherCAT-Slave-Stacks unter Linux, entweder mit der Beckhoff FC1100 PCI-Karte oder der Beckhoff FC1121 PCIe-Karte.

Architektur

Um dem Slave-Stack einen direkten Zugriff auf die PCI(e)-Karte zu ermöglichen, verwenden wir das acontis-Kernelmodul, genannt atemsys. Dieses ermöglicht den direkten Zugriff auf die Hardware aus dem Userspace. Die Datei fc11xxhw_Linux.c stellt die Verbindung zwischen dem Slave Stack und atemsys her.

Implementierung

Der Zugriff auf die Funktionen des atemsys-Kernelmoduls erfolgt über den LinkOsLayer. Eine vollständige Implementierung kann bei acontis angefordert werden. Die folgenden Schritte zeigen, wie man auf die Funktionen zugreift:

  1. Erstellen eines Kontexts.

    EC_T_VOID* pvLinkOsContext;
    EC_T_LINK_PARMS linkParms;SIZEOF(EXAMPLE_INPUT0x6001));

    dwRetVal = LinkOsCreateContext(&linkParms, &pvLinkOsContext);}

  2. Suchen Sie die PCI-Informationen mit LinkOsGetPciInfo(). Diese Funktion durchsucht alle PCI(e)-Geräte um eines mit der passenden Vendor ID und Device ID zu finden. Je nachdem nach welcher Karte Sie suchen, übergeben Sie der Funktion eine "1" für die FC1100 oder eine "2" für die FC1121.

    T_PCIINFO PciInfo;

    LinkOsGetPciInfo(pvLinkOsContext, &PciInfo, "FC11XX", 1);

  3. Wenn ein passendes Gerät gefunden wird, wird dessen Speicher automatisch zugeordnet. Bei der FC1100 wird das zweite Speicherfenster zugeordnet, bei der FC1121 das erste Fenster.

    EC_T_BYTE* pbyVirtAddr;

    LinkOsMapMemory(pvLinkOsContext, PciInfo.Window.memWindows[1].qwBase,
    PciInfo.Window.memWindows[1].dwLen);

  4. Der zugeordnete Speicher wird dem ESC-Speicherzeiger zugewiesen. Bei der FC1100 beginnt der ESC-Speicher mit dem zweiten Speicherfenster.

    pEsc = (MEM_ADDR ESCMEM *)pbyVirtAddr;

  5. Der ESC-Speicher des FC1121 beginnt dagegen mit einem Offset zum ersten Speicherfenster. Dieser Offset ist im Funktionsbaustein zu finden. Der Funktionsbaustein befindet sich direkt hinter dem Infoblock am Anfang des ersten Speicherfensters.

    pFuncBlockDesc = (FC1121_Func_Block_Desc*)&pbyVirtAddr[SIZEOF(FC1121_Info_Block)];

    pEsc = (MEM_ADDR ESCMEM *)&pbyVirtAddr[pFuncBlockDesc->dwOffset];

Weitere Einzelheiten entnehmen Sie bitte dem Datenblatt.

Einrichtung

Für dieses Tutorial haben wir ein Linux-System mit dem FC11xx verbunden. Zusätzlich wird ein Windows-System verwendet, um den Slave-Stack-Quellcode und die ESI-Datei mit dem Slave-Stack-Code-Tool zu erzeugen.

atemsys-Kernelmodul

Wie bereits erläutert, ist das atemsys-Kernelmodul für den Zugriff auf die PCI(e)-Karte erforderlich. Installationsanweisungen finden Sie auf dem atemsys-Github. Um zu überprüfen, ob die Installation erfolgreich war, führen Sie die folgenden Befehle auf Ihrem Linux-System aus:

lsmod | grep atemsys

Dies gibt atemsys aus, wenn es als Kernelmodul geladen ist.

lspci -v

Dies zeigt Ihnen eine Liste von PCI(e)-Geräten und Informationen über diese. Atemsys sollte nun als der verwendete Kernel-Treiber unter dem Eintrag für den FC11xx aufgeführt sein.

Slave Stack Code Tool

Um eine ESI-Datei zu erstellen und den Quellcode zu generieren, müssen Sie das Slave Stack Code Tool installieren. Öffnen Sie das Tool und erstellen Sie ein neues Projekt. Wählen Sie "FC1100" unter "Benutzerdefiniert". Diese Voreinstellung ist zwar für Windows gedacht, funktioniert aber mit einigen Änderungen und unserer fc11xxhw_Linux.c-Treiberimplementierung auch unter Linux.

Wenn Sie Ihre eigene Anwendung erstellen möchten, anstatt das Beispiel zu verwenden, importieren Sie einfach Ihre PD-Zuordnung unter Werkzeug -> Anwendung -> Importieren/Neu erstellen. Nach dem Importieren können Sie Ihre Anwendung benennen

Wichtig: Ändern Sie unter "Compiler" die Definitionen von "UINT32" und "INT32" von (unsigned) long auf (unsigned) int. Diese Änderung ist erforderlich, da unter Linux ein long ein 64-Bit-Wert ist, im Gegensatz zu Windows, wo er ein 32-Bit-Wert ist.

Stellen Sie außerdem sicher, dass die Hersteller-ID, der Produktcode und die Revisionsnummer mit Ihrer PCI(e)-Karte übereinstimmen.

Exportieren Sie nun das Projekt unter Project -> Create new Slave Files. Dadurch werden die Quelldateien und die ESI-Datei erstellt. Kopieren Sie alle erzeugten Quelldateien, außer fc1100hw.c und die TcHelper-Dateien in den src-Ordner des mitgelieferten SSC-Device-FC11xx-Projekts. Wenn Sie Ihre eigene Anwendung verwenden, löschen Sie außerdem die sampleappl-Dateien, da sie durch Ihre Anwendung ersetzt werden.

Sie können Ihre Slave-Anwendung in der .c-Datei mit demselben Namen schreiben, den Sie zuvor für Ihre Anwendung gewählt haben. Es ist wichtig zu beachten, dass der Rückgabetyp der Hauptfunktion in dieser Datei ebenfalls von void auf int geändert werden muss.

Kompilierung

Das SSC-Device-FC11xx-Projekt kann nun auf Ihr Linux-System übertragen werden. Navigieren Sie nun dorthin und führen Sie den folgenden Befehl aus:

make SSC_IN_DIFF_DIR=false

Dadurch wird eine ausführbare Datei namens "fc11xx" in Ihrem aktuellen Arbeitsverzeichnis erzeugt.

Ausführen der Anwendung

Um die Anwendung zu starten, führen Sie die ausführbare Datei im Kompilierungsordner aus:

./fc11xx

Der Slave kann nun von einem EtherCAT-Master bedient werden.

Um zu überprüfen ob der Slave funktioniert, verbinden Sie den IN-Port der Slave-Karte mit einem dedizierten EtherCAT-Port auf dem Windows-System. In diesem Beispiel wird das acontis EtherCAT-Netzwerkkonfigurationswerkzeug EC-Engineer verwendet, das als EtherCAT-Master fungiert.

Fügen Sie die ESI-Datei im EC-Engineer unter Datei -> ESI-Manager hinzu und verbinden Sie sich mit dem Slave. Wenn Sie die Beispielanwendung verwenden, sollte die Variable "Input" schnell hochzählen, wenn der Output Null ist. Andernfalls sollte es der Wert der "Output"-Variablen plus eins sein.