Description
The Service Interface consists of 5 V.G. variables. Each CNC channel has its own Service Interface.
V.G.SERVICE.UUID
The string variable "V.G.SERVICE.UUID” contains a unique identifier to identify the external service. Several services can listen on the Service Interface at the same time but only the service with the matching UUID will respond to the request.
V.G.SERVICE.REQUEST
The string variable "V.G.SERVICE.REQUEST” contains the request. The Service Interface places no format restrictions on this variable. Only the CNC program and the external service can correctly assign and interpret this variable.
The length of this variable is limited to 128 bytes.
V.G.SERVICE.REQUEST_STATE
For a listening external service, a value unequal to 0 in "V.G.SERVICE.REQUEST_STATE" indicates that a request was issued. The Service Interface ensures that the service only starts its task when the value of the variable is unequal to 0. The rows
ensure that a listening external service with matching UUID can start its work.
The variable "V.G.SERVICE.REQUEST_STATE” in the Service Interface has no other semantic meaning. To simplify processes, this Service Interface sets this variable to 0 when the external service has finished its task.
V.G.SERVICE.RESPONSE_STATE
The variable "V.G.SERVICE.RESPONSE_STATE" is the counterpart of the "V.G.SERVICE.REQUEST_STATE” for the response. Typically, this variable is written by the external service after it has finished its task. The CNC program waits for the variable V.G.SERVICE.RESPONSE to assume a particular value before continuing its process. For example, this variable can be used to return error codes or results. In the CNC program above, the rows
ensure that the CNC program waits until the external service finishes its task. The external service must be implemented accordingly, i.e. it must return a value of unequal to 0 when it ends.
Otherwise, the variable V.G.SERVICE.RESPONSE_STATE has no other semantic meaning in the Service Interface. To simplify processes, the Service Interface sets this variable to 0 when the CNC program writes the variable "V.G.SERVICE.REQUEST_STATE".
V.G.SERVICE.RESPONSE
The string variable "V.G.SERVICE.RESPONSE” contains the response of the external service. In analogy to "V.G.SERVICE.REQUEST", "V.G.SERVICE.RESPONSE” is only limited in its length (128 bytes), not in its format.
The task of the CNC program is to correctly interpret the variable.
Process
The typical process is as follows.
- The external service is started and listens to the Service Interface from then on.
- The CNC program prepares the request.
- The CNC program writes the request on the Service Interface and waits for a response.
- After the request is received, the external service executes its task.
- After its task is finished, the external service prepares a response for the CNC program.
- The external service writes the response back to the Service Interface.
- The CNC program receives the response and continues its process.

Programming Example
Process in Service Interface
N00010 ; move
N00020 G00 X10
N00040 ; wait for end of movement
N00050 #FLUSH CONTINUE
N00070 ; prepare request for Service Interface
N00080 V.G.SERVICE.UUID = "560AACBF-6335-44a9-895A-B27F3ED5E47"
N00090 V.G.SERVICE.REQUEST = "3"
N00110 ; send request
N00120 V.G.SERVICE.REQUEST_STATE = 1
N00140 ; wait for response
N00150 #WAIT FOR V.G.SERVICE.RESPONSE_STATE != 0
N00170 ; process response
N00180 #MSG SAVE EXCLUSIVE ["response = %s", V.G.SERVICE.RESPONSE]
N00200 ; continue processing
N00210 G00 X20
N00230 ; end
N00240 M30
|
Programming Example
Square root service - define service
//
// Service function that interprets the request as numeral
// and returns the square root of the numeral as response.
//
ISG_SERVICE_CODE squareRoot(ISG_SERVICE * service, char * request, ADS_UINT32 requestState, char * response, size_t maxResponseSize, ADS_UINT32 * responseState)
{
// interpret the request as numeral
double x = atof(request);
// check whether the numeral is non-negative
if (x >= 0)
{
// if yes, calculate the square root
double y = sqrt(x);
// convert root into string
// and write quotient in response buffer
sprintf_s(response, maxResponseSize, "%f", y);
// set response status to 1 to signal success
*responseState = 1;
}
else
{
// otherwise write error message in the
// response buffer
sprintf_s(response, maxResponseSize,
"ERROR: cannot calc square root of negative number %f", x); // set response status to 99 to signal an
// error
*responseState = 99;
}
// the service function itself was not finished successfully
return ISG_SERVICE_CODE_OK;
}
|
Programming Example
Start service, set up ADS connection and register service
//
// Sets up connection to ADS and defines
// and activates the square root service.
//
void exampleSquareRootService()
{
// declare connection and service
ISG_SERVICE_CONNECTION connection;
ISG_SERVICE service;
// set up connection to ADS
// Assumption: SDA-Port = 552, COM-Port = 553
isgServiceConnectionCreateADSLocal(552, 553, &connection);
// define service
isgServiceCreate(
// this UUID must match with V.G.SERVICE.UUID
"560AACBF-6335-44a9-895A-8B27F3ED5E47",
// a simple description of the service
"a simple square root service",
// define actual service function
&squareRoot,
// define connection of service to ADS
&connection,
// service to be created, result buffer
&service
);
// poll service interface
isgServicePoll(&service);
};
|
Software Development Kit (SDK)
ISG provides a simple SDK to create simple services quickly in C/C++.
The SDK contains:
- Header and library files for the Service Interface
- A sample project which implements the square root service
- A sample CNC program which invokes the service
- A batch service which listens to simple Windows batch files on the Service Interface; no C development is needed
For more information on the required ADS headers/libraries, refer to the text file "sdk/readme.txt” in the zip archive.