如何通过客户端

时间:2017-11-20 10:29:48

标签: client client-server opc-ua open62541

我一直在尝试使用 open62541 堆栈执行简单的 OPC UA客户端服务器应用程序。我可以从open62541实现的服务器访问该值。但我需要知道, open62541客户端如何解释/检索服务器的数组值?

例: 这就是我对单一价值的看法 -

 UA_Client_readValueAttribute(client, UA_NODEID_STRING(1, "value"), &value);
    if(status == UA_STATUSCODE_GOOD &&
       UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_INT32])) {
        printf("value is: %i\n", *(UA_Int32*)value.data);
    }

1 个答案:

答案 0 :(得分:1)

以下是如何读取命名空间数组的示例。 它的工作方式与任何其他数组值相同:

UA_ReadRequest request;
UA_ReadRequest_init(&request);
UA_ReadValueId id;
UA_ReadValueId_init(&id);
id.attributeId = UA_ATTRIBUTEID_VALUE;
id.nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY);
request.nodesToRead = &id;
request.nodesToReadSize = 1;

UA_ReadResponse response = UA_Client_Service_read(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_STRING])
    retval = UA_STATUSCODE_BADTYPEMISMATCH;

if(retval != UA_STATUSCODE_GOOD) {
    UA_ReadResponse_deleteMembers(&response);
    return retval;
}

retval = UA_STATUSCODE_BADNOTFOUND;
UA_String *ns = (UA_String *)response.results[0].value.data;
for(size_t i = 0; i < response.results[0].value.arrayLength; ++i){
    printf("The NS is %*.s", (int)ns[i].length, ns[i].data);
}

UA_ReadResponse_deleteMembers(&response);

重要的是response.results[0].value.data保存数组,response.results[0].value.arrayLength保存数组本身的长度。