2016-10-26 431 views
1

我似乎無法弄清楚這一個:OPC UA如何從服務器讀取數據類型

前寫標籤,我需要知道什麼樣的數據類型,它希望(該值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.ValueVal.WrappedValueVal.WrappedValue.Value(無論區別是?)

我一直在使用測試標籤返回Val = "i=6".....

這是什麼指的是?

什麼數據類型是「6」,

如何轉換VAL的東西,我可以使用。

任何幫助將不勝感激。

謝謝

回答

2

從DataType屬性中讀取返回OPC UA類型的NodeID。它可以是OPC UA規範中定義的「標準」類型之一,也可以是特定於服務器的某種類型。標準類型駐留在命名空間0中,這是您的情況(因爲在顯示的節點ID中沒有「ns = ...」部分),「i = 6」代表Int32。

預定義的節點ID有很多種類型,您需要查閱OPC UA規範或堆棧/ SDK附帶的節點集文件(例如Opc.Ua.NodeSet.xml)以找出他們是什麼意思。

+0

謝謝你,非常有用。是否必須將節點轉換爲字符串才能執行比較(即「i = 6」:vartype = Int32 ...等)? –

+0

在OPC基金會的.NET堆棧中,如果這是我們在這裏討論的內容,則值應該是Opc.Ua.NodeId類型,此類型具有像(ushort)NamespaceIndex,IdType,Identifier等屬性。我推薦使用這些屬性,或者NodeId上的相等,做出比較。字符串形式僅用於使人類可識別的節點ID。 – ZbynekZ

1

該值是引用數據類型節點的NodeId。您可以將該值與已知的NodeId值(.NET中的DataTypeId或其他值,不確定此值)相比較,或者您需要從地址空間中查找數據類型節點。

0

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