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

На рисунке показано значение 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;
}
}

0

Решение

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

Ответ OPC UA Read содержит массив 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»] является.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]