当前位置: 代码迷 >> 综合 >> OPCUA-client-on_pushButton_connect_clicked
  详细解决方案

OPCUA-client-on_pushButton_connect_clicked

热度:92   发布时间:2024-03-09 08:17:04.0

void MainWindow::on_pushButton_connect_clicked()
{/***************************//获取URL地址******************************/QString str = ui->comboBox->currentText();char *url;QByteArray ba = str.toLatin1();url = ba.data();/***************************获取终端点******************************/UA_Client *client = UA_Client_new(UA_ClientConfig_default);UA_EndpointDescription* endpointArray = NULL;size_t endpointArraySize = 0;UA_StatusCode retval = UA_Client_getEndpoints(client, url,&endpointArraySize, &endpointArray);if(retval != UA_STATUSCODE_GOOD) {   //检测状态码UA_Array_delete(endpointArray, endpointArraySize, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);UA_Client_delete(client);return;}print("%i endpoints found\n", (int)endpointArraySize); //找到终端点for(size_t i=0;i<endpointArraySize;i++) {print("URL of endpoint %i is %.*s\n",(int)i,(int)endpointArray[i].endpointUrl.length,endpointArray[i].endpointUrl.data);}UA_Array_delete(endpointArray,endpointArraySize, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);/***************************连接到服务器  匿名连接******************************/retval = UA_Client_connect_username(client, url, "user1", "password");if(retval != UA_STATUSCODE_GOOD) {UA_Client_delete(client);return;}/***************************浏览一些对象******************************/print("Browsing nodes in objects folder:\n");  //浏览对象文件夹中的节点UA_BrowseRequest bReq;UA_BrowseRequest_init(&bReq);bReq.requestedMaxReferencesPerNode = 0;bReq.nodesToBrowse = UA_BrowseDescription_new();bReq.nodesToBrowseSize = 1;bReq.nodesToBrowse[0].nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER); //一个数字节点 浏览对象节点bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL; /* return everything */UA_BrowseResponse bResp = UA_Client_Service_browse(client, bReq);print("%-9s %-16s %-16s %-16s\n", "NAMESPACE", "NODEID", "BROWSE NAME", "DISPLAY NAME");   //4 NAMESPACE NODEID           BROWSE NAME      DISPLAY NAMEfor(size_t i = 0; i < bResp.resultsSize; ++i) {for(size_t j = 0; j < bResp.results[i].referencesSize; ++j) {UA_ReferenceDescription *ref = &(bResp.results[i].references[j]);if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_NUMERIC) {print("%-9d %-16d %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex,ref->nodeId.nodeId.identifier.numeric, (int)ref->browseName.name.length,ref->browseName.name.data, (int)ref->displayName.text.length,ref->displayName.text.data);} else if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_STRING) {print("%-9d %-16.*s %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex,(int)ref->nodeId.nodeId.identifier.string.length,ref->nodeId.nodeId.identifier.string.data,(int)ref->browseName.name.length, ref->browseName.name.data,(int)ref->displayName.text.length, ref->displayName.text.data);}/* TODO: distinguish further types */}}UA_BrowseRequest_deleteMembers(&bReq);UA_BrowseResponse_deleteMembers(&bResp);/***************************Same thing, this time using the node iterator 迭代器******************************/UA_NodeId *parent = UA_NodeId_new();*parent = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);UA_Client_forEachChildNodeCall(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),nodeIter, (void *) parent);UA_NodeId_delete(parent);/***************************Create a subscription 创建一个订阅******************************/
#ifdef UA_ENABLE_SUBSCRIPTIONSUA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,NULL, NULL, NULL);UA_UInt32 subId = response.subscriptionId;if(response.responseHeader.serviceResult == UA_STATUSCODE_GOOD)print("Create subscription succeeded, id %u\n", subId);UA_MonitoredItemCreateRequest monRequest =UA_MonitoredItemCreateRequest_default(UA_NODEID_STRING(1, "abcde"));UA_MonitoredItemCreateResult monResponse =UA_Client_MonitoredItems_createDataChange(client, response.subscriptionId,UA_TIMESTAMPSTORETURN_BOTH,monRequest, NULL, handler_TheAnswerChanged, NULL);if(monResponse.statusCode == UA_STATUSCODE_GOOD)print("Monitoring 'abcde', id %u\n", monResponse.monitoredItemId);/***************************The first publish request should return the initial value of the variable第一个发布请求应该返回变量的初始值******************************/UA_Client_runAsync(client, 1000);
#endif/***************************Read attribute 读取属性******************************//*  */UA_Int32 value = 0;print("\nReading the value of node (1, \"the.answer\"):\n");UA_Variant *val = UA_Variant_new();retval = UA_Client_readValueAttribute(client, UA_NODEID_STRING(1, "abcde"), val);if(retval == UA_STATUSCODE_GOOD && UA_Variant_isScalar(val) &&val->type == &UA_TYPES[UA_TYPES_INT32]) {value = *(UA_Int32*)val->data;print("the value is: %i\n", value);}UA_Variant_delete(val);/***************************Write node attribute  写入节点属性******************************/value++;print("\nWriting a value of node (1, \"the.answer\"):\n");UA_WriteRequest wReq;UA_WriteRequest_init(&wReq);wReq.nodesToWrite = UA_WriteValue_new();wReq.nodesToWriteSize = 1;wReq.nodesToWrite[0].nodeId = UA_NODEID_STRING_ALLOC(1, "abced");wReq.nodesToWrite[0].attributeId = UA_ATTRIBUTEID_VALUE;wReq.nodesToWrite[0].value.hasValue = true;wReq.nodesToWrite[0].value.value.type = &UA_TYPES[UA_TYPES_INT32];wReq.nodesToWrite[0].value.value.storageType = UA_VARIANT_DATA_NODELETE; /* do not free the integer on deletion */wReq.nodesToWrite[0].value.value.data = &value;UA_WriteResponse wResp = UA_Client_Service_write(client, wReq);if(wResp.responseHeader.serviceResult == UA_STATUSCODE_GOOD)print("the new value is: %i\n", value);UA_WriteRequest_deleteMembers(&wReq);UA_WriteResponse_deleteMembers(&wResp);/***************************Write node attribute (using the highlevel API) 写入节点属性(使用高级IP)******************************/value++;UA_Variant *myVariant = UA_Variant_new();UA_Variant_setScalarCopy(myVariant, &value, &UA_TYPES[UA_TYPES_INT32]);UA_Client_writeValueAttribute(client, UA_NODEID_STRING(1, "the.answer"), myVariant);UA_Variant_delete(myVariant);/***************************重新查看应答******************************/
#ifdef UA_ENABLE_SUBSCRIPTIONS/* Take another look at the.answer */UA_Client_runAsync(client, 100);/* Delete the subscription */if(UA_Client_Subscriptions_deleteSingle(client, subId) == UA_STATUSCODE_GOOD)print("Subscription removed\n");
#endif/***************************Call a remote method 使用远程路径******************************/
#ifdef UA_ENABLE_METHODCALLS/*  */UA_Variant input;UA_String argString = UA_STRING("Hello Server");UA_Variant_init(&input);UA_Variant_setScalarCopy(&input, &argString, &UA_TYPES[UA_TYPES_STRING]);size_t outputSize;UA_Variant *output;retval = UA_Client_call(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),UA_NODEID_NUMERIC(1, 62541), 1, &input, &outputSize, &output);if(retval == UA_STATUSCODE_GOOD) {print("Method call was successful, and %lu returned values available.\n",(unsigned long)outputSize);UA_Array_delete(output, outputSize, &UA_TYPES[UA_TYPES_VARIANT]);} else {print("Method call was unsuccessful, and %x returned values available.\n", retval);}UA_Variant_deleteMembers(&input);
#endif/***************************建立新的对象******************************/
#ifdef UA_ENABLE_NODEMANAGEMENTUA_NodeId obj_id;UA_ObjectAttributes obj_attr = UA_ObjectAttributes_default;obj_attr.displayName = UA_LOCALIZEDTEXT("en-US", "TheNewGreatNode");obj_attr.description = UA_LOCALIZEDTEXT("de-DE", "Hier koennte Ihre Webung stehen!");retval = UA_Client_addObjectNode(client,UA_NODEID_NUMERIC(1, 0),UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),UA_QUALIFIEDNAME(1, "TheGreatNode"),UA_NODEID_NUMERIC(1, 12134),obj_attr, &obj_id);if(retval == UA_STATUSCODE_GOOD )print("Created 'NewObject' with numeric NodeID %u\n", obj_id.identifier.numeric);/***************************New Integer Variable 新的整形变量******************************/UA_NodeId var_id;UA_VariableAttributes var_attr = UA_VariableAttributes_default;var_attr.displayName = UA_LOCALIZEDTEXT("en-US", "TheNewVariableNode");var_attr.description =UA_LOCALIZEDTEXT("en-US", "This integer is just amazing - it has digits and everything.");UA_Int32 int_value = 1234;/***************************This does not copy the value******************************/UA_Variant_setScalar(&var_attr.value, &int_value, &UA_TYPES[UA_TYPES_INT32]);var_attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;retval = UA_Client_addVariableNode(client,UA_NODEID_NUMERIC(1, 0), // Assign new/random NodeIDUA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),UA_QUALIFIEDNAME(0, "VariableNode"),UA_NODEID_NULL, // no variable typevar_attr, &var_id);if(retval == UA_STATUSCODE_GOOD )print("Created 'NewVariable' with numeric NodeID %u\n", var_id.identifier.numeric);
#endifUA_Client_disconnect(client);UA_Client_delete(client);fflush(stdout);return;
}

 

  相关解决方案