OPC UA 如何从服务器读取数据类型
Posted
技术标签:
【中文标题】OPC UA 如何从服务器读取数据类型【英文标题】:OPC UA How to read a datatype from the server 【发布时间】:2017-03-08 16:19:55 【问题描述】:我似乎无法弄清楚这一点:
在写入标签之前,我需要知道它期望的数据类型(mywrite 函数接收的值始终是字符串)。
我意识到您必须从服务器读取数据类型,这是我的代码,但我不知道如何使用返回的信息:
var nodesToRead = BuildReadValueIdCollection(node.DisplayName, Attributes.DataType);
DataValueCollection readResults;
DiagnosticInfoCollection diag;
_session.Read(
requestHeader: null,
maxAge: 0,
timestampsToReturn: TimestampsToReturn.Neither,
nodesToRead: nodesToRead,
results: out readResults,
diagnosticInfos: out diag);
var val = readResults[0];
我如何使用 val
来确定数据类型是什么?
我是使用 Val.Value
还是 Val.WrappedValue
还是 Val.WrappedValue.Value
(有什么区别?)
我用来测试的标签返回了Val = "i=6".....
这是指什么?
“6”是什么数据类型和
如何将 val 转换为我可以使用的东西。
任何帮助将不胜感激。
谢谢
【问题讨论】:
【参考方案1】:从 DataType 属性中读取会返回 OPC UA 类型的 NodeID。它可以是 OPC UA 规范中定义的“标准”类型之一,也可以是特定于服务器的类型。标准类型位于命名空间 0 中,这是您的情况(因为显示的节点 ID 中没有“ns=...”部分),“i=6”代表 Int32。
有许多类型具有预定义的节点 ID,您需要查阅 OPC UA 规范或堆栈/SDK 随附的节点集文件(例如 Opc.Ua.NodeSet.xml),以确定什么他们的意思。
【讨论】:
谢谢你,非常有用。我是否必须将节点转换为字符串才能进行比较(即 case "i=6" : vartype = Int32 ... etc)? 在 OPC Foundation 的 .NET 堆栈中,如果这是我们在这里讨论的内容,则该值应为 Opc.Ua.NodeId 类型,该类型具有 (ushort) NamespaceIndex、IdType、Identifier 等属性. 我建议使用这些,或者 NodeId 上的相等性来进行比较。字符串形式只是为了让节点 ID 便于人类阅读。【参考方案2】:该值是引用数据类型节点的 NodeId。您可以将该值与已知的 NodeId 值(.NET 中的 DataTypeIds 或其他东西,现在不确定)进行比较,或者您需要从地址空间中找到数据类型节点。
【讨论】:
【参考方案3】:在最近的版本中,node-opcua 客户端已经扩展了一个实用函数ClientSession#getBuiltInDataType
,它可以为你做这件事。
var nodeId = coerceNodeId("ns=411;s=Scalar_Simulation_Int64");
session.getBuiltInDataType(nodeId,function(err,dataType)
if(!err)
console.log("Use data Type",dataType," to write into UAVariable", nodeId.toString();
);
【讨论】:
以上是关于OPC UA 如何从服务器读取数据类型的主要内容,如果未能解决你的问题,请参考以下文章