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 如何从服务器读取数据类型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 opc ua 从 PLC 读取信号?

使用 C# 客户端读取 OPC UA 节点属性值

OPC UA open62541历史数据读取客户端未编译

iNeuOS工业互联平台,增加OPC UA驱动,同步和订阅方式读取数据

opc-ua milo项目的骆驼路线

我应该从哪里开始使用 OPC-UA 客户端?