-> Hier kostenlos registrieren
Hallo Forum,
ich habe eine Anwendung mit libnodave (0.8.4.4) in VB.NET 2008 geschrieben, mit der ich in einem Thread die Verbindung immer wieder öffnen und schliessen möchte, um bei Verbindungsabbruch ein automatisches Neuverbinden zu ermöglichen. Beim Connect schicke ich vorher ein Ping um die Verbindung zu testen (die Windows Timeouts dauern mir zu lange).
Das Problem: Mit jedem neuen Connect steigt die Anzahl der verwendeten Handles bis auf dem Rechner nichts mehr geht. Bei der momentan eingestellten Zeit von 1 Sec. dauert das schon etwas, aber später soll das Ganze schneller laufen. Bei 10 ms sind es nur ein paar Minuten bis das Netzwerk zusammenbricht.
Folgendes ist mir noch aufgefallen:
Wenn ich die libnodave.net.dll über einen Verweis einbinde, steigen die verwendeten IO-Bytes langsam an, bis das LAN nicht mehr funktioniert, um dann wieder fast auf 0 abzufallen (siehe angehängte Grafik).
Erstelle ich jedoch eine eigene libnodave.dll in meinem Projektordner mit der Code aus der libnodave.net.cs, dann zeigt sich dieses Verhalten nicht.
Die Menge der verwendeten IO-Bytes ist umso höher, je kürzer die Zeit zwischen Trennen und neuem Verbinden ist.
Ich hoffe, es hat jemand einen Tipp für mich, wie ich dieses Problem lösen kann; vielen Dank jedenfalls schonmal für Eure Bemühungen....
Viele Grüße Manni
Hier noch der wesentliche Code dazu:
'Endlosschleife zum Lesen der Stati aus der SPS
While True
'Alle 10 Sekunden versuchen die Verbindung herzustellen, wenn ok dann weiter
While Me.Connect = False
Threading.Thread.Sleep(10000)
End While
'Lese den Status der Stationen
Me.daveResult = Me.daveConn.readBytes(libnodave.daveDB, 1, 0, Me.ReadBufferStati.Length, Me.ReadBufferStati)
If Me.daveResult <> 0 Then
Me.bgw1.ReportProgress(1, "Fehler beim Lesen der Stati aus der SPS! Error: " + Me.daveResult.ToString)
Else
Me.ConvertStati()
End If
DisConnect()
'Den anderen Threads ein bisschen Zeit geben
Application.DoEvents()
Threading.Thread.Sleep(1000)
End While
Hier die Function Connect:
If My.Computer.Network.Ping(IpAdresse, 100) = False Then
Me.bgw1.ReportProgress(1, "Die TCP-Verbindung zur SPS " + IpAdresse + " kann nicht hergestellt werden!")
Return False
End If
Me.daveFds.rfd = libnodave.openSocket(102, IpAdresse)
If Me.daveFds.rfd <= 0 Then
ReturnFalse
EndIf
Me.daveFds.wfd = Me.daveFds.rfd
Me.daveInterface = New libnodave.daveInterface(Me.daveFds, "SPS1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k)
Me.daveInterface.setTimeout(1000000)
Me.daveConn = New libnodave.daveConnection(Me.daveInterface, 0, Rack, Slot)
Me.daveResult = Me.daveConn.connectPLC
IfMe.daveResult <> 0 Then
DisConnect()
ReturnFalse
EndIf
Return True
Und hier die Function Disconnect:
Me.daveConn.disconnectPLC()
libnodave.closePort(Me.daveFds.rfd)
libnodave.closePort(Me.daveFds.wfd)
Me.daveInterface.disconnectAdapter()
ich habe eine Anwendung mit libnodave (0.8.4.4) in VB.NET 2008 geschrieben, mit der ich in einem Thread die Verbindung immer wieder öffnen und schliessen möchte, um bei Verbindungsabbruch ein automatisches Neuverbinden zu ermöglichen. Beim Connect schicke ich vorher ein Ping um die Verbindung zu testen (die Windows Timeouts dauern mir zu lange).
Das Problem: Mit jedem neuen Connect steigt die Anzahl der verwendeten Handles bis auf dem Rechner nichts mehr geht. Bei der momentan eingestellten Zeit von 1 Sec. dauert das schon etwas, aber später soll das Ganze schneller laufen. Bei 10 ms sind es nur ein paar Minuten bis das Netzwerk zusammenbricht.
Folgendes ist mir noch aufgefallen:
Wenn ich die libnodave.net.dll über einen Verweis einbinde, steigen die verwendeten IO-Bytes langsam an, bis das LAN nicht mehr funktioniert, um dann wieder fast auf 0 abzufallen (siehe angehängte Grafik).
Erstelle ich jedoch eine eigene libnodave.dll in meinem Projektordner mit der Code aus der libnodave.net.cs, dann zeigt sich dieses Verhalten nicht.
Die Menge der verwendeten IO-Bytes ist umso höher, je kürzer die Zeit zwischen Trennen und neuem Verbinden ist.
Ich hoffe, es hat jemand einen Tipp für mich, wie ich dieses Problem lösen kann; vielen Dank jedenfalls schonmal für Eure Bemühungen....
Viele Grüße Manni
Hier noch der wesentliche Code dazu:
'Endlosschleife zum Lesen der Stati aus der SPS
While True
'Alle 10 Sekunden versuchen die Verbindung herzustellen, wenn ok dann weiter
While Me.Connect = False
Threading.Thread.Sleep(10000)
End While
'Lese den Status der Stationen
Me.daveResult = Me.daveConn.readBytes(libnodave.daveDB, 1, 0, Me.ReadBufferStati.Length, Me.ReadBufferStati)
If Me.daveResult <> 0 Then
Me.bgw1.ReportProgress(1, "Fehler beim Lesen der Stati aus der SPS! Error: " + Me.daveResult.ToString)
Else
Me.ConvertStati()
End If
DisConnect()
'Den anderen Threads ein bisschen Zeit geben
Application.DoEvents()
Threading.Thread.Sleep(1000)
End While
Hier die Function Connect:
If My.Computer.Network.Ping(IpAdresse, 100) = False Then
Me.bgw1.ReportProgress(1, "Die TCP-Verbindung zur SPS " + IpAdresse + " kann nicht hergestellt werden!")
Return False
End If
Me.daveFds.rfd = libnodave.openSocket(102, IpAdresse)
If Me.daveFds.rfd <= 0 Then
ReturnFalse
EndIf
Me.daveFds.wfd = Me.daveFds.rfd
Me.daveInterface = New libnodave.daveInterface(Me.daveFds, "SPS1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k)
Me.daveInterface.setTimeout(1000000)
Me.daveConn = New libnodave.daveConnection(Me.daveInterface, 0, Rack, Slot)
Me.daveResult = Me.daveConn.connectPLC
IfMe.daveResult <> 0 Then
DisConnect()
ReturnFalse
EndIf
Return True
Und hier die Function Disconnect:
Me.daveConn.disconnectPLC()
libnodave.closePort(Me.daveFds.rfd)
libnodave.closePort(Me.daveFds.wfd)
Me.daveInterface.disconnectAdapter()