Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 8 von 8

Thema: VBA Hilfe beim Programmieren

  1. #1
    Registriert seit
    25.07.2012
    Beiträge
    50
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Geändert von shibbbbby (09.08.2012 um 11:43 Uhr)
    Zitieren Zitieren VBA Hilfe beim Programmieren  

  2. #2
    Registriert seit
    25.07.2012
    Beiträge
    50
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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
    Geändert von shibbbbby (09.08.2012 um 14:04 Uhr)

  3. #3
    Registriert seit
    25.07.2012
    Beiträge
    50
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  4. #4
    Registriert seit
    25.07.2012
    Beiträge
    50
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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?

  5. #5
    Kallemann Gast

    Standard

    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

  6. #6
    Registriert seit
    25.07.2012
    Beiträge
    50
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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?
    Geändert von shibbbbby (13.08.2012 um 10:22 Uhr)

  7. #7
    Registriert seit
    25.07.2012
    Beiträge
    50
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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
    Geändert von shibbbbby (13.08.2012 um 10:30 Uhr)

  8. #8
    Registriert seit
    25.07.2012
    Beiträge
    50
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hab eine Lösung gefunden.

    For n = 1 To NumItems
    For a = 1 To 142
    If a = ClientHandles(n) Then Cells(12 + a, 9) = ItemValues(n)
    Next a
    Next n
    Damit nicht soviel Rechenleistung verbraten wird sollte man lieber

    For n = 1 To NumItems

    Cells(12 + ClientHandles(n), 9) = ItemValues(n)

    Next n
    nutzen
    Geändert von shibbbbby (13.08.2012 um 14:19 Uhr)

Ähnliche Themen

  1. Brauche Hilfe beim Programmieren!
    Von Jumpinjack im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 14.10.2010, 14:23
  2. Hilfe beim Programmieren (CAN-Bus)
    Von Dennis27 im Forum Feldbusse
    Antworten: 0
    Letzter Beitrag: 14.10.2010, 11:14
  3. Hilfe beim programmieren
    Von Shierasse im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 14.12.2009, 07:46
  4. Hilfe beim programmieren einer S7 224
    Von Andyzrx im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 06.07.2009, 15:03
  5. Brauche Hilfe beim programmieren
    Von spiderman696 im Forum Programmierstrategien
    Antworten: 13
    Letzter Beitrag: 20.02.2007, 20:32

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •