Array in Nov Ram

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

versuch mal deine NovRam Daten manuell zu schreiben und nicht direkt als Ausgang zu definieren.

Bei einem Neustart musst du aber die Daten aus dem NovRam einmalig deiner Struktur übergeben.

gruß bonatus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich schick dir mal ein bild als anregung mit.

Die Variable INFO_REMANENT wird auf true gesetzt sobal deine eingelesene Struktur die Werte des NovRams enthält.

Ich hab selber hab die NovRam Struktur in 2 Unterstrukturen unterteilt. Eine Zyklische die aller 5 Sekunden geschrieben wird und die andere Azyklisch die nur bei Änderung eines Zustands der Struktur geschrieben wird.

Hoffe es hilft dir ein wenig weiter.
 

Anhänge

  • NovRamRW.jpg
    NovRamRW.jpg
    143,4 KB · Aufrufe: 42
Danke dir für die Anregung, aber laut Beckhoff sollte das eigentlich nichmehr Notwendig sein seit Version 2.9 um auf das Novram draufzuschreiben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
HM Also ich denke mal ich beschreibe dir mal genau mein Problem vielleicht kannste ja dann dein Jpg meinen Bedürfnissen anpassen damit ich wei was ich schreiben soll. Also:
Das Array was ich in den Nov Ram schreiben will ist ein Array mit einer Struktur die die UserID den UserNamen und das Userlevel enthält. Dieses Array kann über eine Visualisierung verändert werden. Dieses Array soll dann in den NovRam geschrieben werden und bei einem Systemneustart vom NovRam neu eingelesen werden.
Hoffe ich habs jetzt genau genug erklärt.
Und erwarte hoffnugsvoll einen Lösungsvorschlag.
Mfg
COOLT
 
Hallo,

ich habs mal versucht so in etwa zu machen.

NR_Struktur ist deine NovRam Struktur, über die Variable Daten_Speichern schreibst du die Werte. Wie du das jetzt auslegts ist dein Ding - Button, Abfrage, Zyklus,...

gruß bonatus
 

Anhänge

  • NovRamRW.jpg
    NovRamRW.jpg
    138,7 KB · Aufrufe: 33
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verstehe das mit dem Udint dingern noch nich so ganz. Was muss ich nun da angeben damit er das Array
Code:
arrBenutzerliste       :    ARRAY[1..Max_Benutzer] OF st_User;
anspricht? also von dort liest und dort auch wieder reinschreibt?
Und vor allem was is das für ne Addresse? woher bekomme ich die? Wo kann ich die ablesen?
 
Zuletzt bearbeitet:
Hallo,

du schreibst das gesamte Array arrBenutzerliste direkt in den NovRam.

Also NR_Struktur=arrBenutzerliste vgl. mit Bild.

Da brauchst du dir keine Gedanken machen über irgendwelche UDINTs und so.

Edit: Du musst nur darauf achten das dein Array nicht größer ist als dein NovRam Speicher.

gruß bonatus
 
hm muss ich nich iwie noch die NovRam mit iwas verknüpfen? damits auch richtig übernommen wird?

//€dit: weil iwie schreibt der da anscheinend noch nix rüber.

//€dit€dit: Habs nämlich gerade mal ausprobiert: erst normal durchlaufen lassen, damit er das array draufschreibt dann ausgeloggt die vorherige benutzerinitialisierung rausgenommen und dann neu geladen, so dass er eigentlich das Array aus dem Nov Ram hätte holen müssen. Aber iwie hat ers nich.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, das muss halt nicht mehr gemacht werden. Über die DeviceId (nDevId - siehe System Manager NovRam - Allgemein -->Id) wird festgelegt welcher Speicherbereich beschrieben wird. Den Haken "Auto Init linked PLC Outputs" musst oder kannst du rausnehmen.
 
Also ich hab jetz alles so gemacht wie du es vorgeschlagen hast. Die ID ist laut System Manager die 4 ergo hab ich da jetz anstatt der 5 wie bei dir ne 4 eingetragen und den rest so übernommen
Code:
IF fbEinlesen.O_bReadDone THEN
    NovRamReadGO:=TRUE;
ELSE
    NovRamReadGO:=FALSE;
END_IF

IF NOT fbEinlesen.O_bNovRamWriteGO THEN
    NovRamWriteGO:=TRUE;
ELSE
    NovRamWriteGO:=FALSE;
END_IF

