W
weißnix_
Guest
-> Hier kostenlos registrieren
[gelöst] Novram / cx9020
Ich hab da ein Problem mit meinem Programm(?) oder dem Verständnis der Systemfunktion FB_NovRamReadWriteEx.
Erwarten würde ich jetzt, das beim setzen von bwritenovram der String, im Augenblick 28 Byte, geschrieben wird und gemäß Doku sofort zurückgelesen wird. Jedoch passiert folgendes:
Der Schreibzähler cbwrite zeigt korrekt 28 geschriebene Byte an und der Lesezähler zeigt 28 gelesene Bytes an. Jedoch unterscheiden sich die String's zeitstempel und sverify. Es passiert schlich nix weiter. Im Systemmanager, in dem ich mir die Belegung des NOVRAM anzeigen lasse, zeigt tatsächlich auch nur ein Muster an hex 21 00 00 00 21 00 00 00 uswusf.
Beim Rücklesen auf den entsprechenden Offsets wie 0, 4 uswusf steht dann in verify '!' also das ascii für 21h.
Kann mir mal einer bitte in die rechte Richtung schubsen, warum da nix geschrieben wird?
Hintergrund: Ich möchte ein paar Variablen als Betriebsdaten in definierbaren Zeitabständen erfassen und vorformatiert für späteren Dateiexport im NOVRAM speichern (ca. 4kB) um dann später blockweise auf die Speicherkarte zu schreiben. Im Augenblick scheitert es aber beim NVRAM-Zugriff und eh ich noch einen Tag rumbastele frag ich Euch...
Ich hab da ein Problem mit meinem Programm(?) oder dem Verständnis der Systemfunktion FB_NovRamReadWriteEx.
Code:
VAR
novram:FB_NovRamReadWriteEx;
fbfileopen:FB_FileOpen;
fbfileclose:FB_FileClose;
fbfileputs:FB_FilePuts;
zeitstempel:STRING;
bwritenovram: BOOL;
sverify: STRING;
ncbread: UDINT;
ncbwrite: UDINT;
bbusy: BOOL;
berror: BOOL;
nerrid: UDINT;
btest: BOOL;
breadnovram: BOOL;
cblen: UDINT:=28;
END_VAR
(****************************************************************************************)
novram(
nDevId:= 3,
bRead:=bwritenovram ,
bWrite:=bwritenovram ,
cbSrcLen:=cblen ,
cbDestLen:=cblen ,
pSrcAddr:=ADR(zeitstempel) ,
pDestAddr:=ADR(sverify) ,
nReadOffs:=noffset ,
nWriteOffs:=noffset ,
tTimeOut:=t#5s ,
bBusy=>bbusy ,
bError=>berror,
nErrId=> nerrid,
cbRead=>ncbread ,
cbWrite=>ncbwrite );
IF bwritenovram AND NOT bbusy AND NOT berror AND NOT btest THEN
IF zeitstempel = sverify THEN
noffset:=noffset+32;
END_IF;
bwritenovram:=FALSE;
END_IF;
Erwarten würde ich jetzt, das beim setzen von bwritenovram der String, im Augenblick 28 Byte, geschrieben wird und gemäß Doku sofort zurückgelesen wird. Jedoch passiert folgendes:
Der Schreibzähler cbwrite zeigt korrekt 28 geschriebene Byte an und der Lesezähler zeigt 28 gelesene Bytes an. Jedoch unterscheiden sich die String's zeitstempel und sverify. Es passiert schlich nix weiter. Im Systemmanager, in dem ich mir die Belegung des NOVRAM anzeigen lasse, zeigt tatsächlich auch nur ein Muster an hex 21 00 00 00 21 00 00 00 uswusf.
Beim Rücklesen auf den entsprechenden Offsets wie 0, 4 uswusf steht dann in verify '!' also das ascii für 21h.
Kann mir mal einer bitte in die rechte Richtung schubsen, warum da nix geschrieben wird?
Hintergrund: Ich möchte ein paar Variablen als Betriebsdaten in definierbaren Zeitabständen erfassen und vorformatiert für späteren Dateiexport im NOVRAM speichern (ca. 4kB) um dann später blockweise auf die Speicherkarte zu schreiben. Im Augenblick scheitert es aber beim NVRAM-Zugriff und eh ich noch einen Tag rumbastele frag ich Euch...
Zuletzt bearbeitet: