# Beschreibung

Das Service Interface besteht aus 5 V.G.-Variablen. Jeder CNC-Kanal hat sein eigenes Service Interface.

## V.G.SERVICE.UUID

Die String-Variable "V.G.SERVICE.UUID" enthält einen eindeutigen Bezeichner, der den externen Service identifiziert. Mehrere Services können gleichzeitig auf dem Service Interface lauschen, aber nur der Service mit der passenden UUID wird auf die Anfrage antworten.

## V.G.SERVICE.REQUEST

Die String-Variable "V.G.SERVICE.REQUEST" beinhaltet die Anfrage. Das Service Interface stellt keine Formateinschränkungen an diese Variable. Die korrekte Belegung und Interpretation dieser Variable obliegt ausschließlich dem CNC-Programm und dem externen Service.

Die Länge dieser Variablen ist auf 128 Bytes beschränkt.

## V.G.SERVICE.REQUEST_STATE

Ein Wert ungleich 0 in "V.G.SERVICE.REQUEST_STATE" zeigt für einen lauschenden externen Service an, dass eine Anfrage gestellt wurde. Das Service Interface stellt sicher, dass der Service seine Aufgabe nur startet, wenn der Wert dieser Variablen ungleich 0 ist. Die Zeilen

N00110 ; Anfrage abschicken

N00120 V.G.SERVICE.REQUEST_STATE = 1

sorgen dafür, dass ein lauschender externer Service mit passender UUID seine Arbeit aufnehmen kann.

Die Variable "V.G.SERVICE.REQUEST_STATE" hat innerhalb des Service Interfaces keine weitere semantische Bedeutung. Zur Vereinfachung der Abläufe wird diese Variable vom Service Interface auf 0 gesetzt, wenn der externe Service seine Aufgabe abgearbeitet hat.

## V.G.SERVICE.RESPONSE_STATE

Die Variable "V.G.SERVICE.RESPONSE_STATE" ist das Gegenstück zu "V.G.SERVICE.REQUEST_STATE" für die Antwort. Typischerweise wird diese Variable vom externen Service beschrieben, nachdem er seine Aufgabe erledigt hat. Das CNC-Programm wartet darauf, dass die Variable V.G.SERVICE.RESPONSE einen bestimmten Wert annimmt, bevor es seine Bearbeitung fortsetzt. Diese Variable kann zum Beispiel zur Rückgabe von Fehlercodes oder Ergebnissen verwendet werden. In dem obigen CNC-Programm sorgen die Zeilen

N00140 ; auf Antwort warten

N00150 #WAIT FOR V.G.SERVICE.RESPONSE_STATE != 0

dafür, dass das CNC-Programm wartet, bis der externe Service seine Aufgabe erledigt hat. Der externe Service muss entsprechend implementiert sein, d.h. er muss in diesem Beispiel bei Beendigung einen Wert ungleich 0 zurückgeben.

Die Variable V.G.SERVICE.RESPONSE_STATE hat sonst keine weitere semantische Bedeutung innerhalb des Service Interface. Zur Vereinfachung der Abläufe setzt das Service Interface diese Variable auf 0, wenn das CNC-Programm auf die Variable "V.G.SERVICE.REQUEST_STATE" schreibt.

## V.G.SERVICE.RESPONSE

Die String-Variable "V.G.SERVICE.RESPONSE" enthält die Antwort des externen Service. Wie auch schon "V.G.SERVICE.REQUEST" ist "V.G.SERVICE.RESPONSE" lediglich in seiner Länge (128 Bytes), aber nicht im Format beschränkt.

Die korrekte Interpretation der Variablen ist Aufgabe des CNC-Programms.

## Ablauf

Der typische Ablauf ist wie folgt.

1. Der externe Service wird gestartet und lauscht ab jetzt am Service Interface.
2. Das CNC-Programm bereitet die Anfrage vor.
3. Das CNC-Programm schreibt die Anfrage in das Service Interface und wartet auf eine Antwort.
4. Nach der eingehenden Anfrage führt der externe Service seine Aufgabe aus.
5. Nach Beendigung seiner Aufgabe bereitet der externe Service eine Antwort für das CNC-Programm vor.
6. Der externe Service schreibt die Antwort zurück in das Service Interface.
7. Das CNC-Programm empfängt die Antwort und setzt seine Bearbeitung fort.

