HLL-Schnittstelle

| ALPHA-VISION® SoftPlc7

# HLL-Schnittstelle

## 1. Allgemeines

Für gewöhnlich bestehen die Programmbausteine eines STEP7-Programms jeweils aus einer Liste von elementaren Assembler-Befehlen, die nach dem Konvertieren des Projekts von der SoftPlc7 geladen und 1:1 simuliert werden können. Solche Programmbausteine können vom STEP7-Programmierer ganz individuell gestaltet werden.
Es gibt allerdings auch eine Reihe von (System-) Bausteinen, deren Funktion fest vorgeschrieben ist. Diese Funktionen können von einer originalen PLC ausgeführt werden, ohne dass im Projekt nähere Informationen darüber stehen müssen. Die Bausteine können einfach über ihre Namen anzusprochen werden, es handelt sich dabei um sog. System-Funktionen (SFC) und System-Funktionsbausteine (SFB).
Damit innerhalb eines Programms solche Funktionen auch von der SoftPlc7 aufgerufen werden können, werden für die wichtigsten und häufigsten System-Bausteine HLL-Funktionen zur Verfügung gestellt, deren Einbindung eine fehlerfreie Programmbearbeitung gewährleistet.
Für den Fall, dass ein benötigter System-Baustein noch nicht als HLL-Funktion realisiert ist, stellt die Verwendung der HLL-Schnittstelle zur SoftPlc7 eine komfortable Lösung dar. Sie ermöglicht Zugriffe auf interne Operanden-Bereiche wie Datenbausteine, Merker etc. und stellt Klassen für bereichsübergreifende Zeiger und ANY-Pointer zur Verfügung.
Darüberhinaus können auch Nicht-System-Bausteine, d.h. Funktionen (FC) und Funktionsbausteine (FB), auf die gleiche Weise durch Hochsprachen-Funktionen ersetzt werden, wenn dadurch ein Geschwindigkeitsvorteil zu erwarten ist.

## 2. Vorgehensweise

Das Programm SoftPlc7 sowie die HLL-Schnittstelle wurden in der Programmiersprache C++ geschrieben. Für die Nachbildung eines System-Bausteins ist es erforderlich, zunächst eine DLL in C++ zu erstellen. Um die HLL-Schnittstelle zu nutzen, müssen die Header-Datei "HllHandler.h" und die Bibliothek "SoftPlc7Kernel.lib" eingebunden werden. Das Projekt SoftPlc7SampleHll kann als Rumpf einer solchen DLL verwendet werden und demonstriert anhand einfacher Beispiele die Nachbildung einer Funktion (FC) und eines Funktionsbausteins (FB).
Eine HLL-Funktion muss immer folgende Signatur besitzen:

extern "C" void __declspec(dllexport) FktName(HllHandler* pHandler);

Die Klasse HllHandler stellt die eigentliche Schnittstelle zur SoftPlc7 dar, denn über sie werden Daten mit der CPU ausgetauscht. Sie stellt selbst viele Funktionen zur Verfügung, wird aber auch als Parameter bei Funktionen anderer Klassen benötigt.

## 3. Parameterübergabe bei FC und SFC

Bei (S)FC werden vor einem Aufruf zunächst für alle Parameter im Lokaldatenbereich des aufrufenden Bausteins der benötigte Platz reserviert. IN-Parameter werden dorthin geschrieben, der Baustein wird aufgerufen, und nach dem Aufruf werden OUT-Parameter von dort gelesen. Der Verweis auf die jeweiligen Stellen im Lokaldatenbereich wird durch eine Liste bereichsübergreifenden Zeiger P#VL x.0 realisiert, die im Code des aufrufenden Bausteins abgelegt sind. Man erhält einen Zeiger auf diese Liste über die Funktion

void* HllHandler::GetFCParams()

Der zurückgelieferte Zeiger muss nur noch auf einen HllPTR32* gecastet werden:

HllPTR32* pParams = (HllPTR32*) pHandler->GetFCParams();

Danach kann auf die einzelnen Parameter lesend und schreibend zugegriffen werden:

WORD wParameter1 = pParams[0]; // falls erster Parameter vom Typ WORD ist
BOOL bParameter2 = pParams[1]; // falls zweiter Parameter vom Typ BOOL ist
...

## 4. Parameterübergabe bei FB und SFB

Hier gestaltet sich die Parameterübergabe etwas schwieriger als bei (S)FC. Funktionsbausteine erhalten nicht wie Funktionen eine Zeigerliste in den Vorgänger-Lokaldatenbereich, sondern sie werden mit einem sog. Instanz-Datenbaustein aufgerufen, über den die Daten ausgetauscht werden.
So wird beispielsweise der Makro-Befehl

CALL FB 1, DB 10

im Kern in die Anweisungen

AUF DI 10 ; Datenbaustein DB10 als Instanz-Datenbaustein wählen ("aufschlagen")
UC FB 1 ; Aufruf des FB1, dort wird DB10 als Parameterliste verwendet.

zerlegt. Einen Zeiger auf den Anfang des Instanz-DB erhält man in der HLL-Funktion mit der Anweisung

void* HllHandler::GetFBParams(); // nicht zu verwechseln mit GetFCParams()

Die Parameter befinden sich nun je nach Platzbedarf ab dieser Windows-Adresse in aufsteigender Reihenfolge. Hat man etwa drei Parameter vom Typ WORD, DWORD und ANY (in dieser Reihenfolge), so werden Byte 0 und 1 für den ersten Parameter, Byte 2 bis 5 für den zweiten, und Byte 6 bis 15 für den dritten verwendet. Findet in der Parameterliste ein Typwechsel statt, z.B. Parameter 1 ist BYTE und Parameter 2 ist WORD, wird auf die nächste gerade Adresse aufgerundet. Mehrere aufeinanderfolgende BOOL-Parameter werden im selben Byte organisiert.
Es empfielt sich, den zurückgelieferten Zeiger auf eine Klasse zu casten, die über Zugriffsfunktionen die Werte im Instanz-DB manipuliert. Im Projekt SoftPlc7SampleHll wird dies durch die Funktion SampleFunctionFB demonstriert.

## 5. Datenformate

Die SoftPlc7 speichert wie eine originale PLC Datentypen, die breiter als 8 Bit sind, im little-endian-Format ab, d.h. an niedrigeren Adressen stehen höherwertigere Bytes. So wird etwa der DWORD-Parameter 0x1234ABCD aufsteigend als 0x12, 0x34, 0xAB, 0xCD gespeichert. Ein Casten der Windows-Anfangsadresse auf ein (DWORD*) würde jedoch nach Dereferenzierung den Wert 0xCDAB3412 liefern. Um die Programmierarbeit zu erleichtern, werden globale Funktionen zum Lesen und Schreiben von WORD-, DWORD- und FLOAT-Werten zur Verfügung gestellt.