Hallo,
Ik weet niet of mensen hier bekend zijn met OPC, maar ik probeer het toch aangezien ik zelf een heel klein beetje vast zit ermee.
Ik ben bezig een opc client te maken. In deze client maak ik gebruik van een treeview en een listview. De treeview laat zien wat er in de server staat door dan op zo'n node te klikken komen de verschillende items in de listview. Dit ukt me vrij aardig. Alleen nu is het probleem dat ik dit maar 2 a 3 keer kan doen en dan krijg ik de foutmelding dat het betreffende item niet gevonden kan worden.
Als ik door mijn programma stap blijkt dat mij opcmybrowser.movetoroot niet teruggaat naar de server root maar naar 1 of 2 levels daarboven. En ik heb geen idee waarom dat gebeurt. Ik zal heel mijn code proberen te geven. wie weet wat voor fouten jullie zo al kunnen zien vba is namelijk niet mijn sterkste taal...
Ik weet niet of mensen hier bekend zijn met OPC, maar ik probeer het toch aangezien ik zelf een heel klein beetje vast zit ermee.
Ik ben bezig een opc client te maken. In deze client maak ik gebruik van een treeview en een listview. De treeview laat zien wat er in de server staat door dan op zo'n node te klikken komen de verschillende items in de listview. Dit ukt me vrij aardig. Alleen nu is het probleem dat ik dit maar 2 a 3 keer kan doen en dan krijg ik de foutmelding dat het betreffende item niet gevonden kan worden.
Als ik door mijn programma stap blijkt dat mij opcmybrowser.movetoroot niet teruggaat naar de server root maar naar 1 of 2 levels daarboven. En ik heb geen idee waarom dat gebeurt. Ik zal heel mijn code proberen te geven. wie weet wat voor fouten jullie zo al kunnen zien vba is namelijk niet mijn sterkste taal...
Code:
Option Explicit
Dim WithEvents OPCMyserver As OPCServer 'OPC Server object
Dim WithEvents OPCMygroups As OPCGroups 'OPC Group object collection
Dim WithEvents OPCMygroup As OPCGroup 'OPC Group object
Dim OPCMyitems As OPCItems 'OPC Item object collection
Dim OPCMyitem As OPCItem 'OPC Item object
Dim OPCMyBrowser As OPCBrowser 'OPC Browser object
Dim ItemServerHandles() As Long 'OPC Item Handle
Dim ClientHandles(1) As Long 'OPC Client Handle
Dim OPCItemIDs(1) As String 'OPC Item ID
Dim Errors() As Long 'OPC Item Errors
Dim BrowseLevel As Integer 'Current level in the OPC Browser
Dim ConnectFlag As Boolean 'If connection established, ConnectFlag = True, Else = False
Dim treenode As Node
Dim SrvName As String
Dim Selectedname As String
Dim vName As Variant
Dim Treekey As String
Dim Childstring As String
Dim babystring As String
Dim Branchesteller As Long
Dim Leafsteller As Long
Dim naam As String
Dim ministring As String
Dim naam2 As String
Private Sub UserForm_initialize()
SrvName = "Server"
Dim Getserver As OPCServer 'Useful to count and store the OPC servers set up on the computer
Dim Servers As Variant 'Array which contains all the OPC servers set up on the computer
Dim I As Integer 'Index of the previous array
OPCtree.LineStyle = tvwRootLines
Itemlist.View = lvwReport
With Itemlist.ColumnHeaders 'Initializing of the ListView, 4 labelled collumns
.Add , , "Item", 100
.Add , , "Value", 100
.Add , , "TimeStamp", 100
.Add , , "Quality", 100
End With
With OPCtree.Nodes
.Clear
End With
Serversbox.Clear 'Erase the OPC servers combo box
Set Getserver = New OPCServer 'We ceate an OPC server objet instance
Servers = Getserver.GetOPCServers 'We get all the OPC servers set up on the computer
For I = LBound(Servers) To UBound(Servers) 'We add all the OPC servers found on the computer to the combo box
Serversbox.AddItem Servers(I)
Next I
Set Getserver = Nothing 'We clear the created OPC server object
Serversbox.ListIndex = 0 'We show the fisrt OPC server found in the combo box
Selectedserver.Caption = Serversbox.List(0) 'We show the OPC server selected
If Selectedserver.Caption = "" Then 'If no OPC server found, we display an Error MsgBox
MsgBox "Impossible to find an active OPC server", vbOKOnly + vbExclamation
End If
' txtRefTime.Text = "1000" 'Value of the refresh time
End Sub
Private Sub Connect_Click()
Dim count As Long
If ConnectFlag = False Then 'If we are not connected
On Error GoTo ConnectError
Set OPCMyserver = New OPCServer
OPCMyserver.Connect Selectedserver.Caption 'We try to connect to OPC server
Selectedname = Selectedserver.Caption
Set OPCMygroups = OPCMyserver.OPCGroups 'We load the OPC Groups
OPCMygroups.DefaultGroupDeadband = 0
OPCMygroups.DefaultGroupIsActive = True
OPCMygroups.DefaultGroupUpdateRate = 100
Set OPCMygroup = OPCMygroups.Add("Group_1") 'We add a group, the name is not important
Set OPCMyitems = OPCMygroup.OPCItems 'We load the OPC Items located in the OPC Group
count = OPCMyitems.count
groepteller.Value = count
Set OPCMyBrowser = OPCMyserver.CreateBrowser 'For the navigation in the OPC server
OPCMyBrowser.Showbranches
' For Each vName In OPCMyBrowser 'All the Variant are displayed with "+"
' ListDevice.AddItem "+" + vName
' Next vName
' txtPosition.Text = Mid$(ListDevice.List(0), 2) 'We display the first device found
' If txtPosition.Text = "" Then 'If there is no device
' OPCMyserver.Disconnect 'We dicsonnect, we clear objects, and we display a MsgBox
' Set OPCMyserver = Nothing
' Set OPCMyBrowser = Nothing
' MsgBox "Can't find OPC device", vbOKOnly + vbExclamation
' Exit Sub
' End If
ConnectFlag = True 'We are now connected
Connect.Caption = "Disconnect"
BrowseLevel = 0 'Initializing of the position in the OPC server
OPCMygroup.IsActive = False
Set treenode = OPCtree.Nodes.Add(, , SrvName, Selectedname)
Call Showbranches
Else
On Error Resume Next
OPCMygroup.IsActive = False
OPCMygroups.Remove OPCMygroup.ServerHandle
Set OPCMyitems = Nothing 'Delete Item collection
Set OPCMyitem = Nothing 'Delete Item object
Set OPCMygroups = Nothing 'Delete Group collection
Set OPCMygroup = Nothing 'Delete Group object
Set OPCMyBrowser = Nothing
OPCMyserver.Disconnect 'Diconnection
Set OPCMyserver = Nothing 'clear the OPC server object
ConnectFlag = False 'We are not connected anymore
Connect.Caption = "Connect to OPC Server"
Itemlist.ListItems.Clear 'clear the ListView
End If
Exit Sub
ConnectError:
MsgBox "Error Connecting", vbOKOnly + vbExclamation
End Sub
Private Sub OPCtree_NodeClick(ByVal SelectedNode As Node)
Dim itemnaam As String
Dim itemteller As Long
Dim anItem As OPCItem
Itemlist.ListItems.Clear
OPCMyBrowser.MoveToRoot
Set SelectedNode = OPCtree.SelectedItem
browseposition SelectedNode.Key
OPCMyBrowser.ShowLeafs
itemteller = OPCMyBrowser.count
For Each vName In OPCMyBrowser
itemnaam = "" + OPCMyBrowser.GetItemID(vName)
Itemlist.ListItems.Add , , itemnaam
Next vName
Dim I As Integer
For I = 1 To itemteller 'We add all the OPC Items of the ListView to the Collection of OPC Items
OPCItemIDs(1) = Itemlist.ListItems(I)
OPCMyitems.AddItems 1, OPCItemIDs, ClientHandles, ItemServerHandles, Errors
Next I
OPCMygroup.IsActive = Not OPCMygroup.IsActive 'Necessary to refresh data
OPCMygroup.IsSubscribed = Not OPCMygroup.IsSubscribed 'Necessary to refresh data
OPCMygroup.UpdateRate = Val(100) 'Use the refresh time
For I = 1 To Itemlist.ListItems.count 'For all the items in the ListView
For Each anItem In OPCMygroup.OPCItems 'For all OPC Items
anItem.Read OPCDevice 'Read the item, and the Item Id is the same than the current name in the ListView...
If anItem.ItemID = Itemlist.ListItems(I) Then
Itemlist.ListItems(I).SubItems(1) = anItem.Value '...get the Item Value...
Itemlist.ListItems(I).SubItems(2) = anItem.TimeStamp '...get the Item TimeStamp...
Itemlist.ListItems(I).SubItems(3) = anItem.Quality '...get the Item Quality
Exit For
End If
Next anItem
Next I
Set anItem = Nothing
OPCMyBrowser.MoveToRoot
End Sub
Private Sub browseposition(ByVal Positie As String)
Dim I As Integer
Dim NormalPosition As String
Dim comparestring As String
Dim teller As Integer
Dim bfound As Boolean
OPCMyBrowser.MoveToRoot
NormalPosition = Positie
OPCMyBrowser.Showbranches
For Each vName In OPCMyBrowser
comparestring = "" + vName
teller = Len(comparestring)
If Left(NormalPosition, Len(comparestring)) = comparestring Then: bfound = True: Exit For
Next vName
If bfound Then
Do While (Len(NormalPosition)) > 0
OPCMyBrowser.MoveDown (comparestring)
comparestring = "" + Mid(NormalPosition, (Len(comparestring) + 2))
NormalPosition = comparestring
Loop
Else
MsgBox "No Match was Found for " & NormalPosition, vbInformation, "Match Failure"
End If
End Sub
Private Sub OPCMygroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)
Dim anItem As OPCItem
Dim I As Integer
Dim FileName As String
On Error Resume Next
For I = 1 To Itemlist.ListItems.count
For Each anItem In OPCMygroup.OPCItems
anItem.Read OPCDevice
If anItem.ItemID = Itemlist.ListItems(I) Then
Itemlist.ListItems(I).SubItems(1) = anItem.Value
Itemlist.ListItems(I).SubItems(2) = anItem.TimeStamp
Itemlist.ListItems(I).SubItems(3) = anItem.Quality
Exit For
End If
Next anItem
Next I
Set anItem = Nothing
End Sub
Private Sub Disconnect_Click()
If ConnectFlag = True Then
Call Connect_Click
End If
End
End Sub
Private Sub Showbranches()
OPCMyBrowser.Showbranches
Branchesteller = OPCMyBrowser.count
For Each vName In OPCMyBrowser
Childstring = ""
Childstring = vName
Treekey = "" & Childstring
Set treenode = OPCtree.Nodes.Add(SrvName, tvwChild, Treekey, vName)
OPCMyBrowser.MoveDown (vName)
OPCMyBrowser.Showbranches
Branchesteller = OPCMyBrowser.count
OPCMyBrowser.ShowLeafs
Leafsteller = OPCMyBrowser.count
If Branchesteller > 0 Then
Call Showbranches2
Else
OPCMyBrowser.MoveUp
End If
Next vName
OPCMyBrowser.MoveUp
End Sub
Private Sub Showbranches2()
OPCMyBrowser.Showbranches
Branchesteller = OPCMyBrowser.count
For Each vName In OPCMyBrowser
babystring = vName
Treekey = Childstring & "." & babystring
naam = Childstring & "." & babystring
Set treenode = OPCtree.Nodes.Add(SrvName, tvwChild, Treekey, naam)
OPCMyBrowser.Showbranches
Branchesteller = OPCMyBrowser.count
OPCMyBrowser.ShowLeafs
Leafsteller = OPCMyBrowser.count
If Branchesteller = 0 Then
Branchesteller = OPCMyBrowser.count
Leafsteller = OPCMyBrowser.count
OPCMyBrowser.Showbranches
Else
OPCMyBrowser.MoveDown (vName)
OPCMyBrowser.Showbranches
Branchesteller = OPCMyBrowser.count
OPCMyBrowser.ShowLeafs
Leafsteller = OPCMyBrowser.count
If Branchesteller > 0 Then
Call showbranches3
Else
OPCMyBrowser.MoveUp
End If
End If
Next vName
OPCMyBrowser.MoveUp
End Sub
Private Sub showbranches3()
OPCMyBrowser.Showbranches
Branchesteller = OPCMyBrowser.count
For Each vName In OPCMyBrowser
If vName = "_Hints" Then
Exit For
End If
ministring = vName
naam2 = naam & "." & ministring
Treekey = Childstring & "." & babystring & "." & ministring
Set treenode = OPCtree.Nodes.Add(SrvName, tvwChild, Treekey, naam2)
Next vName
OPCMyBrowser.MoveUp
End Sub