Novram / cx9020

W

weißnix_

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
[gelöst] Novram / cx9020

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:
Wenn ich den NOV-RAM nutze dann fasse ich die Daten die da rein sollen in einer Struktur zusammen und erzeuge ein Array (als Prozessausgang) von dieser Struktur. Dieses Array kann man dann im Systemmanager direkt mit dem NOV-RAM verknüpfen.
Im PLC Programm kann ich das Array dann ganz normal nutzen (lesen und beschreiben) und ich muss nicht mit den FBs herumhantieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau das möchte ich vermeiden. Über die Link-Funktion sichere ich eigentlich nur einzelne betriebswichtige Parameter. Ich möchte mir ein flexibles Logbuch zusammenbasteln, welches mir nicht die SD-Card "zerschreibt" aber auf der anderen Seite auch auf schwachbrüstigen Systemen läuft.
Das Logbuch soll quasi nur durch den Speicherplatz auf der SDcard begrenzt sein (fortlaufend). Im NOVRAM möchte ich nur die Blöcke sammeln, bis ich entsprechend die Menge für einen Blockzugriff habe.

Erstes Zielsystem ist ein CX9010, der im Sysman so um 80% Auslastung anzeigt.
 
Der Frustpegel bei mir ist momentan etwas gesteigert:
Die Funktion macht (fast) alles wie in der Doku beschrieben. Aber die Daten werden nicht in's NOVRAM geschrieben. Errcodes kommen auch nicht zurück.
 
So kann man sich auch die freien Stunden des Sonntag verderben:

Für mich ging nicht ganz klar aus der Doku die Einbindung des NOVRAM für wahlfreie Zugriffe hervor. Und deshalb hat es nicht funktioniert. Um die Peinlichkeit komplett zu machen:
Unbenannt.png

In diesem Fenster steht zwar schon was drin, für die Adresszuordnung, aber es ist ein Klick auf "Suchen" für die Basisadresse nötig, damit der NOVRAM an der richtigen Stelle gemappt wird.
Ab dem Moment klappt es auch mit dem Nachbarn.
Ich hätte aber bei dem Bytemuster stutzig werden müssen: So sah das damals auf den 8-Bit Rechnern auch immer aus, wenn ich auf einen Adressbereich zugriffen habe, auf dem gar kein RAM physikalisch vorhanden war :(

Ich habe entweder bisher unbewußt alles richtig gemacht bei der Initialisierung des NOVRAM oder ich habe unheimlich Glück gehabt. Allerdings bin ich mit Variablenremanenz ohnehin sehr sparsam.
Edit: Ich muß meine bisher verbauten CX mal prüfen, ob die Auto-Verlinkten Variablen das tun, was sie sollen, oder ob ich da auch dem Fehler aufgesessen bin.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo weißnix_,

bei 4kB Daten würde ich unbedingt eine Steuerung mit 1s-USV verwenden.

Wenn ich eine Steuerung auswähle, dann eigentlich immer eine mit 1s-USV… :rolleyes:

…sonst hätte ich vom Haare raufen ein Glatze und der Bart wäre längst grau… :ROFLMAO:

Gruß
Chräshe
 
Die Anforderungen wachsen und DataLog war zum Anschaffungszeitpunkt kein Thema. Ich habe aber damals schon im Hinblick auf solche Möglichkeiten mit dem NOVRAM geliebäugelt.
Da jetzt alles funzt wie's soll seh ich weiter keinen Grund, der USV nachzutrauern.
 
TwinCAT2 oder 3? Wenn 3 gibt es seit der Version 4020 einen persistent Data handler. In der SPS deklariert man einen Variablenbereich mit VAR PERSISTANT daraufhin erhält man ein neues Prozessabbild was man mit dem Data handler verknüpft. Durch diesen werden nur die Daten geschrieben die sich geändert haben. Das ganze ist ziemlich Performant und sicher. Der Handler sorgt automatisch dafür das die Daten zurückgeschrieben werden bei Neustart und man braucht nicht eine Zeile Code für das ganze handling


Gesendet von iPhone mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe TC2 drauf.

Dessen ungeachtet ist mein Ziel in erster Linie das Abspeichern fortlaufender Betriebsdaten als Datenprotokoll unter Reduzierung der Schreibhäufigkeit auf den Flash.
Mittlerweile hab ich das Handling mit dem NOVRAM im Griff und es trainiert ja auch, wenn man sich nicht immer alles einfach macht.

Ich möchte schreibend auf ein Flashmedium nur in größeren Blöcken zugreifen. Auch wenn ich Industrial Grade SD-Karten drinhab - Die Anlage soll über Jahre laufen und ich hab schon zuviele kaputte Kamera- und Handy-SD-Karten gehabt, um da blauäugig dranzugehen.

Wenn ich also ~4kB Daten sammle und in einem Rutsch schreibe kann das nicht verkehrt sein. Außerdem vermute ich, das es einen Performancevorteil hat (Wichtig, falls ich mal kürzere Intervalle mit mehr Daten habe).
 
@KGU:
Könntest Du den Umgang mit diesem Persistent Data Handler mal etwas näher beschreiben? Mir ist der bis jetzt noch gar nicht aufgefallen.
 
@StructuredTrash:
Vielleicht kann ich aushelfen.
1) Deklaration der Variablen als Retain -> Symbole werden blau im EA-Abbild angelegt
2) Im NovRam "Gerät einfügen" -> Retain Handler. Auch hier ist die Symbolik blau. Es ist möglich mehrere EA-Handler anzulegen.
3) Jetzt das nicht offensichtliche. Die Zuordnung. Im PLC-Image (also im Knoten wo die EAs der SPS aufgeführt sind) gibt es einen Reiter mit der Bezeichnung "Data Area". Hier muss man über eine List-Box die Retain-Variablen dem Retain-Handler zuordnen.

