Messwert alle paar Minuten speichern und dann wieder überschreiben

alex_1704

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
CPU: 312c
Step 7 v5.4

Guten Tag,

ich weiß nicht mehr weiter, denn ich habe folgendes Problem:

Ich bekomme einen Messwert im REAL-Format und möchte den aktuellen Wert zum Beispiel alle 10Minuten in einem Datenbaustein speichern.

Damit der Baustein nicht zu groß wird, müsste die Steuerung nach z.B. 100 Werten in einer Art Endlosschleife wieder den ersten Messwert überschreiben und genauso weitermachen wie vorher.

Wie kann ich sowas am besten ohne viel Schreibarbeit realisieren, denn bei zig Werten immer die Datenbausteinadresse einzugeben ist sehr mühsam.
Gut wäre eine kleines Programmierbeispiel mit 2 oder drei Werten und einer einstellbaren Zeit.

Danke für entsprechende Antworten im Voraus:D
 
Wert speichern

Hi,
so etwa:
Code:
// Istwert abspeichern
      UN Zeitflanke                      // dein Zeitflag..
      SPB ende

      AUF   #Daten_DB
      L     Indexmerker                   // Index integer 0,1,2,3....
      L     4
      *D    
      SLD   3
      T     #Ind_pointer                // Pointer-Adresse berechnet:0,4,8,...
      L     #Ist_Wert
      T     DBD [#Ind_pointer]

// Index erhöhen, bzw. reseten
      L     Indexmerker
      L     1
      +D    
      T     Indexmerker
 
      L     Indexmerker
      L     100
      >=D   
      SPBN  klei
      L     0
      T     Indexmerker
klei: SET   

ende:SET
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die schnelle Antwort, habe das Programm gleich mit dem Simulator ausprobiert und funktioniert soweit, allerdings hatte ich das Problem mit dem #indexmarker, dass er sich nicht von allein erhöht hat und deshalb nur einen Messwert mit dem jeweiligen Index in die Adresse des DB's geschrieben hat.
Deshalb habe ich einen Zähler mit meinem Timer verknüpft, der dann den Index hochzählt.
Allerdings habe ich noch das Problem, dass es regelmäßige Aussetzter gibt, wo keine Werte in den Datenbaustein gespeichert werden, nämlich zwischen den Adressen DBXX.DBD40-DBXX.DBD60 oder DBXX.DBD104-DBXX.DBD124.

Außerdem weiß vielleicht ein Spezialist, wie man die Online-Werte irgendwie auslesen kann, damit ich sie in Windows lesen kann z.B. im Editor oder MS-Excel. Geht das vielleicht einfach auf die MMC-Karte?
 
Was willst du genau machen, bei jedem Speicherimpuls mehrere Werte Speichern?

Der Indexmerker ist ein Merkerwort, Datenbausteinwort, oder Statische Integer!

Wenn du mehrere Werte speichern willst:

Code:
  L     #Ind_pointer
  L     P#4.0
  +D    
  T     #Ind_pointer    setzt den Indexpointer um 1 DBD weiter.
Dann mußt du aber auch den Indexmerker mit erhöhen, damit beim nächsten Triggerimpuls die richtige Speicheradresse berechnet wird.

Online-Werte auslesen:
1. Direkt mit einer Software, z.Bsp. von Deltalogic
2. Direkt mit Excel und Libnodave (dazu läuft grad ein Thread hier)
3. Indirekt, Online gehen, den Datenbaustein kopieren in die Offline-Datei,
daraus eine Quelle erzeugen, diese dann kopieren, oder exportieren und
in Excel einfügen/Öffnen, vorher bei Bedarf mit einem Editor alles
entfernen, was man nicht benötigt.
 
Zuletzt bearbeitet:
Antwort

Nein, ich will nur einen Wert speichern,
trotzdem habe ich immer noch das Problem, dass der Datenbaustein manche Werte auslässt.
Im Anhang habe ich nochmal meinen OB1 und den DB, den FC habe ich nicht geändert.

Trotzdem Danke
 

Anhänge

  • DB96.JPG
    DB96.JPG
    245,8 KB · Aufrufe: 71
  • OB1.JPG
    OB1.JPG
    136,2 KB · Aufrufe: 69
Zuviel Werbung?
-> Hier kostenlos registrieren
Damit dein Indexmerker im FC hochgezählt wird, muß als IN/OUT deklariert sein, ich vermute mal du hast ihn als IN am FC stehen. Zeig mal noch deinen FC her, der Speicher wohl andauerndd, bis sich MW50 ändert?
 
Antwort

Den Indexmerker war al IN deklariert wie du vermutet hast.
Habe jetzt geändert, allerdings besteht immer noch das selbe Problem.

PS: Ich hab jetzt die Schnauze voll und muss jetzt Feierabend machen. Bin morgen wieder online.
Mfg alex

Den FC habe ich jetzt auch noch rangehängt
 

Anhänge

  • FC96.JPG
    FC96.JPG
    133,2 KB · Aufrufe: 59
Ok, alles klar.
Das Netzwerk mit den Zähler kannst du erstmal komplett rauswerfen. Die Lücken kommen im Übrigen daher:

CV DUAL WORD E, A, M, D, L Aktueller Zählwert, hexadezimal codiert
CV_BCD DEZ WORD E, A, M, D, L Aktueller Zählwert, im BCD-Format codiert
Du hast den BCD-codierten Ausgang des Zählers genutzt.
Da aber nun dein MW50 richtig am IN/OUT steht, funktioniert es ohne den Zähler.

Außerdem solltest du eine Flanke als Trigger nutzen, siehe Bild. Den FC96 um eine IN Bool Trigger erweitern und im FC96 statt
Code:
UN T1 

UN #Trigger
einsetzen, dann funktioniert das Ganze.
 

Anhänge

  • Trigger.jpg
    Trigger.jpg
    41,7 KB · Aufrufe: 48
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ach so noch als Zusatz. Dein MW50 wird nicht auf ungültige Werte überwacht, also mindesten im OB100 Null ins MW50 laden! Sonst kann es passieren, daß der Index aus dem DB "rausläuft" und dein AG geht in Stop
 
Kleine Ergänzung

Hi,

-der Indexmerker wird überwacht im FC(>=100).
-dass die CPU nicht in STOP geht, gibt es die OB121, OB122.

Ausserdem gibt es das CPU Taktmerkerbyte, von dessen Bits macht man
sich eine passende Flanke, wozu die ganzen Timer...

an Alex:
- nicht vergessen, mit Flanken zu arbeiten ist das A und O
für eine gute Implementierung. Und andere Sachen, wie z.B.:

Code:
U    E0.0     // Start/Stop Taste
FP   M10.0  // Zustand speichern
X    A0.0
=    A0.0    // Ausgang

Gruss: Vladi
 
@vladi

-der Indexmerker wird überwacht im FC(>=100).
-dass die CPU nicht in STOP geht, gibt es die OB121, OB122.

zu 1. Der Indexmerker wird beim ersten Mal erst überwacht wenn es schon geknallt hat!

zu 2. Das wir einen Airbag im Auto haben, heißt noch lange nicht, daß wir auch die Bremse ausbauen, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dank

Vielen Dank für die Unterstützung, klappt alles soweit, somit habe ich nach drei Tagen erfolglosen Ausprobierens doch noch ein lauffähigees Programm.

Ich hab noch eine kleine Frage, ich hab noch andere Messwerte im INT-Format, die ich genauso speichern will.
War natürlich so schlau hab einen zweiten DB erstellt und den FC kopiert sowie den neuen FC im OB1 aufgerufen.

Klappt natürlich nicht, die CPU geht in STOP und sagt Bereichslängenfehler beim Schreiben. Was muss ich noch im FC ändern, damit ich INT-Werte statt REAL-Werte speichern kann?

Hab so den Verdacht, dass das mit dem
Befehl
L4
*D
SLD 3
usw...

zu tun hat.

Trotzdem Danke, Danke, Danke:)
 
