【问题标题】:C# opc-client .net apiC# opc-client .net api
【发布时间】:2011-04-13 05:49:05
【问题描述】:

我正在编写 opc 客户端,使用来自 opc 基金会的 .NET API。

在我只看到的示例中,项目的名称是硬编码的,例如:

items[0] = new Opc.Da.Item();
items[0].ItemName = "blahblahblah";

我想要的不是亲手写下所有物品的名称。 例如,我想将服务器中的所有项目加载到树中。 我该怎么做?

【问题讨论】:

  • 在我看来您正在查看错误的样本。那将是服务器代码,在 OPC 中更为常见。

标签: c# opc


【解决方案1】:

好吧,我不熟悉您的 opc 客户端库,但您应该能够浏览服务器项目。这是许多独立 OPC 客户端使用的通用功能。

【讨论】:

    【解决方案2】:

    您可以使用以下结构浏览服务器:

    using Opc.Da;
    using Server=Opc.Da.Server;
    using Factory=OpcCom.Factory;
    
    string urlstring = string.Format("opcda://{0}/{1}/{{{2}}}", _hostName, _serverName, serverid);
    Server s = new Server(new Factory(), new URL(urlstring));
    s.Connect();
    ItemIdentifier itemId = null;
    BrowsePosition position;
    BrowseFilters filters = new BrowseFilters() {BrowseFilter = browseFilter.item};
    BrowseElement[] elements = s.Browse(itemId, filters, out position);
    

    标签在元素[i].Name中。

    【讨论】:

    • 是的。我使用了相同的代码。但。我在服务器上有文件夹......你的代码没有显示它们
    • 更改 {BrowseFilter = browseFilter.item};到 {BrowseFilter = browseFilter.all};
    【解决方案3】:

    您从 XML 文件加载项目。您可以使用任意数量的项目创建一次 XML 文件,然后仅在需要时对其进行编辑。例如,要解析它,您可以使用 MSXML DOM。 VB.NET 中有一个解析器Parsing XML file in VB.NET using DOM。但是您可以在 C# 中搜索实现。

    【讨论】:

      【解决方案4】:
      Public Function Browse(ByRef node As TreeNode, Optional id As Opc.ItemIdentifier = Nothing) As Integer
          Try
              Dim clone As Opc.Da.Server = your_connected_server
              Dim filters As New Opc.Da.BrowseFilters
              filters.BrowseFilter = Opc.Da.browseFilter.all
              Dim pos As Opc.Da.BrowsePosition = Nothing
              Dim elements() As Opc.Da.BrowseElement = clone.Browse(id, filters, pos)
              If (elements IsNot Nothing) Then
                  For Each element As Opc.Da.BrowseElement In elements
                      Console.WriteLine(element.ItemName)
                      AddBrowseElement(node, element)
                      If (element.HasChildren = True) Then
                          id = New Opc.ItemIdentifier(element.ItemPath, element.ItemName)
                          Browse(node.Nodes.Item(node.Nodes.Count - 1), id)
                      End If
                  Next
              End If
              Return 0
          Catch ex As Exception
              RaiseEvent OnException(GetCurrentMethod, ex)
              Return -1
          End Try
      End Function
      
      Private Sub AddBrowseElement(ByRef parent As TreeNode, element As Opc.Da.BrowseElement)
          Dim node As TreeNode = New TreeNode(element.Name)
          node.Text = element.Name
          node.Tag = element
      
          ' add properties
          If (element.Properties IsNot Nothing) Then
              For Each [property] As Opc.Da.ItemProperty In element.Properties
                  AddItemProperty(node, [property])
              Next
          End If
          ' add to parent.
          parent.Nodes.Add(node)
      End Sub
      

      【讨论】:

      • 您使用 TreeNode 对象调用 Browse 函数: Dim node As New TreeNode("Root") Browse(node) 然后 Browse 函数自递归调用它。完成后,您将拥有节点控件中的所有服务器标签。
      【解决方案5】:

      使用 XML 或 NLOG 或 log4NET 文件加载标签项。

      使用 opcdaauto.dll。它是供 OPC 基金会成员使用的免费 dll

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多