2017-11-20 81 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: これは、任意の他の配列の値と同じように動作します。

関連する問題