Abb.: Ablauf im Service Interface

## Programmierbeispiel

Ablauf im Service Interface

N00010 ; bewegen N00020 G00 X10 N00040 ; auf Beendigung der Bewegung warten N00050 #FLUSH CONTINUE N00070 ; Anfrage fuer das Service Interface vorbereiten

N00080 V.G.SERVICE.UUID = "560AACBF-6335-44a9-895A-B27F3ED5E47"

N00090 V.G.SERVICE.REQUEST = "3"

N00110 ; Anfrage abschicken

N00120 V.G.SERVICE.REQUEST_STATE = 1

N00140 ; auf Antwort warten

N00150 #WAIT FOR V.G.SERVICE.RESPONSE_STATE != 0

N00170 ; Antwort verarbeiten

N00180 #MSG SAVE EXCLUSIVE ["response = %s", V.G.SERVICE.RESPONSE]

N00200 ; Bearbeitung fortetzen

N00210 G00 X20

N00230 ; beenden

N00240 M30

## Programmierbeispiel

Quadratwurzel-Service - Service definieren

// // Service-Funktion, die die Anfrage als Zahl interpretiert // und die Quadratwurzel der Zahl als Antwort zurückgibt. // ISG_SERVICE_CODE squareRoot(ISG_SERVICE * service, char * request, ADS_UINT32 requestState, char * response, size_t maxResponseSize, ADS_UINT32 * responseState)

{

// interpretiere die Anfrage als Zahl

double x = atof(request);

// teste, ob die Zahl nicht-negativ ist

if (x >= 0)

{

// falls ja, berechne die Quadratwurzel

double y = sqrt(x);

// konvertiere die Wurzel in einen String

// und schreibe das Ergebnis in den Antwort-Puffer

sprintf_s(response, maxResponseSize, "%f", y);

// setze Antwort-Status auf 1, um Erfolg zu signalisieren

*responseState = 1;

}

else

{

// anderenfalls, schreibe eine Fehlermeldung in den

// Antwort-Puffer

sprintf_s(response, maxResponseSize,
"ERROR: cannot calc square root of negative number %f", x);

// setze den Antwort-Status auf 99, um einen Fehler zu

// signalisieren

*responseState = 99;

}

// die Service-Funktion selbst wurde erfolgreich beendet

return ISG_SERVICE_CODE_OK;

}

## Programmierbeispiel

Service starten, ADS-Verbindung aufbauen und Service registrieren

// // Baut die Verbindung zu ADS auf und definiert // und aktiviert den Quadratwurzel-Service. // void exampleSquareRootService()

{

// Verbindung und Service deklarieren

ISG_SERVICE_CONNECTION connection;

ISG_SERVICE service;

// Verbindung zu ADS aufbauen

// Annahme: SDA-Port = 552, COM-Port = 553

isgServiceConnectionCreateADSLocal(552, 553, &connection);

// Service definieren

isgServiceCreate(

// diese UUID muss zu V.G.SERVICE.UUID passen

"560AACBF-6335-44a9-895A-8B27F3ED5E47",

// eine einfache Beschreibung des Service

"a simple square root service",

// eigentliche Service-Funktion definieren

&squareRoot,

// Verbindung des Service zu ADS definieren

&connection,

// anzulegender Service, Ergebnis-Puffer

&service

);

// das Service Interface pollen

isgServicePoll(&service);

};

## Software Development Kit (SDK)

ISG stellt ein einfaches SDK bereit, welches die schnelle Erstellung einfacher Services in C/C++ ermöglicht.

Das SDK enthält:

- Header- und Bibliotheksdateien für das Service Interface
- ein Beispielprojekt, das den Quadratwurzel-Service implementiert
- ein Beispiel-CNC-Programm, das den Service aufruft
- einen Batch-Service, der es erlaubt, einfache Windows-Batch-Dateien am Service-Interface lauschen zu lassen; eine C-Entwicklung entfällt

Nähere Informationen zu den benötigten ADS-Headern/ -Bibliotheken sind in der Textdatei "sdk/readme.txt" im Zip-Archiv zu finden.