Skip to main content

Extension SDK

Mit dem Extension SDK können Sie eigene Funktionen in C implementieren und diese aus der IEC-Applikation aufrufen.

Für diese Anbindung wird der C-Code in Form einer eigenen dynamischen Komponente (shared object) ins Laufzeitsystem eingebunden.

Es gibt zwei Möglichkeiten, wie die Einbindung stattfinden kann:

  • Auf der Steuerung vorbereitet: Die dynamische Komponente ist bereits zum CODESYS-Laufzeitsystem hinzukonfiguriert (ein shared object ist auf dem Linux-System vorhanden und konfiguriert). Es wird dann nur noch die dazugehörige IEC-Bibliothek benötigt.

  • In Form einer IEC-Bibliothek mit integrierter dynamischer Komponente. Auf dem Linux-System selbst muss nichts vorbereitet sein. Bei Verwendung der IEC-Bibliothek wird die dynamische Komponente automatisch zum CODESYS-Laufzeitsystem hinzugeladen und verwendet.

In beiden Fällen muss der Anwender selbst in der Lage sein, ein shared object passend zur Architektur des Laufzeitsystems (x64/ARM6/ARM7/AARCH64) zu erzeugen. Das Extension SDK unterstützt Sie beim Erzeugen einer solchen dynamischen Komponente (shared object).

Nachfolgend wird beschrieben, wie Sie für beide Varianten die Bibliothek und die dynamische Komponente erzeugen.

Entwicklungsumgebung

. Entwicklungsumgebung
  • Öffnen Sie CODESYS und erstellen Sie eine neue Bibliothek.

  • Setzen Sie den Titel der Bibliothek (Projekt Informationen, Registerkarte Zusammenfassung) und speichern Sie die Bibliothek unter demselben Namen.

  • Fügen Sie die gewünschten Funktionen hinzu und markieren Sie diese als Externe Implementierung.

    • Wählen Sie im Kontextmenü der Funktion im Projektnavigator den Befehl Eigenschaften. Wählen Sie auf Registerkarte Build und aktivieren Sie Externe Implementierung.

    • Hinweis: Die Funktion muss „_cext“ im Namen enthalten.

  • Generieren Sie nun die *c und *m4 -Dateien:

    • Wählen Sie den Befehl Erstellen → Laufzeitsystemdateien erzeugen

    • Wählen Sie M4-Interface-Datei und C-Stub-Datei aus.

    • Wählen Sie den Speicherort aus

Linux

  1. Kopieren Sie das Extension-SDK auf ein Linux-System, auf dem die entsprechende Compile-Umgebung für das Zielsystem vorhanden ist.

    Das Extension-SDK finden Sie standardmäßig unter:

    C:\Program Files\CODESYS <version>\CODESYS\CODESYS Control SL Extension Package\<version>\ExtensionSDK. Das Verzeichnis wird in den folgenden Schritten als <SDK DIR> bezeichnet.

  2. Erstellen Sie einen neuen Ordner, in dem Sie die C-Implementierung erstellen. Dieser Ordner ist im Folgendem <PROJECT DIR>.

  3. Navigieren Sie nach <PROJECT DIR> und führen Sie Folgendes aus: $ make -f <SDKDIR>/makefile newproject

  4. Kopieren Sie die *c und *m4 -Dateien, die sie in der -Entwicklungsumgebung erstellt haben, in <PROJECT DIR>.

  5. Implementieren Sie die Funktionen in C.

  6. Erstellen Sie das Shared Object: $ make all

    Das shared object ist generiert und liegt in <PROJECT DIR>/out/libCmpMyTest.so.

Damit haben Sie eine dynamische Komponente erzeugt, die jetzt aus der IEC-Applikation über Ihre IEC-Bibliothek aufgerufen werden kann. Details zum Buildprozess (make) finden Sie auch in den Makefiles und der README-Datei im Extension SDK.

Entscheiden Sie sich jetzt für einen der beiden folgenden Wege die Komponente einzubinden:

Einbinden der dynamischen Komponente

Sie haben folgende Optionen die Komponente einzubinden:

Einbinden der dynamischen Komponente auf dem Zielgerät

Mit dieser Methode können Sie das zuvor in C erstellte Shared Object zur Laufzeit in das Laufzeitsystem einbinden. Es sind dafür keine weiteren Systemrechte für den Anwender notwendig und die Bibliothek lässt sich mit gewohnten Methoden auf die Geräte ausrollen.

  1. Kopieren Sie das oben erzeugte Shared Object auf das Runtime-System.

  2. Kopieren Sie das Shared Object in /usr/lib/ oder ein gleichwertiges Bibliotheksverzeichnis, in dem Bibliotheken von dem System gefunden werden.

  3. Stoppen Sie das Laufzeitsystem (beispielsweise mit $ sudo /etc/init.d/codesyscontrol stop)

  4. Öffnen Sie /etc/CODESYSControl_User.cfg mit Administratorrechten: $ sudo nano /etc/CODESYSControl_User.cfg

  5. Fügen Sie in der Sektion [ComponentManager] die erstellten Shared Objects hinzu:

    [ComponentManager]
    Component.1=CmpFirstTest
    Component.2=CmpSomeOtherComponent
    ...

    Hinweis: Die Nummer ist eine fortlaufende Nummer, die nicht mit bestehenden Komponenten kollidieren darf.

  6. Starten Sie das Laufzeitsystems: $ sudo /etc/init.d/codesyscontrol start

    Sie können nun prüfen, ob die Komponente geladen worden ist: $ cat /tmp/codesyscontrol.log

Einbinden der dynamischen Komponente in der IEC Bibliothek

Fügen Sie der IEC-Bibliothek mit Hilfe der Funktionalität „C-Code Integration“ die dynamische Komponente hinzu. Sehen Sie dazu die allgemeine Hilfe C-Code-Integration .

  1. Öffnen Sie die IEC Bibliothek mit .

  2. Fügen Sie in den POUs ein Objekt C-implementierte Bibliothek hinzu.

  3. Fügen Sie in diesem Objekt eine Objektdatei für Geräte hinzu:

    • Wählen Sie die vorher gebaute dynamische Komponente (Datei) aus und fügen Sie diese hinzu.

    • Geben Sie einen passenden Komponentennamen ein.

    • Wählen Sie das passende Gerät aus.

    Jetzt wird bei Verwendung dieser Bibliothek mit dem ausgewählten Gerät automatisch die dynamische Komponente zum Laufzeitsystem hinzugefügt und kann über die Bausteine der Bibliothek aufgerufen werden.

Weiteres

Einschränkungen:

  • Mit dem Extension SDK kann nur C-Code eingebunden werden.

  • Der C-Code kann nicht mit Hilfe eines Debuggers (beispielsweise mit dem -Programmiersystem) untersucht / gedebuggt werden.

  • Der C-Code kann nicht mit dem Laufzeitsystem oder der IEC-Applikation „interagieren“. Das bedeutet:

    • Automatische Zugriffe auf Variablen der IEC-Applikation sind nicht möglich.

    • Zugriffe auf Funktionalität des Laufzeitsystems sind nicht möglich. Zugriffe auf Variablen der IEC-Applikation sind aber natürlich durch Übergabe an eine in C-Code implementierte Funktion by reference möglich (beispielsweise per POINTER).

Verwendung der Schnittstelle nur als Mitglied der Linux-Benutzergruppe codesysuser

NEIN

Prozesstrennung

NEIN