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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: zklisches dc.execReadRequest(multireadPDU01, rs) reserviert !zunehmends! Speicher

  1. #1
    Registriert seit
    26.03.2010
    Beiträge
    94
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Ausrufezeichen


    Zuviel Werbung?
    -> 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 (1
    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

    Geändert von bool (16.05.2010 um 08:18 Uhr)
    Zitieren Zitieren zklisches dc.execReadRequest(multireadPDU01, rs) reserviert !zunehmends! Speicher  

  2. #2
    Registriert seit
    10.05.2005
    Beiträge
    1.996
    Danke
    220
    Erhielt 233 Danke für 204 Beiträge

    Standard

    Hi

    Kenne mich überhaupt nicht aus.

    Jedoch.
    Teste/Vegleiche doch mal beide Codes.


    http://www.sps-forum.de/showthread.php?t=35854







    Oder lies das hier: http://spsforum.com/showthread.php?t=10790
    Geändert von gravieren (16.05.2010 um 09:18 Uhr)
    Karl

  3. #3
    bool ist offline Benutzer
    Themenstarter
    Registriert seit
    26.03.2010
    Beiträge
    94
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von gravieren Beitrag anzeigen
    Hi

    Kenne mich überhaupt nicht aus.

    Jedoch.
    Teste/Vegleiche doch mal beide Codes.

    http://www.sps-forum.de/showthread.php?t=35854
    Bei diesem Beispiel handelt es sich um ein C# Programm und es werden die Variablen am Ende mit "null" zugewiesen.

    rs = null;
    myPDU = null;

    Bei meinem VB.NET Programm habe ich bereits das selbig versucht nachzubilden. Da "null" dort nicht als solches nicht existiert sondern je nachdem "vbnull", "vbnullchar" oder "vbnullstring" verwendet werden müssen, habe ich solchiges versucht. Ich bekomme dann jedoch leider die Meldung, dass der Typ "Variant" nicht in "libnodave.resultset" konvertiert werden kann.
    Ich vermute, dass die "null" Zuweisung jedoch nicht der Knackpunkt ist

    @Jochen:
    Wie sieht es bei Dir im Taskmanager mit dem verwendeten Speicher Deiner Applikation aus wenn Du die Daten zyklisch pollst?
    Testweise wäre es interessant, wenn Du mal die "null" Zuweisungen nach Deiner Datenauswertung ausklammern und dann den Speicherzuwachs nochmals beobachten könntest.

    Zitat Zitat von gravieren Beitrag anzeigen
    Bringt leider auch keine Lösung, da der dortige Fall noch offen ist.
    Danke aber trotzdem für die Rückmeldung.


    Mitlerweilen habe ich es mit "Using" probiert, hatte bislang aber noch keinen Erfolg, da ich folgende Meldung bekomme "Ein Using-Operand vom Typ libnodave.resultSet muss System.IDisposable implementieren." Wie dies zu bewerkstelligen ist versuche ich nun herauszufinden. -> scheint nicht zu gehen, da der Typ "libnodave.resultSet" selbst schon die Eigenschaft mitbringen muss, damit dieser per Using implementiert werden kann. Scheibenkleister!

    Dim res AsInteger
    Using rs AsNew libnodave.resultSet
    res = dc.execReadRequest(multireadPDU01, rs)
    EndUsing
    ExitFunction


    Ich kann mir aber nicht vorstellen, dass die Speicherfreigabe an sich ( auf irgend eine Art und Weise) nicht funktionieren soll, da ja wie ich den Eindruck habe doch mittlerweile einige Leute libnodave einsetzen und ein zunehmender Speicherzuwachs (kann im Task-Manager live überprüft werden) eigentlich im Forum kaum zur Sprache kommt.

    So hoffe ich auf wetere Ideen/Lösungen.

    Gruss,

    bool
    Geändert von bool (16.05.2010 um 10:17 Uhr)

  4. #4
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.224
    Danke
    630
    Erhielt 955 Danke für 769 Beiträge

    Standard

    Früher wurde in VB nicht null sondern nothing verwendet. Vielleicht geht dies auch noch in vb.net.
    Rainer Hönle
    DELTA LOGIC GmbH

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  5. #5
    bool ist offline Benutzer
    Themenstarter
    Registriert seit
    26.03.2010
    Beiträge
    94
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Rainer Hönle Beitrag anzeigen
    Früher wurde in VB nicht null sondern nothing verwendet. Vielleicht geht dies auch noch in vb.net.
    ok, "nothing" wird im vb.net erkannt und kann rs zugewiesen werden, doch leider gibt es dadurch in Bezug auf die zunehmende Speicherauslastung keine Besserung. Danke aber auf jeden Fall für die Info.

    Inzwischen habe ich die Funktion "System.GC.Collect()" in meinem Poll vorangeführt. Da "rs" erst in der folgenden Zeile deklariert wird, vermute /hoofe ich dass dadurch die alte unbenutze rs Variabe vom GarbageCollector wieder freigegeben wird. Ein kurzer Test hat hier schon mal Besserung gezeigt, ich werde das ganze jetzt mal ein paar Stunden auf meinem anderen Rechner laufen lassen und die Resourcen beobachten.

    Der Code des Polls sieht nun prinzipiell so aus:

    PrivateFunction PollData() AsBoolean

    System.GC.Collect()
    Dim rs AsNew libnodave.resultSet
    Dim
    res AsInteger
    res = dc.execReadRequest(multireadPDU01, rs)
    ...
    Auswertung
    ...

    Bitte um Feedback ob dies auf diese Art und Weise legitim ist oder ob dies zu anderen Problemen führen kann.

    Auch über Alternativvorschläge bin ich offen und äusserst dankbar.

    Gruss,

    bool

  6. #6
    Registriert seit
    28.10.2005
    Ort
    Ottweiler, Saar
    Beiträge
    940
    Danke
    259
    Erhielt 124 Danke für 109 Beiträge

    Standard

    Ich gebe offen zu, dass ich VB nicht benutze.
    Aber kann es sein, bool, dass der Aufruf in einem Objekt steckt, das dann regelmäßig Speicher alloziert? Von LibNoDave kann ich mir das eigentlich nicht vorstellen...

  7. #7
    bool ist offline Benutzer
    Themenstarter
    Registriert seit
    26.03.2010
    Beiträge
    94
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von argv_user Beitrag anzeigen
    Ich gebe offen zu, dass ich VB nicht benutze.
    Aber kann es sein, bool, dass der Aufruf in einem Objekt steckt, das dann regelmäßig Speicher alloziert? Von LibNoDave kann ich mir das eigentlich nicht vorstellen...
    Das scheint schon von der Funktion "res = dc.execReadRequest(multireadPDU01, rs)" bzw der Variablen "rs" auszugehen, da wenn ich diese Funktion nicht zyklisch aufrufe bliebt der reservierte Speicher auch ohne GarbageCollector konstant. Sobald ich diese Funktion in den Poll mit aufnehme wächst der reservierte Speicher alle 2-3 Sekunden um 4kB. Um den restlichen Code auszuschliessen habe ich die getriggerte (200ms) Pollfunktion direkt nach dem Aufruf von "dc.execReadRequest" terminiert.
    Es kann natürlich damit zusammenhängen, dass ich die "multireadPDU01" einmalig vor dem Pollen deklariere und mit Variablen bestücke (siehe mein erstes Post) und dann den ReadRequest zyklisch ausführe. ???

    Gruss,

    bool

  8. #8
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von bool Beitrag anzeigen
    ok, "nothing" wird im vb.net erkannt und kann rs zugewiesen werden, doch leider gibt es dadurch in Bezug auf die zunehmende Speicherauslastung keine Besserung. Danke aber auf jeden Fall für die Info.

    Inzwischen habe ich die Funktion "System.GC.Collect()" in meinem Poll vorangeführt. Da "rs" erst in der folgenden Zeile deklariert wird, vermute /hoofe ich dass dadurch die alte unbenutze rs Variabe vom GarbageCollector wieder freigegeben wird. Ein kurzer Test hat hier schon mal Besserung gezeigt, ich werde das ganze jetzt mal ein paar Stunden auf meinem anderen Rechner laufen lassen und die Resourcen beobachten.

    Der Code des Polls sieht nun prinzipiell so aus:

    PrivateFunction PollData() AsBoolean

    System.GC.Collect()
    Dim rs AsNew libnodave.resultSet
    Dim
    res AsInteger
    res = dc.execReadRequest(multireadPDU01, rs)
    ...
    Auswertung
    ...

    Bitte um Feedback ob dies auf diese Art und Weise legitim ist oder ob dies zu anderen Problemen führen kann.

    Auch über Alternativvorschläge bin ich offen und äusserst dankbar.

    Gruss,

    bool
    Es ist bei .NET Programmen normal das die Speichernutzung wächst, da der GC nur aufgerufen wird wenn es nötig ist! Solange noch speicher verfügbar ist und nicht von anderen Programmen gebraucht wird, läuft der GC nicht an, da der GC auch Rechenleistung braucht und normalerweise nicht selbst angestossen werden soll!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  9. #9
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von bool Beitrag anzeigen
    Das scheint schon von der Funktion "res = dc.execReadRequest(multireadPDU01, rs)" bzw der Variablen "rs" auszugehen, da wenn ich diese Funktion nicht zyklisch aufrufe bliebt der reservierte Speicher auch ohne GarbageCollector konstant. Sobald ich diese Funktion in den Poll mit aufnehme wächst der reservierte Speicher alle 2-3 Sekunden um 4kB. Um den restlichen Code auszuschliessen habe ich die getriggerte (200ms) Pollfunktion direkt nach dem Aufruf von "dc.execReadRequest" terminiert.
    Es kann natürlich damit zusammenhängen, dass ich die "multireadPDU01" einmalig vor dem Pollen deklariere und mit Variablen bestücke (siehe mein erstes Post) und dann den ReadRequest zyklisch ausführe. ???

    Gruss,

    bool

    In der libnodave.net werden im Destruktor von rs der Speicher für die Funktion wieder freigegeben, d.h. nach einem GC.collect, wenn du keinen verweis mehr auf rs hast, sollte der Speicher wieder frei werden!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  10. #10
    bool ist offline Benutzer
    Themenstarter
    Registriert seit
    26.03.2010
    Beiträge
    94
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    Es ist bei .NET Programmen normal das die Speichernutzung wächst, da der GC nur aufgerufen wird wenn es nötig ist! Solange noch speicher verfügbar ist und nicht von anderen Programmen gebraucht wird, läuft der GC nicht an, da der GC auch Rechenleistung braucht und normalerweise nicht selbst angestossen werden soll!
    Hallo Jochen,
    danke für das Feedback.

    Dass der Speicher deratig starg anwächst (Innerhalb von keinen vier Stunden auf >50MB) möchte/darf ich jedoch nicht zulassen, vor allem nicht auf einem Produktivsystem in der Fertigung wo ettliche andere Programme parallel auf dem System laufen und nicht in Bedrängnis geraten dürfen.

    Alternativen zum zyklischen Aufruf der GC.Collect() vor jedem readRequest()welche ich da so sehen würde:
    a) Aufruf eines zweiten Timer im z.B. 10 oder 60 Minutentakt um den GC.Collect() dort kontrolliert aufzurufen um keine grössere Perfomanceeinbußen zu riskieren. Der "assynchrone" Aufruf in einem zweiten Timer könnte dann höchstens ein Problem darstellen wenn der Destruktor von rs vor der Auswertung aufgerufen wird. Weisst Du ggf. wann der Destruktor von rs bei libnodave.net ausgeführt wird?

    b) Hochzählen eines Zählers innerhalb des ersten Timers und Ausführen des GC.Collect alle x Aufrufe (z.B 1000 oder mehr, je nachdem wieviel MB man +/- tollerieren kann/möchte/darf -> wäre doch ein schönes Parameter fürs Ini-File)

    Ich denke (b)) wäre ein Kompromiss mit dem ich auch leben könnte.

    Gruss,

    bool
    Geändert von bool (16.05.2010 um 15:02 Uhr)

Ähnliche Themen

  1. zu kleiner Speicher? S5-95u
    Von Szina im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 23.02.2010, 05:26
  2. Pc Speicher
    Von waldy im Forum Stammtisch
    Antworten: 23
    Letzter Beitrag: 23.02.2010, 00:21
  3. Speicher der SIMATIC
    Von alphatier im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 03.04.2009, 13:03
  4. DB in CSV Speicher
    Von Anonymous im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 17.12.2005, 13:27
  5. Speicher Karte
    Von heiko im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 11.04.2004, 10:24

Lesezeichen

Berechtigungen

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