WAGO 750-880 Retain Speicher fast voll ---> warum?

Hans_

Level-1
Beiträge
10
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe hier ein 750-880 (FW09) mit einem nicht sehr aufwändigen Programm drauf (Haussteuerung).
Beim Übersetzen ist mir aufgefallen, dass der Retainspeicher schon zu 75% ausgelastet ist.

Ich habe zwei globale Booleans als Retain Persistent deklariert und in der PLC_PRG vier Scheduler vom Typ Weekly am Laufen.

VAR RETAIN PERSISTENT
myScheduleWeekly_01: typScheduleWeekly;
myScheduleWeekly_02: typScheduleWeekly;

myScheduleWeekly_03: typScheduleWeekly;
myScheduleWeekly_04: typScheduleWeekly;
END_VAR

Dazu muss ich sagen, dass ich unter den Globalen Variablen zuvor versehentlich auch einen ungenutzen typScheduleWeekly und einen ungenutzen typPublicHoliday deklariert hatte.
Die habe ich gelöscht aber es stellt sich keine Besserung ein. Überhaupt: Wenn ich die 4 o.g. Scheduler rausnehme wird die Retainspeicherauslastung auch nicht kleiner.

Alles bereinigen und neu übersetzen hilft auch nicht. Woran könnte das liegen?

Zielsystemeinstellung sagen:

retain1.jpg

Hans
 
Zuletzt bearbeitet:
Ich habe gerade gesehen, dass der FbStromstoss zur Tasterauswertung auch jeweils einen Boolean als retain persistent nutzt.
Da habe ich auch einige von im PRG, aber selbst wenn das 40 oder 50 Taster wären, würde das die hohe Auslastung des Retainspeichers nicht erklären, oder?

Hans
 
Ja, den Thread hab eich auch mittlerweile gesehen.
Heißt das, dass ein FB der den FB_Stromstoss nutzt, komplett (was bedeutet das?) Retain ist?

Wenn man sich den FbStromstoss aus der WAGO GebaeudeLib ansieht, sieht man, dass dort ein Boolean (xAktor_old) retain deklariert ist.
Vermutlich damit nach einem Stromausfall der Schaltzustand erneut hergestellt werden kann!?
Wenn das für mich verzichtbar wäre, gibt es eine Möglichkeit FbStromstoss ohne retain_Boolean zu generieren/erhalten?
 
Ich würde es so verstehen, dass alle Variablen vom FB dann Retain sind.

Bin da leider auch erstmal etwas überfragt, da ich so eine Situation noch nicht hatte.
Bausteine von einer Bibliothek kann man leider nicht ändern.

Eventuell den Baustein mit der Funktion, die man braucht eben selber schreiben.
Ich benutze eben nicht viele Bibliotheken, daher bin ich noch nie auf dieses Problem gestoßen.

Edit: Im Handbuch steht, dass wenn nur eine Variable im FB Retain ist, wird die ganze Instanz Retain gespeichert. Also die Ursache von deinem Problem ist somit gefunden.

Edit 2: Der Baustein macht ja nicht viel, den kann man ja fix selber schreiben. In der PDF zur Bibliothek steht ja drin, was er macht.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Hans_,

es ist leider so wie Accused schon richtig beschrieben hat und zwar wenn eine Variable in einem Funktionsbaustein(FB) Retain angelegt ist, dann sind alle anderen Variablen in diesem FB ebenfalls Retain. Deshalb würde ich Ihnen ebenfalls raten, die Funktion einfach nachzubauen. Ich hoffe ich konnte Ihnen helfen.
 
Noch eine Ergänzung von meiner Seite, das speichernde Verhalten eines selbstgebauten Baustein kann man ja auch mit einer INOUT-Variable lösen, die dem Baustein zugeführt wird und Global als Retain deklariert wird.
Vielleicht findet ja man die Lösung in der nächsten Version der Wago GebäudeLib. ;)
 
Hi, ich hatte das selbe Problem und habe alle FB_Stromstoss mit eigenen ersetzt. Das hat bei mir das Problem gelöst.
Ich habe auch eine Vielzahl von Schedulern, die sind unproblematisch.
ach so: 750-881
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe das nun so umgesetzt:
FB_myStromstoss nutzt keine retain-Variablen mehr. Und plötzlich benutzt ich unter 1% des Retainspeichers.
Den Eingang habe ich mit DEBOUNCE aus der OSCAT pauschal mit 50ms entprellt. Hat der originale Fbstromstoss von WAGO überhaupt ein Entprellen eingebaut?

Varianblen:
Code:
FUNCTION_BLOCK FB_myStromstoss

VAR_INPUT
    xTaster: BOOL;
    xZenAUS: BOOL;        (* ---> zentral AUS *)
    xZenEIN: BOOL;        (* ---> zentral EIN *)
END_VAR

VAR_OUTPUT
    xAktor: BOOL;            (* ---> Schaltausgang *)
END_VAR

VAR
    xTaster_OLD: BOOL:=FALSE;        (* ---> interner Merker *)
    xTaster_debounced:BOOL;
    myDEBOUNCER:DEBOUNCE;
END_VAR

Programm:
Code:
myDEBOUNCER (IN:=xTaster, TD:=T#50ms,PM:=FALSE);        (* ---> mit 50ms entprellt; DEBOUNCE aus OSCAT Building 100 *)
xTaster_debounced:=myDEBOUNCER.Q;

IF (xTaster_debounced AND NOT xTaster_OLD ) THEN    (* ---> Flankenerkennung: Wenn Taster gedrückt und im *)
                                                (* Zyklus zuvor war er noch nicht gedrückt, dann... *)

xAktor:=NOT xAktor;                        (* ---> Schaltausgang toggeln *)

END_IF;

xTaster_OLD:=xTaster_debounced;                        (* ---> Merker anpassen *)

IF xZenAUS THEN xAktor:=FALSE;            (* ---> zentral AN/AUS wird durchgereicht *)
END_IF

IF xZenEIN THEN xAktor:=TRUE    ;        (* ---> zentral AN/AUS wird durchgereicht *)
END_IF
 
Zurück
Oben