PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wiederholende Datenerfassungen in einem DB bei s7



DEGO
28.07.2003, 09:22
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?

Markus
28.07.2003, 12:52
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?



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

loop2003
28.07.2003, 12:55
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

Anonymous
28.07.2003, 16:36
: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.

Markus
28.07.2003, 16:46
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...

Martin Glarner
28.07.2003, 17:03
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.

Anonymous
28.07.2003, 17:28
:o
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.

Anonymous
28.07.2003, 17:30
Tschuldigung habe mich nicht zu Erkennen gegeben.

Stefan Beck
28.07.2003, 17:47
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)

Stefan Beck
28.07.2003, 18:00
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

Martin Glarner
28.07.2003, 20:41
Hallo zusammen,
Wenn ihr den Zeiger eines Adressregisters erhöhen wollt, geht das noch einfacher.


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.

DEGO
29.07.2003, 07:57
@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: