В течение жизни я не могу найти ответ на то, что, по моему мнению, было бы простым вопросом - как найти тип данных для 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
Спасибо, но как я могу получить это из MonitoredItem - я не вижу свойство DataType? –
Из MonitoredItem вы берете свой NodeId и вызываете службу Read с запросом AttributeId.DataType. Я не знаю, как работает nodeopcua - возможно, он не читал больше, чем базовые атрибуты для вас, когда вы получили ссылку на узел, если таковые имеются, поэтому вам действительно нужно прочитать атрибут DataType с сервера. –
Спасибо за дополнительную информацию ... и теперь у меня есть DataValue из 6? А это значит? Извините, но вы должны понять, что разговариваете с кем-то очень, очень плотным. Я написал несколько клиентских приложений DA, но я поражен тем, как трудно найти такой простой и очевидный запрос данных ... для каждой записи (из которых может быть много тысяч в минуту) m нужно сделать отдельный вызов, чтобы узнать тип данных узла, который я собираюсь записать .... У меня есть узел, я ЗНАЮ узел, почему бы это (тип данных) не быть свойством по умолчанию этот узел ??? –