probleem bij lezen van opc items

Status
Niet open voor verdere reacties.

dadio25

Gebruiker
Lid geworden
17 mrt 2009
Berichten
39
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...

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
 
Hmmm,

Niemand die mij kan helpen. Ik weet dat OPC niet bekend is bij veel mensen of dat mensen de opcdaauto.dll op hun pc hebben staan waardoor controleren van de code erg lastig is.

Maar had gehoopt dat mensen problemen zagen in de code die ik gebruikt heb. Dat kan misschien al veel helpen.

groeten dadio25
 
Omdat Itemlist nergens apart gedeclarerd is, lijkt het mij een object van een ander object. Dan verwacht ik een punt of de naam van de 'parent' voor itemlist.

OPCtree.LineStyle = tvwRootLines
OPCtree.Itemlist.View = lvwReport ???
 
Hallo,

bedankt voor je antwoord, maar geld dat ook voor twee verschillende controls??

OPCtree is namelijk een treeview en listitems een listview.

groeten dadio25
 
Omdat je de code in de userform initialize staat kun je alle objecten van het userform direkt aanduiden.
Als Litstitems een object binnen het userform is, dan vervalt mijn vorige opmerking.
Noch de treeview, noch de listview hoeft dan vooraf gegaan te worden door de 'parent' (ic het userform)
 
Hallo,

Ze zitten idd op het userform. En ik doe het bij initialize zodat ze voor de rest van het programma juist gedeclareerd zijn, want eerst werkt voor de listview het toevoegen van column headers niet terwijl ik al wel in de properties gezet had dat dit zo'n report list moest zijn.

groeten
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan