Mehrere Zählerwerte in DB speichern

bastler

Level-2
Beiträge
258
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPSler
Ich bekomme von einem Zähler einen Wert, der als DInt in einen DB(DB2.DBD0) gespeichert wird. Über einen Eingang(E0.0)
wird der Zähler wieder auf 0 gesetzt. Wenn E0.0 true wird, soll der Zählwert aber noch in einen DB3 gespeichert werden. Bis hierher kein Problem. Der Zählwert soll aber bei jedem Rücksetzen des Zählers im DB3 gespeichert werden ohne den vorhergehenden Wert zu überschreiben, also fortlaufend
Wert1=db3.dbd0
Wert2=db3.dbd4
usw.
Wie kann ich dieses "fortlaufende Speichern" realisieren?
Danke schonmal für Eure Hilfe.

MfG
bastlerp
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab grad Zeit. ;)
Hier mal eine Lösung in AWL:
Code:
   U E 0.0
   FP M0.0
   SPBN WERT
   L DB2.DBW 4   // Dieses Datenwort merkt sich den Eintrag im DB
   SLD 3
   LAR1
 
   L DB2.DBD0 // Zahlerwert
   AUF DB3
   T DBD [AR1, P#0.0]  // Auf den nächsten freien Platz in dem DB
 
   L DB2.DBW 4
   L 4
   +I
   T DB2.DBW 4   // Nächsten freien Platz
 
WERT:NOP 0
Der Datenbaustein sollte natürlich groß genug sein.
Wenn der Datenbaustein voll ist das DB2.DB4 wieder mit 0 vorbelegen. Dann werden die alten Werte überschrieben.
 
Hallo Paule
Danke für deine Mühe, ich werds heute noch testen.
Könntest du den Code mal noch etwas erklären, z.B. wieso wird mit
SLD3 drei Stellen nach links verschoben usw.

MfG
bastler
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe jetzt mal testen können und es läuft genau so, wie ich es wollte. Super, vielen Dank.
Eine Frage hätte ich noch. Da ja irgendwann der DB3 "überlaufen" würde und damit die CPU in Stop schicken würde, hätte ich noch gern, das nach dem letzten möglichen Eintrag, alle Werte gelöscht werden und wieder von vorn beschrieben werden. Könnt ihr mir da nochmal helfen?

MfG
bastler
 
Hallo bastler,
ich gehe jetzt mal davon aus der DB3 hat 5000 Doppelworte = 20000 Byte

Code:
   L DB2.DBW 4 // Zeiger für nächsten Eintrag
   L 20000 // Byteadresse für letzten Eintrag 
   <=I
   SPB Geht
 
   L L#0
   T #Temp_Variable_DWORD
   call SFC21 // FILL Baustein
   Weiß gerade nicht wie der Parameter heißt : #Temp_Variable_DWORD
   Ret_Val: #TEMP_INT
   Weiß gerade nicht wie der Parameter heißt : P#DB3.DBX0.0 Byte 20000
   (Wenn der DB3 eine Symbolbezeichnung hat wird es schöner dargestellt)
 
   L 0
   T DB2.DBW 4 // Zeiger für nächsten Eintrag
 
Geht:NOP 0
 
ja und was sagt uns das jetzt??
Ja, Gerhard das sehe ich auch so.
@Bimbo wenn Du schon Gerhard verbessern oder ergänzen willst, dann komplett.

Das Adressregister schaut folgendermasen aus:
Code:
[B]AR1 / AR2 : i[/B]0000[B]rrr[/B]00000[B]BBB BBBB BBBB BBBB Bxxx[/B]
 
[B]i: [/B]0=Bereichsintern ;1=Bereichsübergreifend
[B]r: [/B]Bereichskennung: 011 = Merker ; 100 = Daten im DB-Register ; 110 = eigene Lokaldaten
[B]B:[/B] Byte-Adresse
[B]x: [/B]Bit-Adresse

Wenn ich nun den Inhalt von dem DB2.DBW4 lesen will, steht ja nur die Integerzahl drin: z.B.: 8
Da das Adressregister aber die Bit-Adresse mit berücksichtigt, fehlen diese drei Bits (x).
Darum wird das Wort, das ein Doppelwort werden muss, als Doppelwort um genau diese drei Stellen nach Links geschoben. Dadurch werden quasi die Bitstellen mit Nullen aufgefüllt.
Ergebnis: Byte 8 , Bit 0
 
Zurück
Oben