如何使用Softing工具包从OPC UA服务器回调异步读取操作时从DataValue响应中获取NodeId详细信息

问题描述 投票:0回答:1

image shows the uint32 value but i need the NodeId details too, which is "Counter1" as in the NodeId in readAsync 我正在使用Softing OPC UA工具包来开发客户端。使用session-> readAsync()我尝试从OPC UA服务器读取值,使用请求的DataValue向量调用onReadComplete的回调方法,我可以从DataValue获取值但无法使用namespaceIndex,indentifierType获取NodeId,标识符。在Visual Studio调试器中,这些值无法读取内存。

读取异步:

std::vector<ReadValueId> readValueId1s;
ReadValueId ReadValueId1;
ReadValueId1.setNodeId(NodeId(2, _T("Counter1")));
ReadValueId1.setAttributeId(EnumAttributeId_Value);
readValueId1s.push_back(ReadValueId1);

// read the variable asynchronously
result = session->readAsync(pRdReq, EnumTimestampsToReturn_Both, 
readValueId1s, 0, pRdReq->getTransId());

回调方法:

void TestSession::onReadComplete(void* requestHandle, EnumStatusCode 
serviceResult, std::vector<DataValue>& values)
{
    for (unsigned int i = 0; i < values.size(); i++) {
        std::wcout << values[i].getValue()->getNodeId().toString() << std::endl;
    }
}
c++ opc opc-ua
1个回答
1
投票

请查看OPC UA Specification Part 4 - Services章节5.10.2阅读

OPC UA读取响应包含DataValue数组。每个OPC UA DataValue结构都包含

  • 的StatusCode
  • SourceTimestamp
  • ServerTimestamp
  • SourcePicoseconds
  • ServerPicoseconds

OPC UA值结构包含

  • ArrayType(在你的情况下为0 = Scalar)
  • DataType(在您的情况下为6 = OpcUaType_Int32)
  • 值(来自Union,取决于ArrayType和DataType值)

所以实际上在你的情况下,值是Int32 Variant Union值= 46132370

编辑

ReadResponse DataValue Array中DataValue的顺序与您发送的ReadRequest中的Read NodeId顺序匹配。然后,您应该在发送ReadRequest之前保存信息,以便知道DataValue [“X”]是哪个NodeId。

© www.soinside.com 2019 - 2024. All rights reserved.