Step 7 S7 315 mit leerer Batterie

litlegerman

Level-2
Beiträge
320
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,
ich hatte heute ein seltsame Phänomen an einer etwas betagten Anlage.
Diese ist mit einer S7 315 mit Batterie und einer memory card (die grosse mit 128kb) ausgestattet.
Die Anlage meldete das die Anlage, dass die Batterie leer sei und die Anlage nicht abgeschaltet werden darf.
Darauf hatte anscheinend jemand nicht darauf gehört, denn die Maschine arbeitet nicht mehr wie vorher, eine Funktion wurde nicht mehr abgearbeitet.
Nach dem Zugriff auf das Programm fehlten 1Fb, 1fc und 1 Db.
Quasi waren die Änderungen die ein Kollege vor ca. 10 Jahren gemacht hatte weg...
dann wollte ich über MPI das Projekt rüberbügeln, dass ging nicht, Speicher zu klein, dann hatte ich die karte (via MPI geleert) und wieder speicher zu klein...
Dann habe die Karte via Promer geleert und neu beschreiben, dann ging es.
kann mir das jemand erklären?
 
Es wurden vermutlich Programmänderungen nur im RAM vorgenommen, und diese nicht spannungsausfallsicher auf die Memorycard geschrieben.
Läuft dann die SPS ungepuffert neu an (z.B. wenn Batterie leer), dann wird das Programm so denn vorhanden von der Memorycard geladen. Und dann läuft ein anderer Programmstand, nämlich der zuletzt auf der Karte vorhandene.

Das kann dir bei einer aktuellen S7-400 mit Flash-Speicherkarte immer noch so passieren, hab ich selber schon einmal gemacht ;-)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das habe ich schon irgendwie vermutet,
dann bin ich mit dem verfahren, das ich angewandt habe, ja Safe, da ich es ja mit dem promer direkt au die Karte geschrieben habe...
danke für die schnelle Antwort
 
dann wollte ich über MPI das Projekt rüberbügeln, dass ging nicht, Speicher zu klein
Damit war nicht der Speicher der Speicherkarte (MC) gemeint, sondern der RAM-Speicher der CPU.
Um in dieser Situation laden zu können, hilft evtl. ein "Komprimieren" des Speichers oder notfalls online löschen von einigen oder allen Bausteinen.

dann hatte ich die karte (via MPI geleert) und wieder speicher zu klein...
Wie hast Du die Speicherkarte (MC) "geleert"? :confused:
Meinst Du, Du hast online alle Bausteine gelöscht? Da werden alle Bausteine im RAM-Speicher gelöscht, aber nicht von der Speicherkarte.
Oder hast Du "Urlöschen" ausgeführt? Da wird das Programm von der Speicherkarte in den RAM-Speicher geladen und Du hast wieder den RAM-Speicher-Engpass.

Dann habe die Karte via Promer geleert und neu beschreiben, dann ging es.
Das war vermutlich nicht notwendig.


Wenn man bei den älteren S7-300-CPUs Bausteine in die CPU lädt, dann ist die Speicherkarte (MC) dabei gar nicht beteiligt. Es wird in den RAM-Speicher der CPU geladen. Auf die Speicherkarte in der CPU wird erst geschrieben, wenn man explizit "RAM-nach-ROM-kopieren" aufruft - dann wird das momentan im RAM-Speicher der CPU liegende Programm auf die Speicherkarte (Ladespeicher ROM) kopiert. Weil dieses "RAM-nach-ROM-kopieren" nur im STOP der CPU ausgeführt werden kann, wird es oft vergessen und es kommt zu dem beobachteten Verhalten, daß auf der Speicherkarte (MC) ein anderer Programmstand liegt als im Batterie-gestützten RAM-Speicher der CPU. Ob nach dem letzten Übertragen auf die Speicherkarte Bausteine in die CPU geladen wurden, kann man sehen, wenn man sich im online-Bausteine-Ordner die Spalte "Ladespeicher" ansieht: RAM = Baustein wurde nachgeladen, EPROM = Baustein noch original von der MC.

Harald
 
