#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, но для того, чтобы сократить передачу данных и сложность во время просмотра, возвращаются только абсолютные необходимые атрибуты. Ожидается, что клиентские приложения будут либо считывать необходимую им дополнительную информацию в процессе просмотра, либо при запуске приложения. Я не могу сказать, какой стек или инструментарий вы используете, поэтому у меня нет ни малейшего представления, что можно было бы сделать для вас.