USV, UPS, Persistente Daten, Daten beim Reboot fehlerhaft

Sireth

Level-1
Beiträge
24
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forumsgemeinde,

Ich möchte im Falle eines Spannungsausfalls Daten sichern, sodass sie bei Spannungswiederkehr immer noch Verfügbar sind und das Pragramm dort weiter arbeiten kann wo es aufgehört hat. Ich verwende eine Beckhoff CX8090 und habe den Funktionsbaustein FB_S_UPS_CX80xx implementiert. Zweifellos werden beim Spannungsausfall Daten abgespeichert, aber leider haben einige der als Persistent deklarierten Variablen nach dem Reboot falsche Werte, obwohl ich beim Ausschalten noch beochbachten kann, dass die Variablen die richtigen Werte annehmen. Ich glaube dass ich eine recht große Datenmenge als Persistent deklariert habe (ein Array mit 25 Elementen von einer Datenstruktur die drei weitere Datenstrukturen enthält und mehr) und es daher vermutlich ein Speicherproblem ist.

Meine Fragen: Wie kann ich herausfinden wieviel Speicherplatz für Persistente Daten schon belegt bzw. noch frei ist? Könnte der Fehler auch andere Ursachen haben?

Außerdem: Welchen Vorteil hat eigentlich Quick Shutdown? Ich habe das bei dem Funktionsbaustein FB_S_UPS_CX80xx mal mit und mal ohne Quick Shutdown getestet. Ergebnis war, dass mit Quick Shutdown, die SPS alles neu initialisiert obwohl sie ja eigentlich die Persistenten Daten schreiben sollte. Ohne Quick Shutdown funktioniert es so wie oben beschrieben...
 
Hallo Sireth,

deine Vorgehensweise ist fast richtig.
Vorab:
Es gibt keinen Speicherplatz für persistente Daten...
Die Möglichkeit der Datenremenanz hängt vom Speicher auf der Steuerung sowie dem eingestellten Routerspeicher (System->Echtzeit) ab. Der Routerspeichersollte angepasst werden, wenn du dich irgenwo im MB-Bereich bei der Größe der zu sichernden Daten befindest.

Ansonsten zur Vorgehensweise:
Implementiere den FB_WritePersistentData und rufe ihn auf, sobald du einen Spannungseinbruch detektierst.
Funktioniert das besser?

Bitte um Rückmeldung!

Beim Quick Shutdown wird vermutlich gar keine Zeit mehr sein, die persistenten Daten zu sichern.

Gruß,
mac203
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort. FB_WritePersistentData schreibt aber laut FAQ-thread auf den Flash-Speicher, da mache ich mir Sorgen den zu zerstören. Ich muss erst sehen wie ich den das mit dem NOVRAM verknüpfen kann
 
Was hat das NOVRAM mit den persistenten Daten zu tun?
Das sind zwei komplett unterschiedliche Speichermedien die auch vollkommen anders behandelt werden müssen.

Logisch schreibt FB_WritePersistentData in den Flash Speicher. Wohin auch sonst? Da liegen doch die persistenten Daten.
Der FB_WritePersistentData soll doch im Falle eines Spannungseinbruchs gestartet werden und genau die persistenten Daten explizit auf die Karte legen.
 
http://www.sps-forum.de/codesys-und...l?49643-FAQ-alles-rund-um-TwinCAT=#post362870

Ich habe keine Ahnung, wie der Baustein arbeitet. Vermutlich wird er bei Spannungsausfall mehrfach ausgeführt und schreibt jedes mal eine große Datenmenge auf den Flash. Ich mache mir sorgen, dass ich durch kleine Fehler in der Programmierung den Flash zerstören könnte, weil zu häufig darauf zugegriffen wird. Daher lieber NV-RAM. Dann heißt es halt nicht "Persistente Daten" ... Es ist ein Umweg aber ich glaube es ist sicherer. Allerdings bin ich jetzt auch wieder verwirrt, weil brauche ich dann überhaupt noch FB_WritePersistentData? Unter obigem link heißt es man sollte es Verknüpfen wenn ich das richtig verstanden habe, aber unter
http://infosys.beckhoff.com/index.p...031/tcsystemmanager/reference/fcnovram.htm&id steht, man darf die Variablen die mit NV-RAM verknüpft sind nicht mehr als Persistent deklarieren... :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nun ich weiß ziemlich genau, wie der Baustein funktioniert.

Wenn du den Baustein beim Spannungseinbruch aufrufst, also genau dann, wenn du über die USV die Info bekommst, wird dieser nur einmal aufgerufen.
TwinCAT ruft die Funktion autoamtisch beim geregelten Herunterfahren auf. Das geschieht aber nicht (immer zuverlässig) wenn die USV einfach abschaltet.

