2016-10-24 2 views
0

В течение жизни я не могу найти ответ на то, что, по моему мнению, было бы простым вопросом - как найти тип данных для OPC-узла.UA Типы данных сервера OPC

Я пишу библиотеку OPC UA, которая предполагает создание подписки и контроль/обновление тегов в рамках этой подписки.

Запрос на запись в тег поступает из внешнего приложения и состоит из идентификатора подписки и тега вместе с значением объекта. Проблема в том, что этот объект неизменно является строкой (не спрашивайте), которая должна быть преобразована в соответствующий тип данных для тега. Итак, мне нужно выяснить, какой тип данных связан с тегом. На данный момент запись не выполняется с исключением типа несоответствия.

Вот мой код обновления:

// 
    // Extension methods 
    public bool Write<T>(long groupID, long tagID, T item) 
    { 
     var sub = FindSubscription(groupID); 
     try 
     { 
      if (sub != null) 
      { 
       var node = sub.MonitoredItems.FirstOrDefault(m => (long)m.Handle == tagID); 

       if (node != null) 
       { 
        bool result = false; 
        var nodesToWrite = BuildWriteValueCollection(node.DisplayName, Attributes.Value, item); 

        StatusCodeCollection results; 
        DiagnosticInfoCollection diag; 
        try 
        { 
         _session.Write(
         requestHeader: null, 
         nodesToWrite: nodesToWrite, 
         results: out results, 
         diagnosticInfos: out diag); 


         result = CheckReturnValue(results[0]); 

        } 
        catch (Exception ex) 
        { 

        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      LogMessage(String.Format("Write GroupID {0}, Tag {1}, Value {2}", groupID, tagID, item.ToString()), ex); 
     } 

     return false; 
    } 

Я искал возрасты, чтобы узнать, как определить тип данных узла, но без успеха. Итак, для MonitoredItem, как можно найти тип данных, чтобы я мог преобразовать строку в совместимый тип?

Благодаря

Steve

ответ

1

Прочитайте атрибут VariableNode в вопросе DataType.

+0

Спасибо, но как я могу получить это из MonitoredItem - я не вижу свойство DataType? –

+0

Из MonitoredItem вы берете свой NodeId и вызываете службу Read с запросом AttributeId.DataType. Я не знаю, как работает nodeopcua - возможно, он не читал больше, чем базовые атрибуты для вас, когда вы получили ссылку на узел, если таковые имеются, поэтому вам действительно нужно прочитать атрибут DataType с сервера. –

+0

Спасибо за дополнительную информацию ... и теперь у меня есть DataValue из 6? А это значит? Извините, но вы должны понять, что разговариваете с кем-то очень, очень плотным. Я написал несколько клиентских приложений DA, но я поражен тем, как трудно найти такой простой и очевидный запрос данных ... для каждой записи (из которых может быть много тысяч в минуту) m нужно сделать отдельный вызов, чтобы узнать тип данных узла, который я собираюсь записать .... У меня есть узел, я ЗНАЮ узел, почему бы это (тип данных) не быть свойством по умолчанию этот узел ??? –

Смежные вопросы