Danke Harald,
das war ja eine verrückte Welt damals... naja, dann werde ich bei Gelegenheit mal Ram nach Rom kopieren.
Das mit dem komprimieren, hatte er angezeigt, hat aber nicht funktionier. Sowieso hat dieses komprimieren, bei mir noch nie funktioniert, oder mach ich da was falsch?

Gruß
Patrick
 
Zuviel Werbung?
-> Hier kostenlos registrieren
RAM-Speicher Komprimieren

Sowieso hat dieses komprimieren, bei mir noch nie funktioniert
RAM-Speicher "Komprimieren" (siehe Zielsystem > Baugruppenzustand > Speicher):

Immer wenn ein Baustein in die CPU geladen werden soll, dann wird im RAM ein zusammenhängender freier Speicherbereich (Block) für den kompletten Baustein benötigt --> der Baustein wird in diese unbelegte Speicherlücke geladen --> danach wird in der Bausteinverwaltung ein Zeiger vom alten Baustein auf den neuen Baustein umgestellt und beim nächsten Bausteinaufruf wird der neue Baustein aufgerufen. (*) Dadurch entsteht im RAM eine unbelegte Speicherlücke (Block) an der Stelle des alten Bausteins (der RAM wird fragmentiert).

Wenn nun mehrmals Bausteine nachgeladen wurden, dann sind im RAM beispielsweise 2 unbelegte aber nicht zusammenhängende Blöcke je 800 Byte vorhanden und kein weiterer freier Block. Es sind insgesamt 1600 Byte RAM frei, der "Größter freier Block" ist jedoch nur 800 Byte groß. Nun soll ein Baustein mit 1200 Byte geladen werden --> es ist kein freier Block >= 1200 Byte vorhanden --> Meldung "Nicht genug Speicher"! Jetzt kann man "Komprimieren" lassen: der Speicher wird reorganisiert/defragmentiert, die Bausteine werden im Speicher verschoben, so daß die freien Blöcke als ein zusammenhängender Block zu liegen kommen --> das ergibt hier nun einen Block von 1600 Byte --> der Baustein mit 1200 Byte kann nun geladen werden.

Es kann aber auch sein, daß ein Baustein geladen werden soll, der größer als der insgesamt freie Speicher ist - dann hilft auch Komprimieren nicht. Es muß zusammenhängender freier Speicher >= des zu ladenden Bausteins geschaffen werden. Dazu kann man verschiedenes tun
- online nicht mehr benötigte Bausteine (Programmleichen) löschen
- wenn es den zu ladenden Baustein online schon gibt, dann den zu ladenden Baustein zunächst online löschen oder verkleinern
- online zur Zeit nicht benötigte Bausteine löschen, ggf. vorher dafür sorgen, daß die Bausteine nicht aufgerufen/verwendet werden
- temporär verkleinerte Bausteine laden, so daß die Bausteine samt Aufrufschnittstelle zwar noch vorhanden, aber durch Code-Teile löschen kürzer sind
Wenn dann insgesamt genug freier Speicher zur Verfügung steht, dann "Komprimieren" und danach den großen Baustein laden und ggf. die vorher gelöschten oder verkleinerten Bausteine wieder laden. Wenn man das geschickt anstellt, dann kann das sogar im RUN der CPU gelingen. (**)


Bei älteren CPU mit Speicherkarte (MC): Zum Schluß nicht vergessen, bei passender Gelegenheit "RAM-nach-ROM-kopieren" ausführen (erfordert STOP der CPU), damit auf der Speicherkarte der selbe Programmstand wie im RAM der CPU vorhanden ist. Dann gehen beim nächsten ungepufferten Netz-Aus oder Urlöschen keine Programmteile verloren, sondern nur die DB-Aktualwerte.


(*) Auf diese Weise ist es unerheblich, wie lange das Laden eines oder mehrerer Bausteine vom PG in die CPU dauert, und alle Bausteine können nach dem Laden gleichzeitig aktiviert werden, und das sogar im RUN der CPU.

(**) Beim Programmieren mit dem heutigen TIA kann man so geschicktes/kontrolliertes Laden leider nicht durchführen (oder nur allerhöchst umständlich), weil das TIA grundsätzlich schlauer ;) als der davor sitzende Programmierer ist und solches Vorgehen nicht zuläßt.

Harald
 
Zurück
Oben