Wenn du also persistente Daten verwenden möchtest, dann ist das der einzige Weg.
Dazu müssen dann die Variablen mit dem Schlüsselwort PERSISTENT gekennzeichnet werden.

Andere Vorgehensweise ist das NOV-RAM.
Physikalisch sieht es so aus, dass es zwei Speicher (ROM und RAM) gibt, die automatisch gefüllt werden.
Beim Ausschalten des Geräts wird dann automatisch vom ROM ins RAM geschrieben.
Aber um die Daten erst mal in den ROM Bereich zu bekommen, muss auch hierzu ein Baustein aufgerufen werden:
FB_NovRamReadWriteEx
Dieser hingegen kann z.B. zyklisch aufgerufen werden, ohne dass es Probleme mit der Haltbarkeit bzw. Lebensdauer von Speicher gibt.
Aber: Variablen müssen hierzu immer über AT%MB/MX adressiert werden.
Und: Der Novram Speicher ist Geräte-abhängig. D.h. der Speicher ist begrenzt und unterschiedlich beim jeweils eingesetzten Gerät.
 
Es wäre gut zu wissen wie der Baustein arbeitet. Wann und wie oft schreibt er die Daten? Ich gehe jetzt davon aus, dass der nur einmal ausgeführt wird sobald er die Flanke durch den Spannungsausfall erhält. Ich muss die Anlage aber erst sicher stoppen bevor die endgültigen Daten gespeichert werden. Das heißt die Programm muss erst noch einige Zyklen weiterlaufen bis die zu speichernden Daten vorhanden sind...
 
Er schreibt, wie zuvor schon beschrieben nur bei steigender Flanke die Daten.
Den Zeitpunkt zum Schreiben, kannst du also vollkommen frei wählen.

Aber deine Sorge ist berechtigt, aber sicherlich in dem Maße unebgründet.
Du arbeitest mit einer Industrie-Speicherkarte, die pro Zelle (soweit ich weiß) ca. 60.000 Schreib-/Lesezyklen erlaubt. Die Zellen sind je nach Gesamtkartengröße vielleicht 16B-16kB groß.
Jetzt rechne mal, wie lange deine Karte hält, bei der Datenmenge, die du sichern möchtest.
Bedenke, du schreibst nur einmal beim Ausschalten auf die Karte.
 
Ich muss die Anlage aber erst sicher stoppen bevor die endgültigen Daten gespeichert werden. Das heißt die Programm muss erst noch einige Zyklen weiterlaufen bis die zu speichernden Daten vorhanden sind...
Dann wird Dir der FB_S_UPS_CX80xx im Standardmodus "eSUPS_WrPersistData_Shutdown" nicht helfen, weil er die Daten beim Spannungsausfall sofort schreibt. Du müsstest ihn im Modus "eSUPS_CheckPowerStatus" betreiben und den Ausgang "bPowerFailDetect" selbst auswerten, um die Daten mit einem "FB_WritePersistentData" verzögert schreiben zu können. So etwas habe ich selbst aber noch nicht ausprobiert.
Zuvor solltest Du aber, wie schon erwähnt, die Grösse der persistenten Daten berechnen und nachschauen, ob der Routerspeicher ausreicht.
Und NOVRAM ist beim CX80xx wohl keine Alternative, laut den technischen Daten hat er gar keinen solchen Speicher.
 
Ich habe es jetzt mal mit FB_WritePersistentData versucht aber das Ergebnis bleibt leider dasselbe: Es wird eine Variable als gesetzt abgespeichert die zu keinem Zeitpunkt während des Programmablaufs gesetzt war. Muss ich beim deklarieren von ARRAYs und STRUCTs was bestimmtes beachten? Ich habe jetzt eine ARRAY von einer STRUCT, die drei weitere STRUCTs enthält als PERSISTENT deklariert. Dann müssten doch alle Variablen die zu der STRUCT gehören PERSISTENT sein oder?
Und was Passiert wenn ich eine Variable eines Funktionsbausteins als PERSISTENT deklariere? Der Funktionsbaustein wird von einem anderen Funktionsbaustein aufgerufen, der in der MAIN aufgerufen wird. Wird jetzt der ganze Funktionsbaustein der in der Main aufgerufen wird gespeichert? Das wäre dann vermutlich sogar noch das größere Problem als das ARRAY...
 
Benutzt Du eine externe USV, die ermöglicht die Anlage herunterzufahren und dann noch zu speichern oder gehst Du von der 1s USV aus?

