我对从客户端读取[Method节点的InputArguments和OutputArgument节点感兴趣。假设我有2个InputArgument,并且我想读取第一个InputArgument。
UA_Variant v;
UA_NodeId n = UA_NODEID_NUMERIC(0, node_id_inp_arg);
UA_Client_readValueAttribute(client, n, &v);
UA_Argument* a = (UA_Argument*)v.data;
std::cout<<(char*)a[0].name.data<<"\n"; // Prints junk
std::cout<<a[0].arrayDimensionsSize<<"\n"; // Works
//Need to access other attributes as well
我的操作如上所述,但是很遗憾没有成功。任何可以帮助的人都将不胜感激。我也想对OutputArguments做同样的事情。谢谢。
方法在地址空间中没有输入和输出参数,因此您无法“读取”它们。输入和输出参数传递给CallMethod服务或从CallMethod服务传递。 (在地址空间中可能有输入和输出参数的描述,但我认为这不是您想要的)。
open62541中有UA_Client_CallServerMethod来调用UA方法。
我想出了一个解决方案,但这不是很简单
UA_ReadRequest request;
UA_ReadValueId id;
UA_ReadRequest_init(&request);
UA_ReadValueId_init(&id);
id.attributeId = UA_ATTRIBUTEID_VALUE;
id.nodeId = node; /* NodeId of the Input or Output Argument*/
request.nodesToRead = &id;
request.nodesToReadSize = 1;
size_t argLen = argument_length; /* Cardinatlity of argument */
UA_ReadResponse response = UA_Client_Service_read(m_client, request);
UA_StatusCode retval = UA_STATUSCODE_GOOD;
if(response.responseHeader.serviceResult != UA_STATUSCODE_GOOD){
retval = response.responseHeader.serviceResult;
} else if(response.resultsSize != 1 || !response.results[0].hasValue){
retval = UA_STATUSCODE_BADNODEATTRIBUTESINVALID;
}else if(response.results[0].value.type != &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]){
retval = UA_STATUSCODE_BADTYPEMISMATCH;
}if(retval != UA_STATUSCODE_GOOD) {
UA_ReadResponse_deleteMembers(&response);
return retval;
}
retval = UA_STATUSCODE_BADNOTFOUND;
UA_ExtensionObject *value = reinterpret_cast<UA_ExtensionObject*>(response.results[0].value.data);
for(size_t l(0); l < argLen; l++){
UA_Argument* arg = reinterpret_cast<UA_Argument*>(value[l].content.decoded.data);
/* Do my stuff*/
}