Материал: Toolkit asynchrone DLLs zur RTE

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Custom-DLL-Interface für RTE

Beschreibung der

Schnittstelle zum asynchronen Aufruf von

Funktionen in DLLs

aus dem IEC-Programm.

1.Allgemeines

1.1.Überblick

Die Echtzeiterweiterung der Fa. 3S für WindowsNT4.0 besteht aus einem Kernelteil und einen Applikationsteil. Der Kernelteil ist als Kernelmodetreiber implementiert, der u.a. als Taskscheduler arbeitet. Mit dem Programmiersystem CoDeSys können Tasks programmiert werden, die als Echtzeittasks abgearbeitet werden. In diesen Tasks können nur „echtzeitfähige“ Aufgaben (speziell heißt das, keine Aufrufe von Funktionen aus dem Win32-Api) erledigt werden.

Der Applikationsteil ist als Systemservice implementiert, d.h. hier können alle Aufgaben, die den vollen Zugriff auf das Win32-Api von Windows erfordern, erledigt werden.

Erwünscht ist, diese Aufgaben aus Echtzeittasks heraus anzustoßen. Dazu wurde eine Schnittstelle geschaffen, die es erlaubt, asynchron zu den Echtzeittasks Funktionen in externen Modulen (DLL) aufzurufen.

Im IEC-Programm (mit CoDeSys erstellt) kann durch den Aufruf eines Bibliotheksfunktionsbausteins der Systemservice dazu veranlaßt werden, eine DLL-Funktion aufzurufen (der Name der Funktion wird dem Baustein übergeben).

Die Ausführung der Funktion wird vom Systemservice in einen eigenen Thread verlagert, so daß mehrere asynchrone Aufrufe „gleichzeitig“ erledigt werden können, und eine Zeitkontrolle der Aufgaben erfolgen kann.

1.2.1.2 Welche DLLs werden geladen?

Einzuhängende Dlls werden dem System durch jeweils einen Eintrag in der Registry bekanntgegeben:

In

\\HKEY_LOCAL_MACHINE\Software\3S Smart Software Solutions\Codesys SP\RTPLC\External DLLs

muß es für jede einzuhängende Dll einen Eintrag (Wert, Typ Zeichenfolge) der Form,

Dllx, wobei x eine laufende Nummer (mit 0 beginnend) ist,

geben.

Alle diese Dlls (egal, wieviele) werden mit ‚Start System‘ geladen und bei ‚Stop System‘ entladen.

Die Funktionen der Dlls werden im Kontext eines eigenen Threads unter WinNT32-Api aufgerufen.

Beispiel für einen Eintrag:

Dll0 d:\Workspace\AsynchDll\AsynchDll.dll

Eine DLL kann mit komplettem Pfad (dann wird genau diese benutzt) oder nur mit ihrem Dateinamen (dann sucht Windows in der Reihenfolge des aktuellen Suchpfads nach der Datei) spezifiziert werden.

2.Die Schnittstelle und das Toolkit

Die Funktionen der DLL können durch den Bibliotheksfunktionsbaustein ‚DllCall‘ aufgerufen werden.

Die Eingabeparameter des Bausteins sind :

bEnable Bei einem Wechsel von 0 auf 1 wird der Job gestartet.

szFunktionName Der Name der aufzurufenden Funktion, so wie sie im Quelltext der DLL heißt.

ulSizeIn Größe des Inputbuffers in Byte.

ulSizeOut Größe des Outputbuffers in Byte.

pAdrIn Adresse der Eingabedaten (möglichst eine Struktur in IEC).

pAdrOut Adresse der Ausgangsdaten (möglichst eine Struktur in IEC).

Der Ausgabeparameter des FB ist iStatus.

iStatus kann die Werte:

STATUS_NOTENABLED,

STATUS_PROCESSING,

STATUS_READY,

STATUS_ERROR,

STATUS_TIMEOUT,

STATUS_EXCEPTION,

STATUS_USERTERMINATED

annehmen.

Der FB muß zyklisch aufgerufen werden, damit Flanken erkannt werden, und der Status des Auftrags stets aktualisiert werden kann.

Der FB ‚DllCall‘ befindet sich in der Bibliothek DllCall.lib.

Die Bibliothek ‚DllCall.lib‘ stützt sich auf die externe Bibliothek ‚SysLibSystemCall.lib‘, die im Bibliotheksverwalter unter CoDeSys vor der DllCall.lib eingefügt werden muß.

Beide Bibliotheken sind Bestandteile des Toolkits.

Die Funktionen der Dll, die vom Echtzeitkernel aus asynchron aufgerufen werden, müßen alle folgendes Format haben:

typedef BOOL (_cdecl *PFCUSTOMDLLFUNCTION)(char* pBufferIn, int iSizeIn, char* pBufferOut, int iSizeOut);

Der Rückgabewert der Funktion bedingt, ob ein STATUS_ERROR (Rückgabewert FALSE) oder ein STATUS_READY von DllCall zurückgeliefert wird.

Da die Kommunikation und der Austausch von Ein-/Ausgabedaten mit den DLL-Funktionen über Sharedmemorykanäle erfolgt, darf in der jetzigen Implementation die Summe von Ein- und Ausgangsdaten 100 Bytes nicht übersteigen. Der Name der Funktion darf maximal 80 Zeichen lang sein.

3S – Smart Software Solutions

Seite 3 von 3