Twincat - Array[1..1000] of Struktur automatisch in NOVRAM

forellengarten

Level-1
Beiträge
217
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht fehlt mir nur der Aha-Effekt zu folgendem Problem:

Folgende Variablendeklaration:
NovramSchaltprotokoll AT%Q*:ARRAY[1..1000] OF ST_Schaltprotokoll;

Diese Array-Struktur möchte ich in den Novram-Speicher kriegen. Das klappt zwar soweit dass ich im Systemmanager bei Novram das Array unter den Ausgängen anfügen kann und dieses dargestellt wird. Allerdings muß ich nun von Hand auf jeden Arrayeintrag clicken und dort jedes einzelne Strukturelement verknüpfen. Das geht doch bestimmt auch automatisch, aber ich steige einfach nicht dahinter wie das geht?

P.s. TwinCat 2

Danke euch sehr für einen guten Tipp!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Lass es pro Tag 100 Protokolleinträge sein. Mach mir da über Performance keine Gedanken. Obwohl... wird ja auch ohne neuen Eintrag zyklisch beschrieben... könnte da tatsächlich mal drüber nachdenken ob nicht weniger reichen. Nichts desto trotz, die Fragestellung bleibt die gleiche ;)
Gespeichert werden jeweils: 1xUSINT, 1xBOOL, 1xDT. Also keine große Geschichte.
 
Zuletzt bearbeitet:
Moin Moin,

Im System Manager (wenn der CX oder was auch immer gescannt wurde) in den IO-Bereich NoVRAM gehen, dort eine neue Variable anlegen, in der Typenliste die Struktur suchen (evtl. Das PLC Projekt neu einlesen!), diese Struktur auswählen und mit der Variable der Struktur verlinken.

Ganz wichtig ist dann noch die Checkbox "Auto Reload Data", damit das System die Daten beim Neustart auch zurück laed.

Sollten die Datenbereiche zu groß sein,in einen langsamen Task auslagern.

Eventuell wenn es sich um einen CX handelt USV einsetzen und ohne NoVRAM arbeiten ist bestimmt auch ne Idee ...

Gruß,
Michael
 
Moin Moin,

Im System Manager (wenn der CX oder was auch immer gescannt wurde) in den IO-Bereich NoVRAM gehen, dort eine neue Variable anlegen, in der Typenliste die Struktur suchen (evtl. Das PLC Projekt neu einlesen!), diese Struktur auswählen und mit der Variable der Struktur verlinken.


Sollten die Datenbereiche zu groß sein,in einen langsamen Task auslagern.

Gruß,
Michael

Danke für den Tipp. Klappt aber irgendwie nicht so richtig. TwinCat übernimmt zwar so die Struktur, klicke ich jedoch auf das Kreuzchen, um mir die einzelnen Verknüpfungen anzusehen, so sind diese leer und zeigen auch unter dem Button "online" keinen Wert an. Interessant jedoch: irgendetwas scheint schon mit der Struktur zu passieren, denn die Performance geht wahnsinnig in den Keller (original 17% Auslastung, mit der Struktur 70% (!) Auslastung). Spricht ganz klar für deinen Vorschlag bzgl. Auslagern in langsame Task (und Array verkleinern).

Hab dann auch einen Reset versucht. Alle meine anderen Novram-Werte bleiben erhalten - meine neu angelegte Struktur ist jedoch tatsächlich weg.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi ...

Da wir das rein für Produktdaten auch so machen (liegen in einer Struktur) funktioniert das schon ...
Ich mache morgen mal einen Screenshot wie das ganze aussieht ...

Aber die Datenmenge so gering wie möglich halten oder eben auf Systeme mit usv oder zumindest 1 sec usv ausweichen.

Gruß,
Michael
 
Moin Moin,

...Sollten die Datenbereiche zu groß sein,in einen langsamen Task auslagern...
Gruß,
Michael

Blöde Frage: wie mache ich dieses Auslagern. Meine Globalen Novram-Variablen sind ja nicht direkt an ein Hauptprogramm geknüpft, oder doch? Wie oft wird dann der Novram eigentlich aktuallisiert? Oder anders gefragt: ich erzeuge ein Programm mit mein einer sehr langsamen Zykluszeit. Aber wie teile ich dem System mit, daß die Novram-Aktuallisierungsrate an diesem langsamen Programmzyklus hängen soll? Glaube ich steh ziemlich daneben :confused:
 
Moin forellengarten,

das NovRam ist eigentlich nicht dafür gedacht um große Datenmengen zyklisch zu sichern, das sollte nur mit wenigen Daten passieren. Deine Struktur (1000x7Byte) würde ich in 1k Blöcke teilen und Asynchron bei Bedarf in den NovRam schreiben, damit bleibt deine Auslastung niedrig.
Hier ein Beispiel mit im Merkerbreich lokierten Daten:

IF bFirstRestore THEN
CASE nStepWrite OF​
0: IDXOFFS := 1000 * Umlauf ;
IF fbAdsWriteNovRam.Busy = FALSE THEN
fbAdsWriteNovRam(WRITE := FALSE);
IF fbAdsWriteNovRam.ERR = TRUE THEN
nStepRead := 1000;
ELSE
Umlauf := Umlauf +1;
CASE Umlauf OF
1: SRCADDR := ADR (%MB1000);
2: SRCADDR := ADR (%MB2000);
3: SRCADDR := ADR (%MB3000);
4: SRCADDR := ADR (%MB4000);
5: SRCADDR := ADR (%MB5000);
6: SRCADDR := ADR (%MB6000);
7: SRCADDR := ADR (%MB7000);
8: SRCADDR := ADR (%MB8000);
Umlauf := 0;
nStepWrite := 10;​
END_CASE;
bAdsWriteError := FALSE;
END_IF

END_IF
(*Daten NovRAM des CX1000 schreiben*)
fbAdsWriteNovRam(
NETID := '', (*Lokaler CX *)
PORT := 300,
IDXGRP := 16#8005,
IDXOFFS := IDXOFFS,
LEN := 1000,
SRCADDR := SRCADDR,
WRITE := TRUE,
TMOUT := T#5s);
10:
nStepWrite := 0; (* und von vorn *)
Umlauf := 0;

1000:
bAdsWriteError := TRUE;
nLastAdsWriteErrID := fbAdsWriteNovRam.ERRID;
nErrCounterWrite := nErrCounterWrite +1;
nStepWrite := 10;

END_CASE​
END_IF


Zurücklesen nach dem booten dann natürlich auch in Blöcken.


Gruß
Thomas
 
Zurück
Oben