Step 7 DB Aktualwerte als Initialwerte hinterlegen

Junge

Level-2
Beiträge
226
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Leute,

langsam aber sicher werde ich Banane im Kopf. Im Forum selber habe ich schon einige Sachen gefunden was das Thema angeht allerdings habe ich es trotzdem nicht zum laufen bekommen.

CPU 314C 2PN/DP (Test Projekt) mit mmc

Ich möchte gerne die Aktualwerte aus meinen DB´s, als Anfangswerte haben. Wenn die MMC Karte mal gezogen wird, so dass nicht wieder alles erneut eingestellt werden muss. In der CPU sind Standardmäßig alle DB remanent und ich habe auch KEIN hacken am "NON-Retain" gesetzt, also soweit alles gut.

Die CPU lädt nach einem Stopp oder nach dem ziehen der MMC die Anfangswerte in die DB´s und hat nicht mehr die Aktualwerte!

SFC 83: ermöglicht DB MMC-> DB Arbeitsspeicher
SFC 84: ermöglicht DB Arbeitsspeicher-> DB MMC

Alles schön und gut, trotzdem klappt es bei mir nicht.

Beispiel:

im DB1 4 Var in word
Über die Variablentabelle lade ich in
db1.dbw0 Anfangswert: 1 Aktualwert: 1
db1.dbw2 Anfangswert: 2 Aktualwert: 2

Code:
      CALL  SFC   83
       REQ    :=M1.0
       SRCBLK :=P#DB1.DBX 0.0 WORD 2
       RET_VAL:=MW10
       BUSY   :=M1.1
       DSTBLK :=P#DB1.DBX 4.0 WORD 2


db1.dbw4 Anfangswert: 0 Aktualwert: 1
db1.dbw6 Anfangswert: 0 Aktualwert: 2


Das funktioniert!
Nur leider wollte ich nicht die Aktualwerte in die Aktualwerte verschoben haben sondern in die Anfangswerte.

Mit SFC84 passiert Garnichts, da kann ich drehen und hebeln aber es passiert nichts.
 
Zuletzt bearbeitet:
Ich möchte gerne die Aktualwerte aus meinen DB´s, als Anfangswerte haben. Wenn die MMC Karte mal gezogen wird, so dass nicht wieder alles erneut eingestellt werden muss.
Um die DB-Aktualwerte aus dem Arbeitspeicher als Urlösch-"Anfangswerte" auf die MMC zu bekommen, braucht man nur den DB aus der CPU laden und wieder hineinladen. Oder RAM-nach-ROM-kopieren (alle DB aus dem Arbeitsspeicher in die MMC schreiben). Oder mit SFC84 im Programm direkt aus dem Arbeitsspeicher in die MMC schreiben.

Auf der MMC gibt es keine Anfangswerte sondern nur "anfängliche" Aktualwerte. Die Aktualwerte im Arbeitsspeicher werden mit den Aktualwerten von der MMC überschrieben, wenn der DB von der MMC in den Arbeitspeicher geladen wird (z.B. bei Urlöschen oder mit SFC83).

Die DB-"Anfangswerte" werden nur offline im Projekt verwendet, z.B. zum Initialisieren von IDB-Instanzen. Willst Du Aktualwerte in die offline-Anfangswerte kopieren, dann mußt Du das manuell für jeden Wert einzeln tun (in die Spalte "Anfangswert" eintragen).

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt bin ich ganz verwirrt :confused:

Hab ich das richtig verstanden, dass ich, um meine DB-Aktualwerte aus dem Arbeitspeicher als Urlösch-"Anfangswerte" auf die MMC zu bekommen, zunächst nur den SFC84 aufrufen muss? ..Kann ich dann die veränderten Aktualwerte im DB sehen?

Was muss ich denn dann mit dem SFC84 anstellen? Ich habe es ja schon versucht, aber es ist nichts passiert! Ähnlich wie im Beispiel oben, habe ich das selbe gemacht nur statt sfc83 halt sfc84 verwendet. Aber ich konnte keine Veränderung im Datenbaustein sehen.
 
Um die DB-Aktualwerte aus dem Arbeitspeicher als Urlösch-"Anfangswerte" auf die MMC zu bekommen, braucht man nur den DB aus der CPU laden und wieder hineinladen. Oder RAM-nach-ROM-kopieren (alle DB aus dem Arbeitsspeicher in die MMC schreiben).
Also: Im Simatic-Manager in die Online-Ansicht gehen, den gewünschten DB markieren und mit Strg+C kopieren, in die Offline-Ansicht gehen und den DB mit Strg+V einfügen. Dann nochmals diesen DB markieren und mit Strg+L wiederum in die CPU laden.
 
Nun das ist genau das, was ich nicht machen wollte :)
Ich suche eine Lösung womit dies umgehen werden kann. Dazu muss man mit dem PG an der Steuerung hängen und es muss/sollte auch ohne gehen.

Aber ich glaube ich hab den SFC84 noch nicht verstanden, bzw. ich bin schon seit geraumer Zeit dran und versuche damit irgendwelche Ergebnisse zu bekommen, aber es tut sich nichts. Es verändert sich einfach nichts im DB.

Ebenfalls die Idee von RAM-nach-ROM-kopieren hat kein Erfolg gebracht. Könnte mir vllt jemand eine Code oder Beispiel Projekt geben, womit ich auf die Lösung kommen kann?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Punkt 1: Versuch Begriffe wie "Urlösch-Anfangswerte" zu vermeiden. Das führt nur zur Verwirrung mit der Spalte "Anfangswert" in der Offline DB-Ansicht.
Auf der CPU gibt es diese nicht und auch in der MMC hast du nur die Spalte Aktualwerte, nur eben mit dem Stand vom letzten mal RAM/ROM oder SFC84.

