3

我似乎无法弄清楚这一点:

在写入标签之前,我需要知道它期望的数据类型(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.Valueor Val.WrappedValueor Val.WrappedValue.Value(无论有什么区别?)

我用来测试的标签已经返回 Val = "i=6".....

这是指什么?

什么数据类型是“6”和

如何将 val 转换为我可以使用的东西。

任何帮助将不胜感激。

谢谢

4

3 回答 3

6

从 DataType 属性中读取会返回 OPC UA 类型的 NodeID。它可以是 OPC UA 规范中定义的“标准”类型之一,也可以是特定于服务器的类型。标准类型位于命名空间 0 中,这是您的情况(因为显示的节点 ID 中没有“ns=...”部分),“i=6”代表 Int32。

有许多类型具有预定义的节点 ID,您需要查阅 OPC UA 规范或堆栈/SDK 随附的节点集文件(例如 Opc.Ua.NodeSet.xml),以了解它们的含义。

于 2016-10-26T11:11:41.883 回答
1

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

于 2016-10-26T11:12:21.423 回答
1

在最近的版本中,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();
    }
});    
于 2016-12-20T08:43:03.657 回答