2017-11-20 12 views
0

나는 open62541 스택을 사용하여 간단한 OPC UA 클라이언트 서버 응용 프로그램을 수행하려고 노력했습니다. open62541 구현 된 서버에서 값에 액세스 할 수 있습니다. 하지만 나는 서버의 배열 값을 open62541 클라이언트에 의해 어떻게 해석 할 수 있는지 알아야합니다.opcua 서버에서 클라이언트별로 배열 값을 읽는 방법

예 : 나 단일 부가가치 위해 어떻게 이것은

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

여기 공간 어레이를 판독하는 방법의 예이다. 배열 자체의 길이를

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 : 그것은 다른 배열 값과 같은 방식으로 작동합니다.