Punkt 2:
Aber ich glaube ich hab den SFC84 noch nicht verstanden, bzw. ich bin schon seit geraumer Zeit dran und versuche damit irgendwelche Ergebnisse zu bekommen, aber es tut sich nichts.
Es verändert sich einfach nichts im DB.
Hier hast du ein Verständnisproblem: Was soll sich denn deiner Meinung nach, nach dem Ausführen von SFC84 in der Online-Ansicht tun? Richtig, gar nix.
SFC84 kopiert die Aktualwerte des DBs im RAM in die MMC. Beobachten kannst du nur den RAM, der bleibt aber logischerweise von SFC84 unbeeinflusst.

Ebenfalls die Idee von RAM-nach-ROM-kopieren hat kein Erfolg gebracht. Könnte mir vllt jemand eine Code oder Beispiel Projekt geben, womit ich auf die Lösung kommen kann?
Selbes Problem wie oben.

Punkt 3:
Wenn du sehen willst was SFC84 tut, gehe folgendermaßen vor:
  • Erstelle ein DB mit ein paar Werten und lade diesen auf die CPU.
  • Verändere Online die Aktualwerte und merke dir diese.
  • Führe den SFC84 für den DB aus
  • Ändere die Aktualwerte nochmal im RAM
  • Wenn du jetzt die CPU spannungslos machst und neustartest hast du immer noch die Werte vom zweiten mal Ändern im DB.
  • Als nächstes ziehe die MMC und stecke Sie wieder (oder führe ein Urlöschen der CPU per PG aus). Nach dem ziehen/Stecken der MMC führt die CPU beim Neustart automatisch ein Urlöschen aus (erkennbar am Blinken der Stop-LED)
  • Jetzt solltest du die Aktualwerte nach dem ersten mal ändern im DB(RAM) haben (den Stand bevor du SFC84 ausgeführt hast).
 
Zuletzt bearbeitet:
Dem Verständnis halber weise ich Nochmal auf die Speicherarchitektur der S7 hin.

RAM:
Enthält während des Betriebs das Programm und alle DBs mit denen die CPU(Ablaufprogramm) arbeitet.​
REMANENZSPEICHER (in der CPU selbst verbaut)
Sichert (nicht ganz) den RAM bei Spannungsausfall. Hier drin liegt ebenfalls das Programm so wie die Datenbausteine.
Bei Neustart nach Spannungsausfall (etc.) wird das SPS-Programm und der Letztstand der DB-Werte von dort aus in den RAM geladen.​
MMC (LADESPEICHER):
Enthält den Programmstand und die Datenbausteine so wie zuletzt mit dem PG übertragen. (Sofern keine Änderungen durch RAM/ROM oder SFC84)
Die MMC wird im Normalbetrieb der CPU nie angefasst, auch nicht bei einem Neustart nach Spannungsausfall.
VOn der MMC wird das Programm und die Datenbausteinwerte nur während dem Urlösch-Vorgang geholt.​

Ist so nicht 100% korrekt/vollständig, sollte aber das Grundprinzip verständlich machen.
Details, Siehe Handbuch zum S7-300 Speicherkonzept: https://support.industry.siemens.com/cs/ww/de/view/7302326
 
Zuletzt bearbeitet:
.... fühl dich gedrückt und geknutscht RONIN:rolleyes:! Tausend Dank, jetzt ist der Groschen mehr als nur gefallen. Auch Danke an die anderen beiden!

Super Erklärung!

Ich wollte nur noch kurz Ergänzen für andere mit ähnlichen Problem, fürs allgemeine Verständnis.


SFC83: liest einen Datensatz aus einen DB aus dem LADESPEICHER (aus der MMC) und speichert dies in den Ziel DB
SFC84: überträgt einen Datensatz aus einen DB aus dem Arbeitsspeicher (aus der CPU) und speichert diesen in dem Ladespeicher der MMC
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Soweit funktioniert alles wunderbar, ABER jetzt frage ich mich wie ich es hinbekomme einen DB mit verschiedenen Datentypen (und nicht sortiert) schön und einfach zu Übertragen. 20x den SFC84 aufzurufen mit unterschiedlichen ANYpointer ist nicht so schön, da der SFC84 jeweils genau den Datentyp wissen will den man übertragen möchte.
 
Ja, macht Sinn :) . Eigentlich ganz einfach, wenn man es sich nicht immer selber so kompliziert machen würde :ROFLMAO:.
 
Auf keinen Fall die MMC ist nur für begrenzte Schreibzyklen angedacht. Ich hab es so realisiert, dass ich über einen Button "Store" die Aktualwerte transferiere und es darf dann eh nur über ein Passwortgeschützen Bereich erfolgen. Also es, darf nicht jeder X-beliebige daran und die Werte verändern.
 
Ja und nebenbei sollte man die Aktion nicht unbedingt zyklisch machen. Keine Ahnung wie viele SchreibZyklen die MMC aushält, ich wuerds auf einmal am Tag begrenzen
Wir speichern unsere Einstell- und Daten-Dbs auch alle 2 Tage automatisch mit dem SFC84 weg. Wenn auch mit dem kleinem Risiko das mal was inkonsisent ist.

Zur Haltbarkeit der MMC. Habe das mal mit ner MMC getestet in dem ich große Datenmengen mit SFC84, zyklisch so schnell wie möglich, weggesichert habe. Nach ein paar Tagen hatte ich ca. 150k Zyklen (weiß nicht mehr genau wie viele) und die MMC funktionierte noch einwandfrei.

@Junge. Du kannst das auch dynamisch machen in dem du zuerst mittels SFC "TEST_DB" die Länge des DB ausliest.
 
Zurück
Oben