-> Hier kostenlos registrieren
Hallo,
ich polle mit meinem VB.NET Programm (VB2008 Express) zyklisch Daten aus der SPS und da musste ich im Windows Task-Manager leidlicherweise feststellen, dass mein Programm zunehmends Speicher reserviert und nicht wieder freigibt.
Dem wollte ich auf die Spur gehen und habe zunächst meine zyklisch aufgerufene Pollroutine mit "Exit Function" in der ersten Zeile deaktiviert.
Danach blieb der reservierte Speicher in einem festen Bereich.
Als nächsten Schritt habe ich folgende Zeilen hinzugefügt:
Globale Variable:
Public rs AsNew libnodave.resultSet
PrivateFunction PollData() AsBoolean
Dim res AsInteger
res = dc.execReadRequest(multireadPDU01, rs)
ExitFunction
...
...so dass in meinem Pollzyklus (zur Zeit alle 200ms) nur die Funktion dc.execReadRequest(multireadPDU01, rs) aufgerufen wird und keine anderen Aktionen wie Datenauswertung oder das Schreiben ins Logfile stattfinden.
Hier tritt nun bereits das Problem auf, dass das Programm etwa alle zwei bis drei Sekunden 4kB zusätzlichen Speicher reserviert und diesen erst mit Programmende wieder freigibt (so hoffe ich zumindest).
Das bedeutet, dass ein Loggen über mehrere Stunden/Tage zum Problem werden können, da dem Computer die Resourcen ausgehen und andere laufende Programme in Mitleidenschaft gezogen werden können.
Zur zusätzlichen Information:
- der Speicherzuwachs findet unabhängig vom Protokoll stat (ISO on TCP, S7Online, MPI)
- die multireadPDU01 besteht aus 19 Variablen welche zuvor einmalig (nicht im Pollzyklus) über die Funktion
multireadPDU01.addVarToReadRequest(nArea, nDBnr, nByteAdr, nDataLength) hinzugefügt wurden:
...
multireadPDU01 = dc.prepareReadRequest()
...
Schleife 0...x (18)
multireadPDU01.addVarToReadRequest(nArea, nDBnr, nByteAdr, nDataLength)
...
Ich hoffe es kann mir jemand bei diesem Problem helfen, da ich ansonsten das Programm nicht einsetzen werden kann.
Was mache ich hier falsch? Wie kann ich den reservierten Speicher nach dem Auslesen und Verarbeiten dieser Werte wieder freigeben?
Ich wäre wirklich seeeehr dankbar wenn mir da jemand aus der Patsche helfen könnte.
Gruss,
bool
ich polle mit meinem VB.NET Programm (VB2008 Express) zyklisch Daten aus der SPS und da musste ich im Windows Task-Manager leidlicherweise feststellen, dass mein Programm zunehmends Speicher reserviert und nicht wieder freigibt.
Dem wollte ich auf die Spur gehen und habe zunächst meine zyklisch aufgerufene Pollroutine mit "Exit Function" in der ersten Zeile deaktiviert.
Danach blieb der reservierte Speicher in einem festen Bereich.
Als nächsten Schritt habe ich folgende Zeilen hinzugefügt:
Globale Variable:
Public rs AsNew libnodave.resultSet
PrivateFunction PollData() AsBoolean
Dim res AsInteger
res = dc.execReadRequest(multireadPDU01, rs)
ExitFunction
...
...so dass in meinem Pollzyklus (zur Zeit alle 200ms) nur die Funktion dc.execReadRequest(multireadPDU01, rs) aufgerufen wird und keine anderen Aktionen wie Datenauswertung oder das Schreiben ins Logfile stattfinden.
Hier tritt nun bereits das Problem auf, dass das Programm etwa alle zwei bis drei Sekunden 4kB zusätzlichen Speicher reserviert und diesen erst mit Programmende wieder freigibt (so hoffe ich zumindest).
Das bedeutet, dass ein Loggen über mehrere Stunden/Tage zum Problem werden können, da dem Computer die Resourcen ausgehen und andere laufende Programme in Mitleidenschaft gezogen werden können.
Zur zusätzlichen Information:
- der Speicherzuwachs findet unabhängig vom Protokoll stat (ISO on TCP, S7Online, MPI)
- die multireadPDU01 besteht aus 19 Variablen welche zuvor einmalig (nicht im Pollzyklus) über die Funktion
multireadPDU01.addVarToReadRequest(nArea, nDBnr, nByteAdr, nDataLength) hinzugefügt wurden:
...
multireadPDU01 = dc.prepareReadRequest()
...
Schleife 0...x (18)
multireadPDU01.addVarToReadRequest(nArea, nDBnr, nByteAdr, nDataLength)
...
Ich hoffe es kann mir jemand bei diesem Problem helfen, da ich ansonsten das Programm nicht einsetzen werden kann.
Was mache ich hier falsch? Wie kann ich den reservierten Speicher nach dem Auslesen und Verarbeiten dieser Werte wieder freigeben?
Ich wäre wirklich seeeehr dankbar wenn mir da jemand aus der Patsche helfen könnte.
Gruss,
bool
Zuletzt bearbeitet: