#c# #.net #opc-ua
#c# #.net #opc-ua
Вопрос:
Я пытаюсь прочитать некоторые данные с сервера OPC UA, используя библиотеку opc-ua-client. Удалось подключиться к серверу и прочитать несколько простых переменных, но возникли проблемы при чтении структурированных значений. Тем не менее, я могу просматривать эти структурированные значения с помощью сторонних инструментов, таких как UaExpert.
Это фрагмент кода:
var readRequest = new ReadRequest
{
NodesToRead = new[] { new ReadValueId { NodeId = NodeId.Parse(nodeId), AttributeId = AttributeIds.Value } }
};
var response = channel.ReadAsync(readRequest).Resu<
var result = response.Results[0].GetValueOrDefault<ExtensionObject>();
Вопрос в том, как я должен преобразовать ExtensionObject в базовый реальный объект? Тело ответа двоично сериализовано в систему.Поле Byte [] и не знаю, как его десериализовать. Я знаю поля и типы структуры, поэтому определил ее в коде (даже украсив пространством имен, предоставленным сервером) следующим образом:
[BinaryEncodingId("nsu=urn:OMRON:NxOpcUaServer:FactoryAutomation;i=5005")]
private class MES_WRITE_STRUCT : Structure
{
uint Message_NUM { get; set; }
//Some other fields
DateTime Time_Stamp { get; set; }
}
Вещи, которые я пробовал (и потерпел неудачу) до сих пор:
-
Приведение методом перебора:
var eObject = (MES_WRITE_STRUCT)result.GetValueOrDefault<ExtensionObject>();
-
Прочитайте ответ как ожидаемый тип, а не используйте универсальный объект:
var eObject = result.GetValueOrDefault<MES_WRITE_STRUCT>();
-
Используйте свойство Variant вместо Value (тот же результат, что и при
использовании Value):result.Variant.GetValue();
-
Создайте двоичный считыватель и попытайтесь десериализовать его в ожидаемый
класс.
Возможно, я использую неправильный подход, и структурированные значения следует читать по-другому. Или даже библиотека не поддерживает структурированные переменные (доступно не так много документации). Или просто использование неправильного типа при определении пользовательского класса в .NET и, следовательно, приведение к сбою.
Я полностью застрял, любая информация или рекомендации приветствуются.
PS: Я не привязан к этой библиотеке и могу переключиться на другую (желательно без лицензий, но если действительно стоит рассмотреть возможность покупки).
Комментарии:
1. любые обновления по этой проблеме можете ли вы поделиться тем же кодом, если нашли решение?
Ответ №1:
Одним из способов было бы использовать XML-описание информационной модели (так называемые наборы узлов), которые вы хотите использовать, и использовать компилятор модели из OPC Foundation для создания из него классов C #. Эти классы могут быть интегрированы в ваше решение и использоваться для десериализации.
И пример (с использованием библиотек OPC Foundation) можно найти здесь
Комментарии:
1. у вас есть пример, на который я могу посмотреть?
2. Пример уже связан как часть моего сообщения, вот еще один.
Ответ №2:
Другой способ — OPC Foundation .ЧИСТЫЙ стандартный клиент, который имеет пакет nuget библиотеки расширений, называемый сложным клиентом. Он содержит логику для чтения определения структурированного типа с сервера из словаря (V1.03) или с использованием определения типа данных (V1.04). На основе полученного определения типа могут быть созданы классы для структурированных типов для кодирования / декодирования строки байтов в объекте расширения во время выполнения. Пожалуйста, откройте вопросы, если у сложного клиента возникают трудности с декодированием вашего структурированного типа.