Aufruf einer externen Funktion
Mit diesem Mechanismus lässt sich in einer IEC-Applikation über einen Unix Domain Socket eine externe Funktion aufrufen. Dadurch können eigene Funktionalitäten erstellt werden. Gleichzeitig wird eine Prozesstrennung erreicht. Als Schnittstelle in IEC wird der Funktionsbaustein EXTAPI.UDSExternalFunction
in der Bibliothek ExtensionAPI
mitgeliefert. In Python dient dafür die Klasse ExternalFunctionBase
, die im mitgelieferten Beispiel bereitgestellt wird.
Auch die Verwendung des Mechanismus wird anhand dieses Beispiels erklärt. Das Beispiel enthält ein IEC-Projekt mit implementiertem Aufruf einer externen Funktion. Weiter enthält das Beispiel die Implementierung der aufgerufenen Funktion myExternalFunction
in Python.
Sie finden das Beispiel UDSExternalCallExample.project
und das Python-Skript uds_external_function.py
nach der Installation von CODESYS Control Extension Package im Verzeichnis C:\Program Files\CODESYS <version>\CODESYS\CODESYS Control SL Extension Package\<version>\Examples\ExternalCall
.
Beispiel, IEC-Applikation
Im Beispielprojekt UDSExternalCallExample.project
wird ein neuer Funktionsbaustein myExternalFunction
erstellt. Dieser erweitert den FB EXTAPI.UDSExternalFunction
um Ein- und Ausgänge vom Typ DINT
. Auch andere Datentypen sind möglich. Zu Beginn muss der Name der in Python aufzurufenden Funktion übergeben werden. Dieser muss eindeutig sein.
Mit folgendem Code werden die Eingänge der externen Funktion der Schnittstelle hinzugefügt:
Result := THIS^.AddParameter('parameterIn1', 'DINT', TO_STRING(diIn1));
Mit folgendem Code wird dann die externe Funktion aufgerufen:
Result := THIS^.Call();
Mit folgendem Code wird der Rückgabewert der in Python implementierten Funktion abgefragt:
Result := THIS^.GetParameter('parameterOut', 'DINT', ADR(sValue));
Die Parameter sind vom Typ String
. Entsprechend muss in den gewünschten Datentyp gecastet werden.
Beispiel, Python-Skript
Wichtig
Die mitgelieferten Python-Beispiele für die Extension-API erfordern Python 3.0.
Das mitgelieferte Beispiel uds_external_function.py
bietet die Klasse ExternalFunctionBase
, die die Unix Domain Socket-Kommunikation mit dem Laufzeitsystem für diese Funktionalität ermöglicht.
Die im Beispiel implementierte Klasse myExternalFunction
erweitert die Klasse ExternalFunctionBase
. Notwendig ist die Funktion Call()
, die von dem Mechanismus aus IEC aufgerufen wird. Ein- und Ausgabeparameter werden in Form von Tupeln von Strings übergeben.
Beispiel: {'parameterIn1': ('DINT', '11'), 'parameterIn2': ('DINT', '22')}
Im Beispiel implementiert die Call()
-Funktion ein einfaches Addieren der zwei Eingangsparameter:
def Call(self, dictParams): in1 = int(dictParams['parameterIn1'][1]) in2 = int(dictParams['parameterIn2'][1]) dictRetParams = {} dictRetParams['parameterOut'] = 'DINT', in1 + in2 return dictRetParams
Kopieren Sie das Skript
uds_external_function.py
, das nach der Installation von CODESYS Control Extension Package im VerzeichnisC:\Program Files\CODESYS <version>\CODESYS\CODESYS Control SL Extension Package\<version>\Examples\ExternalCall
liegt, auf das Zielgerät.Starten Sie das Skript
uds_external_function.py
.Anschließend starten Sie in CODESYS das Beispielprojekt
UDSExternalCallExample.project
Sie sehen, dass das Projekt die Funktion
myExternalFunction()
des Python-Skripts aufruft und die zwei Eingabeparameter addiert werden.
Verwendung der Schnittstelle nur als Mitglied der Linux-Benutzergruppe | JA |
Prozesstrennung | JA |