PDA

View Full Version : Pointer und Schieber



Anonymous
12.09.2003, 10:11
Halli Hallo,
ich habe kleine Probleme im Moment.
Ich habe Daten auf DB gespeichert und möchte, dass nach einer bestimmte Zeit, wenn ich neue Daten bekomme, werden die Alte Daten nicht überschreiben sonder geschoben. Ich möchte keine daten verloren.
Mein Problem ist: ich kenne mich nicht so gut mit Pointer und Schieber und ich weiss nicht so genau wie ich das realizieren kann :oops: .
kennten jemand mir helfen???
Danke![/img]

volker
12.09.2003, 12:00
hier mal ein baustein mit dem man sowas machen könnte.
wenn oben ein neuer wert eingetragen wird wird unten der letzte rausgeschoben.

diesen baustein habe ich mal für s5 geschrieben, funktioniert aber auch in einer s7.

das erste nutzdatenwort ist dw 3. die oberen werden intern benötigt.



Netzwerk 1 Ein Wort in Fifo speichern FUP Ausgabe
Name :FIFO-EIN
Bez :EINT E/A/D/B/T/Z: E BI/BY/W/D: BI
Bez :FIDB E/A/D/B/T/Z: B
Bez :DADB E/A/D/B/T/Z: B
Bez :FLAN E/A/D/B/T/Z: A BI/BY/W/D: BI
Bez :IMPU E/A/D/B/T/Z: A BI/BY/W/D: BI
Bez :DATE E/A/D/B/T/Z: E BI/BY/W/D: W
Bez :NUWO E/A/D/B/T/Z: D KM/KH/KY/KC/KF/KT/KZ/KG: KF

:L KC C
:L KY 10,2 EINT=Daten eintragen anstossen
:L KH 2000 FIDB=FIFO-DB
:L KC BY DADB=Daten-DB
:L KC VL FLAN=Flankenmer.zum Daten eintr.
: IMPU=Impulsmer.zum Daten eintr.
: DATE=Daten zum ablegen
: NUWO=Anzahl der Nutzworte
:***


Netzwerk 2 FUP Ausgabe
:AWL
:UN =EINT Daten eintragen anstossen
:RB =FLAN Flankenmerker ruecksetzen
:U =EINT
:UN =FLAN
:S =FLAN
:= =IMPU Impulsmerker
:
:UN =IMPU
:SPB =M001
:
:B =DADB Daten - DB
:L =DATE Daten zum abspeichern
:T MW 202
:
:B =FIDB fifo-db
:LW =NUWO Anzahl nutzworte
:L KF +2 endadresse -1 erzeugen
:+F
:T MW 200 index
:
M002 :L MW 200 lade index dw x
:T DW 0
:B DW 0
:L DW 0 lade dw x
:T DW 1 zwischenspeichern in dw1
:L MW 200
:L KF +1
:+F erzeuge index +1
:T DW 0 neuer index
:L DW 1 zwischengespeichertes dw x
:B DW 0
:T DW 0 im neuen index speichern
:
:L MW 200 index -1
:L KF +1
:-F
:T MW 200
:L MW 200
:L KF +2 erstes nutzwort erreicht
&#58;><F
&#58;SPB =M002 sprung bei nein
&#58;L MW 202 ablagedaten
&#58;T DW 3 im dw 3 speichern
M001 &#58;BE


mfg

sps-concept
14.09.2003, 08:44
Hallo Zeus,

wieviele Daten sollen denn da verschoben werden und wieviele Datensätze sollen maximal erhalten bleiben?

Mfg
André Räppel

Ulrich Klakow
15.09.2003, 08:54
Hallo Zeus,

