VBA Hilfe beim Programmieren

shibbbbby

Level-1
Beiträge
50
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Ich habe Versucht die Siemens Vorlage für einen Excel Client zu modifizieren. Speziel wollte ich 100 Variablen lesen können.
Nun funktioniert das eigentlic auch, aber nach einer weile und paar Simulierten Variablen änderungen am Server hängt sich der Client auf.
Weis jemand um Rat?

Geändert habe ich eigentlich nur die For schleifen. Da müsste der Fehler versteckt sein.

Eine andere Frage die mich quält, ist warum nur der erste Wert beim button click auf Start Client ausgelsen wird, die anderen erst beim ändern der Variablen.


Code:
Option Explicit 'Variablennamen müssen eindeutig sein

Option Base 1 'Indizes beginnen bei 1 (nicht 0)

Dim WithEvents MyOPCServer As OPCServer 'OPCServer-Objekt wird definiert


Dim MyOPCGroupColl As OPCGroups 'OPCGroups-Objekt wird definiert

Dim WithEvents MyOPCGroup As OPCGroup 'OPCGroup-Objekt wird definiert


Dim MyOPCItemColl As OPCItems 'OPCItems-Objekt wird definiert

Dim MyOPCItem As OPCItem 'OPCItem-Objekt wird definiert

Dim ClientHandles(1 To 100) As Long

Dim ServerHandles() As Long

Dim Values(1 To 100) As Variant

Dim Errors() As Long

Dim ItemIDs(1 To 100) As String

Dim ServerName As String

Dim NodeName As String

Dim GroupName As String

Dim CONNECTING As Boolean

Dim n As Long

Dim t As Integer





Sub StartClient()
  
  'Connect to Server, create Groups, items etc.
    
  On Error GoTo ErrorHandler 'sollte eigentlich verwendet werden!
  CONNECTING = True
    
    For n = 1 To 100
        ClientHandles(n) = n
    Next n

  ServerName = Range("b4").Value

  GroupName = Range("d4").Value

  NodeName = Range("c4").Value
  
    For n = 1 To 100
        ItemIDs(n) = Cells(12 + n, 2).Value
    Next n
  
  '----------- Get an instance of the OPC server

  Set MyOPCServer = New OPCServer

  MyOPCServer.Connect ServerName, NodeName

  Set MyOPCGroupColl = MyOPCServer.OPCGroups

  '----------- Set the default active state for adding groups

  MyOPCGroupColl.DefaultGroupIsActive = True

  '----------- Add our group to the Collection

  Set MyOPCGroup = MyOPCGroupColl.Add(GroupName)

  Set MyOPCItemColl = MyOPCGroup.OPCItems

  '----------- Add one item, ServerHandles are returned

  MyOPCItemColl.AddItems 100, ItemIDs, ClientHandles, ServerHandles, Errors
  
  '----------- A group that is subscribed receives asynchronous notifications

  MyOPCGroup.IsSubscribed = True
  
  Range("f4").Value = "Client on"
  Range("g4").Value = CStr(MyOPCServer.LastUpdateTime)
  Range("h4").Value = MyOPCItemColl.Count
  Range("i4").Value = MyOPCServer.ServerState
  Range("i4").Interior.Color = vbGreen
  CONNECTING = False
  Exit Sub

ErrorHandler:

  MsgBox "Error: " & Err.Description, vbCritical, "ERROR"
  CONNECTING = False
  
End Sub

Sub StopClient()

  '----------- Release the Group and Server objects

  If (Range("i4").Value <> 1) Then Exit Sub
  
  MyOPCGroupColl.RemoveAll

  '----------- Disconnect from the server and clean up

  MyOPCServer.Disconnect

  Set MyOPCItemColl = Nothing

  Set MyOPCGroup = Nothing

  Set MyOPCGroupColl = Nothing

  Set MyOPCServer = Nothing
  
  Range("f4").Value = "Client off"
  Range("i4").Value = 0
  Range("i4").Interior.Color = vbRed
  Range("c5").Value = ""
End Sub

Private Sub StartButton_Click()
    StartClient
    Range("c5").Value = MyOPCServer.VendorInfo
End Sub

Private Sub StopButton_Click()
    StopClient
End Sub