Bereichslängenfehler beim Schreiben heißt in diesem Fall, daß der DB zu kurz ist. Den IN an deinem neuen FC hast du sicher auf INT geändert.
Die Pointerberechnung für Int wäre:

Code:
L 2
*D
SLD 3
Ein INT belegt 2 Byte, ein DINT 4 Byte ein Real 4 Byte, daher der Multiplikator vor dem *D. Ich schätze mal, dein neuer DB ist nur halb so lang wie der mit den Realwerten.
 
Funktioniert, aber jetzt habe ich wieder das Problem, dass in beiden DB's für die REAL und INT Speicherwerte jeweils eine Adresse dazwischen ausgelassen wird. Ich werde bald wahnsinnig.

Habe gleich das Programm als zip.Datei mit eingefügt.
 

Anhänge

  • SpeichernWerte.zip
    191,2 KB · Aufrufe: 32
Zuviel Werbung?
-> Hier kostenlos registrieren
Fehler gefunden

Fehler habe ich selbst gefunden, der Indexmerker war bei beiden FC's gleich.


Eine allerletzte Frage für Profi's:
Wie kann man am einfachsten mit einem Taster realisieren, dass die alten Werte gelöscht werden(also auf Anfangswert) und die neue Messung wieder oben beginnt?

Gruß alex
 
Zurück
Oben