/* This work is licensed under a Creative Commons CCZero 1.0 Universal License. * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */ #include #include #include "custom_datatype.h" #include int main(void) { /* Make your custom datatype known to the stack */ UA_DataType types[1]; types[0] = PointType; /* Attention! Here the custom datatypes are allocated on the stack. So they * cannot be accessed from parallel (worker) threads. */ UA_DataTypeArray customDataTypes = {NULL, 1, types}; UA_Client *client = UA_Client_new(); UA_ClientConfig *cc = UA_Client_getConfig(client); UA_ClientConfig_setDefault(cc); cc->customDataTypes = &customDataTypes; UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840"); if(retval != UA_STATUSCODE_GOOD) { UA_Client_delete(client); return (int)retval; } UA_Variant value; /* Variants can hold scalar values and arrays of any type */ UA_Variant_init(&value); UA_NodeId nodeId = UA_NODEID_STRING(1, "3D.Point"); retval = UA_Client_readValueAttribute(client, nodeId, &value); if(retval == UA_STATUSCODE_GOOD) { Point *p = (Point *)value.data; printf("Point = %f, %f, %f \n", p->x, p->y, p->z); } /* Clean up */ UA_Variant_clear(&value); UA_Client_delete(client); /* Disconnects the client internally */ return EXIT_SUCCESS; }