Private Sub MyOPCGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)

  '------------ Ereignis wird ausgeloest, wenn sich Daten am Server ändern
  'es wird jeweils nur ein Item abgefragt. es wird angenommen, daß sich nur eines gleichzeitig ändert
    
    For n = 1 To 100
                                                               'wenn nur 2. Item sich geändert hat
          If ClientHandles(1) = n Then Cells(12 + n, 9).Value = ItemValues(1) 'etc.
        
    Next n
      
  'If NumItems > 1 Then Range("B7").Value = ItemValues(2) 'Bedingung, wenn sich erstes Item ändert ist 2.Value nicht bekannt
  
  Range("g4").Value = CStr(MyOPCServer.LastUpdateTime)
  
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

  '------------ Ereignis wird ausgeloest, wenn sich Daten in Arbeitsblatt ändern
  If Range("i4").Value = 0 Or CONNECTING Then Exit Sub 'Abbruch falls nicht verbunden
  'Abbruch falls sich nicht einer der Variablen-Werte geändert hat
  

    For n = 1 To 100
        If (Target <> Cells(12 + n, 9)) Then t = 0 Else t = 1
        ' wenn nicht Werte geändert -> exit
    Next n
    If (t = 0) Then Exit Sub
    For n = 1 To 14
        Values(1) = Cells(12 + n, 9).Value
    Next n
   
  MyOPCGroup.SyncWrite n, ServerHandles, Values, Errors 'Werte im Synchron-Modus auf Server schreiben
End Sub
 
Zuletzt bearbeitet:
Denn Fehler fürs aufhängen habe ich gefunden.

Next n
If (t = 0) Then Exit Sub
For n = 1 To 14 hier war ein Fehler,hier musste 100 eingetragen werden
Values(1) = Cells(12 + n, 9).Value
Next n

Leider weiss ich immer noch nicht warum er beim einschalten nur den ersten wert ändert, die anderen werden nur bei änderung übertragen


Ich hätte gerne das ich alle Wert beim einschlalten übertrage. Auch habe ich gemerkt, dass mein Programm nur eine änderung mitbekommt. Das heist das eine Information verloren geht falls 2 Veränderungen zeitgleich stattfinden
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten morgen miteinander,

Ich habe immer noch das Problem das nur eine änderung wahr genommen wird. Und das zweite Problem das s nur der erste Wert beim erstmaligem einschalten aktualisiert wird.
Weis jemand von euch eine Lösung oder könnte mir sagen in welcher Zeile ich etwas ändern muss? Ich hab da seine Vermutung und teste es auch ständig, doch leider nur mit mässigem erfolg.
 
Mann müsste das doch eigentlich recht einfach programmieren können, aber ich verzweifel an

MyOPCGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)

Wieso kann ich nicht alle änderung mitbekommen?
 
Hallo shibbbby.

Ich bin mir absolut nicht sicher, ob ich richtig liege, aber mir kommt die For-Next-Schleife irgendwie komisch vor.

For n = 1 To 100
'wenn nur 2. Item sich geändert hat
If ClientHandles(1) = n Then Cells(12 + n, 9).Value = ItemValues(1) 'etc.

Next n

Ganz oben im Deklarationsbereich des Codes steht OptionBase 1. Das heißt doch eigentlich, dass hier in der For-Next-Schleife nicht das 2. (laut Kommentar), sondern das erste Element abgefragt wird, und zwar in wirklich jedem Durchlauf ( "If ClientHandles(1) = n..."). Ist denn das richtig?
Vielleicht muss es ja so lauten: " If ClientHandles(n) = 1..." .

Laut den anderen Kommentaren im Code ("'es wird jeweils nur ein Item abgefragt. es wird angenommen, daß sich nur eines gleichzeitig ändert")
könnte es doch aber auch sein, dass Du zwei Schleifen ineinander verschachteln musst, denn Du willst ja alle Änderungen auf einmal erfassen. Also in etwa so:

For n = 1 To 100
For ch = 1 To 100
If ClientHandles(ch) = n Then Cells(12 + n, 9).Value = ItemValues(ch) 'etc.
Next ch
Next n


Vielleicht hilft's ja irgendwie.

VG
Carsten
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten morgen,

Danke für deine Antwort, leider hat dein Programmcode auch nicht die gewünschte Lösung erbracht. Vielleicht liegt es einfach daran das ich nicht weis was die DataChange Methode macht. Kann mir jemand sie erklären oder mir sagen wo ich es nachlesen kann?
 
Zuletzt bearbeitet:
Der ClientHandle müsste doch alle änderungen in sich tragen oder? wie lese ich ihn richtig aus?

Müsste doch ClientHandle(n) sein, aber dann kommt Index ausserhalb des gültigen Bereichs
 
Zuletzt bearbeitet:
Zurück
Oben