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.
- Der externe Service wird gestartet und lauscht ab jetzt am Service Interface.
- Das CNC-Programm bereitet die Anfrage vor.
- Das CNC-Programm schreibt die Anfrage in das Service Interface und wartet auf eine Antwort.
- Nach der eingehenden Anfrage führt der externe Service seine Aufgabe aus.
- Nach Beendigung seiner Aufgabe bereitet der externe Service eine Antwort für das CNC-Programm vor.
- Der externe Service schreibt die Antwort zurück in das Service Interface.
- Das CNC-Programm empfängt die Antwort und setzt seine Bearbeitung fort.
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, // 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.