Чтение структурированных данных с сервера OPC UA

#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). На основе полученного определения типа могут быть созданы классы для структурированных типов для кодирования / декодирования строки байтов в объекте расширения во время выполнения. Пожалуйста, откройте вопросы, если у сложного клиента возникают трудности с декодированием вашего структурированного типа.