2016-10-24 281 views
0

對於我的生活,我無法找到我認爲會是一個簡單問題的答案 - 如何找到OPC節點的數據類型。UA OPC服務器數據類型

我正在寫一個UA OPC庫,其中涉及創建一個訂閱以及此訂閱中的標記的監視/更新。

寫入標籤的請求來自外部應用程序,由訂閱和標籤ID以及對象值​​組成。問題是這個對象總是一個字符串(不要求),它需要被轉換爲標籤的適當數據類型。所以,我需要找出哪些數據類型與標籤關聯。目前,寫入失敗的類型不匹配異常。

這裏是我的更新代碼:

// 
    // Extension methods 
    public bool Write<T>(long groupID, long tagID, T item) 
    { 
     var sub = FindSubscription(groupID); 
     try 
     { 
      if (sub != null) 
      { 
       var node = sub.MonitoredItems.FirstOrDefault(m => (long)m.Handle == tagID); 

       if (node != null) 
       { 
        bool result = false; 
        var nodesToWrite = BuildWriteValueCollection(node.DisplayName, Attributes.Value, item); 

        StatusCodeCollection results; 
        DiagnosticInfoCollection diag; 
        try 
        { 
         _session.Write(
         requestHeader: null, 
         nodesToWrite: nodesToWrite, 
         results: out results, 
         diagnosticInfos: out diag); 


         result = CheckReturnValue(results[0]); 

        } 
        catch (Exception ex) 
        { 

        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      LogMessage(String.Format("Write GroupID {0}, Tag {1}, Value {2}", groupID, tagID, item.ToString()), ex); 
     } 

     return false; 
    } 

我搜索了好半天,找出如何確定節點的數據類型,但沒有成功。因此,對於MonitoredItem,如何找到數據類型以便我可以將字符串轉換爲兼容類型?

感謝

史蒂夫

回答

1

閱讀有關VariableNodeDataType屬性。

+0

謝謝,但我怎麼從一個MonitoredItem獲得 - 我看不到DataType屬性? –

+0

從MonitoredItem獲取其NodeId並調用請求AttributeId.DataType的Read服務。我不知道nodeopcua是如何工作的 - 當你有一個對節點的引用時,它可能沒有爲你讀取基本屬性,如果有的話,所以你需要從服務器上讀取DataType屬性。 –

+0

感謝您的額外信息...現在我有一個6的DataValue?這意味着什麼?對不起,你必須意識到你正在和一個非常非常密集的人談話。我已經寫了很多DA客戶端應用程序,但是我很驚訝於找出這樣一個簡單明顯的數據請求是多麼困難......對於每個寫入(每分鐘可能有數千個數據)我不得不做一個單獨的調用來找出我要寫入的節點的數據類型....我有節點,我知道節點,爲什麼這個(數據類型)不是一個默認屬性這個節點? –