libnodave mehrere Anlagen

dirknico

Level-2
Beiträge
238
Reaktionspunkte
14
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wir sind gerade dabei mit libnodave via Excel Daten aus unseren Maschinen (derzeit 6) auszulesen.
Das ganze funktioniert prinzipiell erstmal.
Hierfür haben wir uns an dem Tankbeispiel https://www.sps-forum.de/threads/libnodave-beispiel-tcp-verbindung-zu-s7-welt.62825/ orientiert.

Jetzt möchten wir die Daten aus den 6 Maschinen zyklisch, wenn möglich im Sekundentakt abrufen.
Hierzu haben wir im VBA einen Timer angelegt, die Daten der Maschinen werden in einer Schleife nacheinander abgerufen.
Meine Fragen:

- ist das ganze so sinnvoll, oder kann ich die Verbindungen zu den Maschinen und das abrufen parallel machen?
- muss ich nach jedem Abruf die Verbindung schließen (cleanup) oder kann die bestehen bleiben?

Code:
Sub readFromAnlage_neu()

#If Win64 Then
 Dim ph As LongPtr, di As LongPtr, dc As LongPtr
#Else
 Dim ph As Long, di As Long, dc As Long
#End If

Dim i, Ziel, Tabelle, IP, res, res2, Pfad, Zeile, Spalte, System, Zieldatei As Worksheet

    Set System = ThisWorkbook.Worksheets("System")
    Pfad = ThisWorkbook.Path & "\Daten\" & Format(Now, "yyyy")
      
    For i = 1 To System.Range("B1")

        IP = System.Range("B" & i + 2) 'IP-Adresse aus Arbeitsblatt
    
        res = verbinden_neu(ph, di, dc, IP, i + 2)
        
        If res = 0 Then
          
            res2 = daveReadBytes(dc, daveDB, System.Range("E" & i + 2), System.Range("F" & i + 2), System.Range("G" & i + 2), 0)
            
            If res2 = 0 Then
                Select Case i
                
                Case 1
                    Set Tabelle = ThisWorkbook.Worksheets("Anlage1")
                Case 2
                    Set Tabelle = ThisWorkbook.Worksheets("Anlage2")
                Case 3
                    Set Tabelle = ThisWorkbook.Worksheets("Anlage3")
                Case 4
                    Set Tabelle = ThisWorkbook.Worksheets("Anlage4")
                Case 5
                    Set Tabelle = ThisWorkbook.Worksheets("Anlage5")
                Case 6
                    Set Tabelle = ThisWorkbook.Worksheets("Anlage6")
                End Select
                
                'Zeile
                Zeile = (Format(Timer(), "0") * 4) - 3
                System.Range("B17") = Zeile
                
                'Spalte
                Spalte = Format(Now, "dd") * 1
                  
                Tabelle.Cells(Zeile, Spalte) = daveGetS16(dc)  'Status
                Tabelle.Cells(Zeile + 1, Spalte) = daveGetS16(dc)  'Betriebsart
                Tabelle.Cells(Zeile + 2, Spalte) = daveGetS16(dc)  'Hubzahl
                Tabelle.Cells(Zeile + 3, Spalte) = daveGetS16(dc)  'Stückzahl
            End If
    
        End If
        
        Call cleanUp(ph, di, dc)
    Next i
    
End Sub
 
Ich hab mir damals ein Excel-Addin geschrieben, welches von verschiedenen SPSen parallel Daten holt.
Weiß nicht ob das bei dir funktioniert.

Prinzipiell musst du die Verbindungen nicht schließen und kannst auch mehrere gleichzeitig öffnen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Verbindungen kann man offen lassen. Dazu gibt es ja den dc Parameter, der angibt über welche Verbindung gelesen werden soll.

Einziges Problem ist: wenn das Programm irgendwie geschlossen wird oder abstürtzt. Dann bleiben die Verbindungsresourcen belegt und man muss evtl. Rechner neu starten - irgendwann geht es einfach nicht mehr.
Ich kenne auch das Problem, dass die CPU irgendwann nicht mehr reagiert, wenn Verbindungen nicht korrekt abgebaut werden. Man muss dann die CPU neu starten. Ich hatte auch schon das Problem, dass nach langer zyklischer Lesezeit zwar der Lesebefehl ausgeführt wurde, aber keine Daten enthalten waren. Da hat sich auch irgendwo was aufgehängt. Rechner neu starten dann geht es wieder.
 
Zurück
Oben