Noch zwei Bemerkungen:
-Die Daten werden im Novram nach meinem Wissen in 2 Puffern abgelegt sodass man garantiert einen konsistenten Puffer hat mit n-1-Werten (worst case Scenario falls mitten in der Schreib-Operation das System kollabiert).
-Es werden zyklisch nur geänderte Werte übertragen was die Performance nach oben kitzelt.
Die zwei Punkte habe ich aus dem Webinar von Beckhoff zur 4020.0 Die Doku zur Funktion hinkt noch etwas hinterher.

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@StructuredTrash:
Vielleicht kann ich aushelfen.
1) Deklaration der Variablen als Retain -> Symbole werden blau im EA-Abbild angelegt
2) Im NovRam "Gerät einfügen" -> Retain Handler. Auch hier ist die Symbolik blau. Es ist möglich mehrere EA-Handler anzulegen.
3) Jetzt das nicht offensichtliche. Die Zuordnung. Im PLC-Image (also im Knoten wo die EAs der SPS aufgeführt sind) gibt es einen Reiter mit der Bezeichnung "Data Area". Hier muss man über eine List-Box die Retain-Variablen dem Retain-Handler zuordnen.

Noch zwei Bemerkungen:
-Die Daten werden im Novram nach meinem Wissen in 2 Puffern abgelegt sodass man garantiert einen konsistenten Puffer hat mit n-1-Werten (worst case Scenario falls mitten in der Schreib-Operation das System kollabiert).
-Es werden zyklisch nur geänderte Werte übertragen was die Performance nach oben kitzelt.
Die zwei Punkte habe ich aus dem Webinar von Beckhoff zur 4020.0 Die Doku zur Funktion hinkt noch etwas hinterher.

Guga

Hallo zusammen,

ist ja der Wahnsinn, dass der Anwender immer noch so viele Möglichkeiten hat, seine Daten Persistent abzulegen. Hatte gehofft, dass das bei TC3 bereits über die entsprechende Deklaration erledigt ist.

Mittlerweile hab ich das Handling mit dem NOVRAM im Griff und es trainiert ja auch, wenn man sich nicht immer alles einfach macht.

@weißnix_
Wenn du Training brauchst, dann gibt es bestimmt noch Sortier- Algorithmen, die noch niemand erfunden hat. ;)
Training, welches aufgrund fehlender Systemfunktionen notwendig ist, finde ich nicht so toll. :sb7:

Auf der anderen Seite muss man sich ständig das Industrie 4.0-Geblupper anhören, obwohl es noch so viele Baustellen auf unterster Anwender-Ebene gibt. :confused:

Gruß
Chräshe
 
Zurück
Oben