我正在编写 OPC 客户端,使用来自 OPC 基金会的 .NET API。
在示例中,我只看到了硬编码项目名称的情况,例如:
items[0] = new Opc.Da.Item();
items[0].ItemName = "blahblahblah";
我想做的是不用手写所有项目名称,而是从服务器加载所有项目,例如加载到树形结构中。我该怎么做?
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);
嗯,我不熟悉你的 OPC 客户端库,但是你应该能够浏览服务器项。这是许多独立 OPC 客户端常用的功能。
使用XML或NLOG或log4NET文件来加载标签项。
使用opcdaauto.dll。这是一个免费的OPC基金会成员DLL。
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