Как получить подробности NodeId из ответа DataValue при обратном вызове операции асинхронного чтения с сервера OPC UA с помощью инструментария Softing - PullRequest
0 голосов
/ 05 сентября 2018

изображение показывает значение uint32, но мне также нужны подробности NodeId, который является "Counter1", как в NodeId в readAsync Я использую набор инструментов Softing OPC UA для разработки клиента. С помощью session-> readAsync () я пытаюсь прочитать значение с сервера OPC UA, вызывается метод обратного вызова onReadComplete с запрошенным вектором DataValue, я могу получить значение из DataValue, но не могу получить NodeId с namespaceIndex, indentifierType, идентификатор. В отладчике 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;
    }
}

1 Ответ

0 голосов
/ 10 сентября 2018

Пожалуйста, ознакомьтесь с Спецификацией OPC UA, часть 4 - Услуги Глава 5.10.2 Читать

Ответ чтения OPC UA содержит массив DataValue. Каждая структура OPC UA DataValue содержит

  • StatusCode
  • SourceTimestamp
  • ServerTimestamp
  • SourcePicoseconds
  • ServerPicoseconds
  • Значение

Структура значения OPC UA содержит

  • ArrayType (0 в вашем случае = Скалярный)
  • DataType (6 в вашем случае = OpcUaType_Int32)
  • Значение (из объединения в зависимости от ArrayType и значения DataType)

Так что на самом деле в вашем случае это значение Int32 Variant Union = 46132370

Редактировать

Порядок DataValue в массиве ReadResponse DataValue совпадает с порядком чтения NodeId из отправленного вами запроса ReadRequest. Затем вы должны сохранить информацию перед отправкой ReadRequest, чтобы узнать, для какого NodeId значение DataValue ["X"] является.

...