dazu braucht man einen FIFO. Wenn deine Einträge Byte/Word oder DWord lang sind, hast du Glück gehabt, sowas gibt (oder gab?) es
schon mal in der S7-Bibliotek. Hast du aber größere Einträge, so
bleibt dir nichts anderes übrig diesen FIFO selber zu schreiben
oder zu fragen ob jemand so einen Baustein schon geschrieben hat.
Leider gibt es derzeit in dem Forum keine Möglichkeit freie Bausteine (unter z.B.) GPL ins Netz zu stellen :( schade.
Siemens bietet einen FIFO auch über seine kostenpflichtigen Dienst an.
Wir haben sollch einen Baustein letztes Jahr mal gekauft, hatten aber nur
Probleme damit.

Anonymous
15.09.2003, 10:56
hier mal ein baustein mit dem man sowas machen könnte.
wenn oben ein neuer wert eingetragen wird wird unten der letzte rausgeschoben.

diesen baustein habe ich mal für s5 geschrieben, funktioniert aber auch in einer s7.

das erste nutzdatenwort ist dw 3. die oberen werden intern benötigt.



Netzwerk 1 Ein Wort in Fifo speichern FUP Ausgabe
Name &#58;FIFO-EIN
Bez &#58;EINT E/A/D/B/T/Z&#58; E BI/BY/W/D&#58; BI
Bez &#58;FIDB E/A/D/B/T/Z&#58; B
Bez &#58;DADB E/A/D/B/T/Z&#58; B
Bez &#58;FLAN E/A/D/B/T/Z&#58; A BI/BY/W/D&#58; BI
Bez &#58;IMPU E/A/D/B/T/Z&#58; A BI/BY/W/D&#58; BI
Bez &#58;DATE E/A/D/B/T/Z&#58; E BI/BY/W/D&#58; W
Bez &#58;NUWO E/A/D/B/T/Z&#58; D KM/KH/KY/KC/KF/KT/KZ/KG&#58; KF

&#58;L KC C
&#58;L KY 10,2 EINT=Daten eintragen anstossen
&#58;L KH 2000 FIDB=FIFO-DB
&#58;L KC BY DADB=Daten-DB
&#58;L KC VL FLAN=Flankenmer.zum Daten eintr.
&#58; IMPU=Impulsmer.zum Daten eintr.
&#58; DATE=Daten zum ablegen
&#58; NUWO=Anzahl der Nutzworte
&#58;***


Netzwerk 2 FUP Ausgabe
&#58;AWL
&#58;UN =EINT Daten eintragen anstossen
&#58;RB =FLAN Flankenmerker ruecksetzen
&#58;U =EINT
&#58;UN =FLAN
&#58;S =FLAN
&#58;= =IMPU Impulsmerker
&#58;
&#58;UN =IMPU
&#58;SPB =M001
&#58;
&#58;B =DADB Daten - DB
&#58;L =DATE Daten zum abspeichern
&#58;T MW 202
&#58;
&#58;B =FIDB fifo-db
&#58;LW =NUWO Anzahl nutzworte
&#58;L KF +2 endadresse -1 erzeugen
&#58;+F
&#58;T MW 200 index
&#58;
M002 &#58;L MW 200 lade index dw x
&#58;T DW 0
&#58;B DW 0
&#58;L DW 0 lade dw x
&#58;T DW 1 zwischenspeichern in dw1
&#58;L MW 200
&#58;L KF +1
&#58;+F erzeuge index +1
&#58;T DW 0 neuer index
&#58;L DW 1 zwischengespeichertes dw x
&#58;B DW 0
&#58;T DW 0 im neuen index speichern
&#58;
&#58;L MW 200 index -1
&#58;L KF +1
&#58;-F
&#58;T MW 200
&#58;L MW 200
&#58;L KF +2 erstes nutzwort erreicht
&#58;><F
&#58;SPB =M002 sprung bei nein
&#58;L MW 202 ablagedaten
&#58;T DW 3 im dw 3 speichern
M001 &#58;BE


mfg

Dieses Programm funktioniert aber nicht in S7, da es dort keine "Bearbeite"-Befehl mehr gibt!

volker
15.09.2003, 11:34
Dieses Programm funktioniert aber nicht in S7, da es dort keine "Bearbeite"-Befehl mehr gibt!

ok ok
er wird denn so kleinlich sein. :wink: das kann man doch ohne probs mal eben in s7 konvertieren lassen.

dann sieht das so aus.


deklaration&#58;
in&#58;
EINT BOOL EINT
FIDB BLOCK_DB FIDB
DADB BLOCK_DB DADB
_DATE WORD DATE
NUWO INT NUWO
out&#58;
FLAN BOOL FLAN
IMPU BOOL IMPU
temp&#58;
conv_akku1 DWORD
conv_akku2 DWORD
conv_stw WORD


UN #EINT // Daten eintragen anstossen
R #FLAN // Flankenmerker ruecksetzen
U #EINT
UN #FLAN
S #FLAN
= #IMPU // Impulsmerker
//;
UN #IMPU
SPB M001
//;
AUF #DADB // Daten - DB
L #_DATE // Daten zum abspeichern
T MW 202
//;
AUF #FIDB // fifo-db
L #NUWO // Anzahl nutzworte
L 2 // endadresse -1 erzeugen
+I
T MW 200 // index
//;
M002&#58; L MW 200 // lade index dw x
T DBW 0

T #conv_akku1
L STW
T #conv_stw
L DBB 1
SLW 4
LAR1
L #conv_stw
T STW
L #conv_akku1
L DBW &#91;AR1,P#0.0&#93; // lade dw x
T DBW 2 // zwischenspeichern in dw1
L MW 200
L 1
+I // erzeuge index +1
T DBW 0 // neuer index
L DBW 2 // zwischengespeichertes dw x

T #conv_akku1
TAK
T #conv_akku2
L STW
T #conv_stw
L DBB 1
SLW 4
LAR1
L #conv_stw
T STW
L #conv_akku2
L #conv_akku1
T DBW &#91;AR1,P#0.0&#93; // im neuen index speichern
//;
L MW 200 // index -1
L 1
-I
T MW 200
L MW 200
L 2 // erstes nutzwort erreicht
<>I
SPB M002 // sprung bei nein
L MW 202 // ablagedaten
T DBW 6 // im dw 3 speichern
M001&#58; NOP 0


mfg

sps-concept
15.09.2003, 15:46
Für grössere Datenblöcke hab ich was ganz elegantes.
-> http://www.sps-concept.de/download/print/dat_reg.pdf
Damit kann man beispielsweise auf den x.Satz im Datenregister zugreifen. Die Satzgrösse richtet sich nach der einzutragenden/auszulesenenden Variable. Es wird überwacht ob der DB lang genug ist usw. Eingesetzt habe ich diesen Baustein u.a. folgendermassen:

1. * Seriennummern von Fertigungsteilen werden täglich hochgezählt. Zu diesen Seriennummern werden an mehreren Bearbeitungsstellen die Qualitätsdaten in das Datenregister eingetragen... Seriennummer = Satznummer. Am Ende der Produktionslinie werden diese passend zum Teil ausgelesen und dementsprechend sortiert. Über die HMI-Oberfläche können die daten ebenfalls ausgelesen werden.

2. * Anlagenkonfigurationen von 300 Byte (!) sind in einem DB eingetragen. Diese können angewählt werden und werden zum aktivieren in einen Merkerbereich geschrieben. Ebenso können diese bearbeitet und rückgeschrieben werden.

Beispielsweise könnten also diese Daten in den DB eingetragen werden. Satz 1...99. Bei 99 angekommen gehts wieder bei 1 los.

MfG
André Räppel

Anonymous
26.09.2003, 14:01
Halli Hallo,
ich habe kleine Probleme im Moment.
Ich habe Daten auf DB gespeichert und möchte, dass nach einer bestimmte Zeit, wenn ich neue Daten bekomme, werden die Alte Daten nicht überschreiben sonder geschoben. Ich möchte keine daten verloren.
Mein Problem ist: ich kenne mich nicht so gut mit Pointer und Schieber und ich weiss nicht so genau wie ich das realizieren kann :oops: .
könnten jemand mir helfen???
Danke![/img]