CX9000 - Verwendung von Novram

wisi

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS-Gemeinde,

ich möchte in meinem SPS-Projekt gerne einige Daten (es sind nur ein paar Mini-Arrays) in einem nicht-flüchtigen Speicher ablegen.
Da ich gerne das Flash meines CX9000 schonen will und ich auch nicht den absoluten Ausfallschutz benötige, hab ich schon herausgefunden, dass es da das Nov-Ram gibt, offenbar ein batteriegepufferter Speicher, der einen Stromausfall/Neustart "überlebt".

Nun meine Frage(n):
Wie benutze ich den Speicher? Ich habe in älteren Posts gelesen, es gäbe da zwei Möglichkeiten:
- einmal per FB (gibt's da ein Code-Beispiel?)
- und einmal per Twincat-Konfiguration ... soll aber bei meinem Rechner die CPU recht belasten (?).
Was sind hier die Vor- und Nachteile und wie funktioniert's?

Anzumerken wäre noch, dass ich nicht bei jedem Zyklus lesen oder schreiben muss, sondern nur bei bestimmten "Events".

Bin für jede Hilfe dankbar.

Christian
 
Hallo,

meines Wissens gibt es Bausteine dafür, schau doch mal nach z.B. "FB_NovRamReadWriteEx" und weitere.

Viele Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Auf zyklisches Schreiben würde ich auch verzichten. Es belastet nicht nur den CX sehr stark, sondern es besteht auch die Gefahr, dass bei einem SPS-Stop der NOVRAM mit Nullen beschrieben wird.
Für den ereignisgesteuerten Zugriff gibt es, wie schon Fx64 schreibt, den FB_NovRamReadWriteEx, es geht aber auch mit den Standard-ADS-Bausteinen.
Code:
VAR
   NVRead:ADSREAD;
   NVWrite:ADSWRITE;
END_VAR

NVRead(
NetID:='',
Port:=300,
IdxGrp:=16#8003,   (* Die "3" ist die Geräte-ID des NOVRAM's, musst Du im Systemmanager nachschauen, welche ID er bei Deinem CX hat *)
IdxOffs:=0,             (* Byte-Offset im NOVRAM, wenn Du nicht alles an einem Stück lesen/schreiben willst, brauchst Du dafür eine Variable *)
Len:=SizeOf(ReadData),
DestAddr:=Adr(ReadData),
Read:=ReadTrigger,
TmOut:=t#3s);

NVWrite(
NetID:='',
Port:=300,
IdxGrp:=16#8003,   
IdxOffs:=0,
Len:=SizeOf(WriteData),
SrcAddr:=Adr(WriteData),
Read:=WriteTrigger,
TmOut:=t#3s);
 
Hallo "ST",

Danke für Deine Antwort.

Auf zyklisches Schreiben würde ich auch verzichten. Es belastet nicht nur den CX sehr stark, sondern es besteht auch die Gefahr, dass bei einem SPS-Stop der NOVRAM mit Nullen beschrieben wird.
Meinst Du mit zyplischem Schreiben die von mir als zweites genannte Variante?

Für den ereignisgesteuerten Zugriff gibt es, wie schon Fx64 schreibt, den FB_NovRamReadWriteEx, es geht aber auch mit den Standard-ADS-Bausteinen.
Code:
...

OK. ist schonmal interessant. Wie schaut hier ReadData und WriteData aus, wenn es sich um Arrays handeln? Gilt im einfachsten Fall ReadData = WriteData, d.h. man deklariert hier nur eine Variable als Container?

Allgemeine Frage zum Nov-Ram. Kann ich darüber frei verfügen, oder läuft man hier Gefahr, etwas zu überschreiben, weil der Speicherbereich evtl. noch anderweitig genutzt wird (etwa von irgendwelchen FBs)? Deine ADS-Befehle könnten ja theoretisch die kompletten 128kB des CX9000 einlesen und schreiben.

Besten Dank für Deine Hilfe
Christian
 
Meinst Du mit zyplischem Schreiben die von mir als zweites genannte Variante?
Ja.
OK. ist schonmal interessant. Wie schaut hier ReadData und WriteData aus, wenn es sich um Arrays handeln? Gilt im einfachsten Fall ReadData = WriteData, d.h. man deklariert hier nur eine Variable als Container?
Du gibst in den FB-Aufrufen Grösse und Adresse der Variablen an. Ob das einfache Datentypen sind oder Arrays oder Structs, spielt keine Rolle. Natürlich kannst Du zum Lesen und Schreiben dieselbe Variable verwenden.

Allgemeine Frage zum Nov-Ram. Kann ich darüber frei verfügen, oder läuft man hier Gefahr, etwas zu überschreiben, weil der Speicherbereich evtl. noch anderweitig genutzt wird (etwa von irgendwelchen FBs)? Deine ADS-Befehle könnten ja theoretisch die kompletten 128kB des CX9000 einlesen und schreiben.
So weit ich weiss, hast Du den gesamten NOVRAM zur freien Verfügung.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

seit der TwinCAT Version 2.9 sind keinerlei FBs mehr notwendig um mit dem NOVRAM zu arbeiten.

Im Infosys von Beckhoff ist eigentlich sehr einfach beschrieben wie man mit den NOVRAM benutzt. KLICKI KLICKI

Also einfach die Variablen, die im NOVRAM gespeichert werden sollen, als Ausgangsvariablen deklarieren (AT%Q*), im Systemmanager in der NOVRAM Baugruppe die entsprechenden Verknüpfungen erzeugen, den Haken bei "Auto Init linked PLC Outputs" setzen und fertig.

Problem (zumindest bei mir):
Das ganze funktioniert irgendwie nur mit globalen Variablen. Wenn ich Variablen aus einem FB in den NOVRAM schreibe, was ohne Fehlermeldungen funktioniert, sind die Werte nach einem SPS Neustart trotzdem wieder 0.
Hatte bisher noch keinen Nerv mich deswegen an die Hotline zu wenden.....
 
Hatte bisher noch keinen Nerv mich deswegen an die Hotline zu wenden.....
Die wird Dir ganz bestimmt weiterhelfen.:ROFLMAO:
Ich hatte ähnliche Probleme und habe mir die Achse abgedreht, um dagegen etwas zu tun. Nach langem Bohren auch jenseits der Hotline bekam ich schliesslich von Beckhoff die Auskunft, dass bei einem SPS- oder Feldbus-Stop eine "ungünstige Verkettung von Ereignissen" dafür sorgen kann, dass auch nach dem Nullsetzen der Ausgänge noch ein NOVRAM-Schreibvorgang stattfindet. Seitdem verwende ich die NOVRAM-Klemme EL6080.
 
Hallo MasterOhh,

danke für Deine Antwort. Kann ich diese so verstehen, dass die Implementierung via Twincat Konfiguration nicht mit Performance-Einbußen verbunden ist, d.h. Twincat ist schlau genug, die Variablen nur zu schreiben, wenn sie sich ändern bzw. wenn gelesen wird?

In meinem Falle möchte ich einige Lichtszenen (3 Bool-Arrays und drei INT-Arrays) als Presets abspeichern, d.h. das Lesen aus dem Nov-Ram wäre nur beim Aufruf (Auswahl per Tastendruck) und das Schreiben nur beim Speichern (ebenfalls per Taste) nötig.

Besten Dank!
WISI
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann ich diese so verstehen, dass die Implementierung via Twincat Konfiguration nicht mit Performance-Einbußen verbunden ist, d.h. Twincat ist schlau genug, die Variablen nur zu schreiben, wenn sie sich ändern bzw. wenn gelesen wird?
Nein, so schlau ist TwinCat nicht, die Daten werden zyklisch geschrieben, und das kann gerade einen schwachbrüstigen CX9000 arg ins Schwitzen bringen. TwinCat ist im Gegenteil sogar so dumm, dass es die NOVRAM-Daten bei einem SPS- oder Feldbusstop manchmal löscht, weil es ja schliesslich Ausgänge sind, die dabei auf 0 gesetzt werden.
 
Für deinen Anwendungsfall wäre das persistente Speichern im Flash vieleicht die bessere Alternative. siehe FB_WritePersistentData

Ob beim Speichern in den NOVRAM geprüft wird ob die Daten sich geändert haben kann ich mir nicht vorstellen. Da ja alles über das Prozessausgangsabbild geht werden die Daten sicher zyklisch geschrieben. Performanceprobleme sollte es aber nur geben, wenn du mit sehr kleinen Zykluszeiten und großen Datenmengen arbeitest.
In einem Projekt habe ich ein Array[1..100] of Int das im NOVRAM gespeichert wird, das geht problemlos.......
 
Jetzt muss ich mich da mal dranhängen.
Ich möchte das NovRam für die Speicherung bestimmter Systemdaten nutzen (zB. Speicherung von Einschaltdauern, die vom Benutzer frei definiert werden können)

Jetzt habe ich das so konfiguriert wie in der Infosys von Beckhoff beschrieben, und solange der Strom nicht weg ist, startet die CPU auch wieder mit den gewünschten, gespeicherten Werten. Wenn ich jedoch die Spannung wegnehme und dann neu starte, stehen irgendwelche undefinierten Werte in den Variablen? Nicht Null!

Kennt jemand dieses Verhalten?

Danke

greetz
Christian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo blubbi,

glaube mir, wenn du die Spannung wegnimmst und nach dem neu hochfahren sind die Daten weg, dann stimmt was nicht! :rolleyes:

Wenn du hier noch reinschreibst, was du genau gemacht hast und wo das im Infosys steht (Link), dann kann dir vermutlich sogar jemand helfen... ;)

LG Cassandra
 
Moin moin ...

da gibt es im System Manager eine Checkbox "Auto Initialize linked Variables" oder so aehnlich, eventuell ist der nicht angehakt ? dann werden die Variablen nicht geladen ...

Genauen Wortlaut kann ich jetzt am Woend. icht sagen, aber ich hoffe es hilft!

gruss,
michael
 
Zurück
Oben