Wiederholende Datenerfassungen in einem DB bei s7

DEGO

Level-1
Beiträge
108
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe folgendes problem bei einem s7 prog:
ich möchte 10 daten(bei mir zeiten) in einem db so hinterlegen, das sie nacheinander geschrieben werden und nach der 10ten wieder von vorne.
habe mir auch eine möglichkeit mit zähler, dann mit vergleicher ins dementsprechende dw zuschreiben "gebaut". es muß doch aber auch eine elegantere lösung dafür geben(sfc,fc oder fb oder indierekte Adre.).
wer kann mir dabei wohl tipps geben?
 
ohne garantie, nicht getestet.
eventuell um das ganze noch ne schleife legen wenn alle zeiten in einem zyklus gespeichert werden sollen.
bzw. von wo sollen die zeiten ausgelesen werden?

Code:
      L     MD     0                    //Pointer DB-Wort
      L     20
      >=I                                //Wenn DW20 erreicht wurde
      SPBN  M001
      L     0
      T     MD     0                    //Setze Pointer wieder auf 0

M001: NOP   0

      L     MD     4                    //Zeitwert steht in MD4
      T     DBW [MD 0]                  //Schreibe Zeit in DBW0 - DBW20

      L     MD     0
      +     2                            //pointer um ein Wort erhöhen
      T     MD     0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey DEGO,

ich versuche jetzt mal dein Problem zu analysieren:

also du möchtest alle x Sekunden ein Wert in ein Register eintragen, welches eine bestimmte Länge hat! Richtig?

Warte auf Antwort
Grüsslies
 
:p Hi, in der S7 gibt es eine viel elegantere Lösung.

Versuch mal den Befehl "Loop"

Die Funktion ist im Hilfetext F1 gut beschrieben.
 
loop zählt aber runter, und wir wollen immer zwei hochzählen...
man könnte loop wie beschrieben einsetzen um alle zeiten in einem zyklus zu verarbeiten.

also um das ganze programm herum noch ne loop schleife...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Ich setzte für solche Aufgabe sehr oft das Zusatzproramm "SCL" ein.
Mit diesem Programmen lassen sich For..Next-Schleifen und Arrays mit variablen Index programmieren.
Wenn die Zykluszeit aber möglichst kurz sein soll, sollte aber in AWL programmiert werden.
 
:eek:
Schreibe im FC-Kopf die temporären Variablen
0.0 Zaehler WORD Schleifenzähler
0.2 Zeiger DWORD Zeiger zum Speichern

Netzwerk 1

AUF DB 10 // Aufschlagen des Datenbausteines
// um die Zeiten zu speichern
L P#0.0
T #Zeiger
L 10 // Schleife mit dem Zählwert 10 laden
Next: T #Zaehler
L #Zeiger
LAR1
L MD 4
T DBD [AR1,P#0.0]
L #Zeiger
L P#4.0
+D
T #Zeiger

L #Zaehler
LOOP Next

Ich hoffe, ich konnte helfen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo DEGO,

einen umlaufenden Zeiger kannst du ganz einfach mit der MOD-Anweisung berechnen:

//*** Umlaufregister mit MOD
L #REGISTER_ZEIGER
L #ANZAHL
MOD
T #REGISTER_ZEIGER // 0..ANZAHL


Ein Beispiel findest du auch unter

http://www.sps-net.de/infos/info_main.htm
"Verwaltung eines FiFo's für Integerwerte"


mfG, Stefan



Zwei Dinge sind unendlich:
Das All
und
die Dummheit der Menschen.

(bei Ersterem bin ich mir nicht so sicher)
 
Hallo DEGO,

noch ein Hinweis. Wenn du in meinem o.g. Beispiel (unter www.sps-net.de) den Ausgang "VOLL" mit dem Eingang "AUSTRAGEN" verschaltest, sollte der Baustein als reines Umlaufregister funktionieren!

mfG, Stefan
 
Hallo zusammen,
Wenn ihr den Zeiger eines Adressregisters erhöhen wollt, geht das noch einfacher.

Code:
L #Zeiger 
L P#4.0 
+D 
T #Zeiger 

//einfacher
+AR1 P#4.0

Mit diesem Befehl wird direkt der Inhalt des Adressregisters um 4 Byte erhöht, ohne das der Inhalt des Akku1 verändert :idea: wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@loop2003: nein, ich möchte einen ereignisspeicher mit zeiten mir aufbauen, wo ich mir z.b. die letzten zehn zeiten anzeigen lassen kann nachdem ein bestimmtes ereignis ausgelöst wurde. nachdem er bei zehn angekommen ist soll er wieder von vorne beginnen.
@all: erstmal danke. werde mich jetztmal mit euren lösungen beschäftigen. :lol:
 
Zurück
Oben