Wo kommt das Signal "Spannungsausfall" her? Die USV gibt es sicher sofort, was den Speichervorgang triggert. Das Signal muss dann bis zum sicheren Zustand verzögert werden. Und dann brauchst Du noch genügend "USV-Energie" zum speichern.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
1s USV, Ich verwende den Funktionsbaustein FB_S_UPS_CX80xx
fbUPS(
sNetID:= sAmsNetiIdCX8090,
iPLCPort:=801 ,
tTimeout:=DEFAULT_ADS_TIMEOUT ,
eUpsMode:=eSUPS_CheckPowerstatus(*WrPersistData_NoShutdown*) ,
ePersistentMode:=SPDM_2PASS ,
tRecoverTime:= T#10s,
bPowerFailDetect=>UPS ,
eState=> );

Mit UPS starte ich dann die Verzögerung bis FB_WritePersistentData ausgeführt wird
 
Ich habe jetzt eine ARRAY von einer STRUCT, die drei weitere STRUCTs enthält als PERSISTENT deklariert. Dann müssten doch alle Variablen die zu der STRUCT gehören PERSISTENT sein oder?
Ja.
Und was Passiert wenn ich eine Variable eines Funktionsbausteins als PERSISTENT deklariere? Der Funktionsbaustein wird von einem anderen Funktionsbaustein aufgerufen, der in der MAIN aufgerufen wird. Wird jetzt der ganze Funktionsbaustein der in der Main aufgerufen wird gespeichert?
Nein, nur der FB, der die persistente Variable enthält.
1s USV, Ich verwende den Funktionsbaustein FB_S_UPS_CX80xx
fbUPS(
sNetID:= sAmsNetiIdCX8090,
iPLCPort:=801 ,
tTimeout:=DEFAULT_ADS_TIMEOUT ,
eUpsMode:=eSUPS_CheckPowerstatus(*WrPersistData_NoShutdown*) ,
ePersistentMode:=SPDM_2PASS ,
tRecoverTime:= T#10s,
bPowerFailDetect=>UPS ,
eState=> );

Mit UPS starte ich dann die Verzögerung bis FB_WritePersistentData ausgeführt wird
Wenn die Verzögerung nicht zu lang ist, sollte das funktionieren.
Hast Du mittlerweile die Grösse der persistenten Daten ermittelt?
 
Das ist richtig, jedoch hat Beckhof die 128kB-NOVRAM-Klemme zum nachrüsten.
Ja, die kenne ich nur zu gut. Im Versuchsaufbau hat der zyklische Modus einwandfrei funktioniert, in einer konkreten Anwendung hatte ich aber des Öfteren nur noch Nullen nach dem Einschalten. Mit dem gleichen Verhalten habe ich mich beim NOVRAM der CX10x0-Netzteile schon mal eine Woche herumgeschlagen, bis der Beckhoff-Support mir mitteilte, dass beim Einsatz des E-Bus eine ungünstige Verkettung von Ereignissen dazu führen könnte. Bei der EL6080 bin ich deshalb sofort auf
die azyklische Speicherung umgestiegen, die Konfiguration der Klemme ist dabei allerdings abenteuerlich, um es mal vornehm auszudrücken.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast Du mittlerweile die Grösse der persistenten Daten ermittelt?
Naja ich weiß nicht recht was ich da alles mit einbeziehen muss... also zB. für eine UINT-Variable würde ich jetzt 16BIT Rechnen, das ist ja noch recht simpel, aber was ist mit meinen Strukturen? brauchen die neben den einzelnen Elementen die sie enthalten noch weiteren Speicher ? Und ich habe noch einen Funktionsblock TON in einer Struktur gespeichert, was verbraucht der an Speicher? Ich hab jetzt immer mal etwas Zuschlag gemacht so dass ich vielleicht mit etwas zu viel Rechne, ... damit komme ich über 1MBYTE
 
Über 1 MB wären allerdings kritisch, da laut Beckhoff die Sekunden-USV für max. 1 MB ausreicht. Aber bist Du sicher, dass es soviel ist? Wenn ich Dich richtig verstanden habe, befindet sich zumindest der Grossteil der persistenten Daten in einer Array of Struct-Variablen. Deren Grösse könntest Du zur Laufzeit mit der SizeOf-Funktion ermitteln.
 
Hmmh mir scheint ich habe mächtig untertrieben... alleine das ARRAY benötigt schon 1800 BYTE :(
Ist ies vielleicht möglich nicht das ganze ARRAY mit allen Strukturelementen als Persistent zu deklarieren, sondern nur einige Elemente der Strukturen? Wobei ich vermute das selbst das mir nicht helfen wird...
 
Zurück
Oben