Типы данных OPC-сервера UA

#opc-ua

#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 как бы найти тип данных, чтобы я мог преобразовать строку в совместимый тип?

Спасибо

Стив

Ответ №1:

Прочитайте DataType атрибут VariableNode , о котором идет речь.

Комментарии:

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

2. Из MonitoredItem вы берете его NodeID и вызываете службу чтения, запрашивающую AttributeID. Тип данных. Я не знаю, как работает nodeopcua — возможно, он не прочитал для вас ничего, кроме базовых атрибутов, когда вы получили ссылку на узел, если таковая имеется, поэтому вам нужно на самом деле прочитать атрибут DataType с сервера.

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

4. Это является одним из встроенных свойств VariableNode, но для того, чтобы сократить передачу данных и сложность во время просмотра, возвращаются только абсолютные необходимые атрибуты. Ожидается, что клиентские приложения будут либо считывать необходимую им дополнительную информацию в процессе просмотра, либо при запуске приложения. Я не могу сказать, какой стек или инструментарий вы используете, поэтому у меня нет ни малейшего представления, что можно было бы сделать для вас.