(*********************************************)
(*    NovRam beschriftung    *)
IF NovRamReadGO THEN
    fbNovRamReadWriteEx.nDevId:=4;
    fbNovRamReadWriteEx.bRead:=TRUE;
    fbNovRamReadWriteEx.bWrite:=FALSE;
    fbNovRamReadWriteEx.cbSrcLen:=SIZEOF(arrBenutzerliste);
    fbNovRamReadWriteEx.cbDestLen:=0;
    fbNovRamReadWriteEx.pSrcAddr:=ADR(arrBenutzerliste);
    fbNovRamReadWriteEx.pDestAddr:=0;
    fbNovRamReadWriteEx.nReadOffs:=0;
    fbNovRamReadWriteEx.nWriteOffs:=0;
END_IF
(*********************************************)
(*    NovRam Auslesung    *)
IF NovRamWriteGO THEN
    fbNovRamReadWriteEx.nDevId:=4;
    fbNovRamReadWriteEx.bRead:=FALSE;
    fbNovRamReadWriteEx.bWrite:=TRUE;
    fbNovRamReadWriteEx.cbSrcLen:=0;
    fbNovRamReadWriteEx.cbDestLen:=SIZEOF(arrBenutzerliste);;
    fbNovRamReadWriteEx.pSrcAddr:=0;
    fbNovRamReadWriteEx.pDestAddr:=ADR(arrBenutzerliste);
    fbNovRamReadWriteEx.nReadOffs:=0;
    fbNovRamReadWriteEx.nWriteOffs:=0;
END_IF
(*********************************************)
Das NovRamReadGo wir gesetzt sobald ich mich einmal abgemeldet habe.
Ich habe als ersten durchgang noch
Code:
IF NOT bInitialisiert THEN        (*    Beginn der Festlegung    *)
arrBenutzerliste[1].sUserID:='1643109';
arrBenutzerliste[1].sUserlvl:='Admin';
arrBenutzerliste[1].sUserName:='Christian';
arrBenutzerliste[2].sUserID:='1646211';
arrBenutzerliste[2].sUserlvl:='Techniker';
arrBenutzerliste[2].sUserName:='Rafael';
arrBenutzerliste[3].sUserID:='1650637';
arrBenutzerliste[3].sUserlvl:='Admin';
arrBenutzerliste[3].sUserName:='Tobias';
FOR i:=1 TO Max_Benutzer DO    (*    Belegung der restlichen Plätze im Array mit leeren IDs    *)
IF arrBenutzerliste[i].sUserID='' THEN
    arrBenutzerliste[i].sUserlvl:='Kein level vorhanden';
    arrBenutzerliste[i].sUserID:='0000000';
    arrBenutzerliste[i].sUserName:='Noch nicht besetzt';
END_IF
END_FOR;
bInitialisiert:=TRUE;

END_IF
dringelassen und dann ausgeloggt das mit (**) ausgeklammert und nochmal eingeloggt resettet und dann konnt ich mich nimmer anmelden. weil das Array nit beschriftet wurde. Obwohl O_bNovRamWriteGO am anfang meine Schrittkette true gesetzt wird schreibt das NovRam trotzdem nich in mein Array.
 
Hallo,

wenn du etwas in den NovRam geschrieben hast schau mal in die Variable

cbWrite : UDINT;

des FBs FB_NovRamReadWriteEx da wird die Anzahl der geschriebenen Bytes hineingeschrieben.

Das gleiche dann auc mal beim lesen mit

cbWrite : UDINT;

Die beiden Variablen müssten die gleiche Werte haben, aber ungleich Null.
 
Versuch mal die Daten manuell aus dem NovRam zu lesen und deaktiviere mal deinen FB zum schreiben der Daten.

Verändern sich beim Schreiben der Daten eigentlich auch die Daten im System Manager (DPRAM(Online)) ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Iwie tut sich da garnix im NovRam. Wenn ich mein Programm am laufen habe dann ändert das Wohl das es schreit und liest wenn ich Karte draufhab und runter nehme aber mehr auch nich.
 
Hallo,

wenn du es über den FB FB_NovRamReadWriteEx machst musst du nichts weiter verknüpfen. Das ist ja eingtlich das gute daran. Hast du evtl noch alte "Ausgänge" mit dem NovRam Verknüpft?

Edit: Einlesen musst du doch nur einmalig beim Hochfahren oder nach einem Reset, wenn dein Programm läuft und mit den Daten arbeitet musst nicht mehr einlesen. Dann schreibst du nur noch den NovRam.
 
Zuletzt bearbeitet:
Zurück
Oben