OPC UA 如何从服务器读取数据类型

OPC UA How to read a datatype from the server

我似乎想不通:

在写入标签之前,我需要知道它期望的数据类型(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 转换为我可以使用的东西。

如有任何帮助,我们将不胜感激。

谢谢

正在从 DataType 属性读取 returns OPC UA 类型的 NodeID。它可以是 OPC UA 规范中定义的 "standard" 类型之一,或者特定于服务器的类型。标准类型驻留在命名空间 0 中,这是您的情况(因为显示的节点 ID 中没有 "ns=..." 部分),"i=6" 代表 Int32。

有很多类型都有预定义的节点ID,你需要查阅OPC UA规范,或者stacks/SDKs附带的节点集文件(例如Opc.Ua.NodeSet.xml),以了解明白他们的意思。

该值为引用数据类型节点的 NodeId。您可以将该值与已知的 NodeId 值(.NET 中的 DataTypeIds 或其他东西,现在不确定)进行比较,或者您需要从地址 space.

中找到数据类型节点

在最近的版本中,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();
    }
});