Step 7 Wiedermal FIFO

Dennsen

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Ich habe mich jetzt schon eine komplette Woche darüber belesen und steige nicht so recht durch.
Habe mir schon einige Möglichkeiten reingebaut und/oder selber dran versucht, es will einfach nicht klappen.

Ich arbeite an einer 319F.

Grundgedanke:
- 5 INT Werte (im UDT zu einem STRUCT zusammengefasst -10 Byte) als eine, sagen wir mal "Messung" abspeichern
- die Messungen sollen dann in einem FIFO gespeichert werden, der insgesamt 1000 Messergebnisse enthält .

Ich habe damit angefangen die einzelnen Messungen in Form von je 10 Byte auf einen Zwischenspeicher für 10 Messungen zu
laden, dann nach 10x10 Messungen diese dann in einen 100er Speicher ge-"Blockmoved".
Anschliessend, wenn 100 Messungen voll sind, diese dann per Blockmove (im 1000er Byte-Verbund) um 1000 Byte versetzt nach hinten abzuspeichern.
Hier machte mir die SPS einen Strich durch die Rechnung... Zu viele Move-Befehle... aber auch nach Abspecken des Programms gings nicht.

->Wieviele Bytes kann man eigentlich per "BLK_MOV"(SFC20) maximal verschieben?


->Ist es bei den bekannten FIFOs so, dass der neue Wert immer versetzt um einen Zählwert weiter hinten gespeichert wird?

->Gibt es eine Möglichkeit, dass der neue Wert z. Bsp. im DB auf dbx0.0 bis dbx4.7 gespeichert wird und bei positiver Flanke eines folgenden neuen Eintrages auf dbx5.0 bis dbx9.7 verschoben wird? Die Werte von dbx5.0 bis dbx9.7 dann auf dbx10.7 bis 14.7 usw. ?

-> Wenn alles nichts hilft, dann würde ich zum normalen FIFO greifen, jedoch steige ich da nicht ganz durch. Ich habe hier schon sehr schöne Bausteine gesehen, komme aber teilweise mit der Anparametrierung nicht klar. Könnte mir da evtl. jmd. zur Seite stehen?

Ich hoffe, das war jetzt nicht zu viel Input :)

Beste Grüsse Dennsen
 
wiedereinmal FIFO

ich bitte um Entschuldigung.

Habe mich mit den Bytes etwas verhaspelt... Es sollte natürlich heissen dbx0.0 bis dbx9.7 u.s.w. , sind ja immer 5Words ;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
.
1.
Falls du da noch nicht geschaut hast, in
unserer FAQ-Rubrik stehen schöne Beispiele.

2.
Die Forumssuche hilft dir sicherlich auch weiter.

3.
Zeige uns doch mal, was du bisher gemacht
hast.
 
.

Die Hilfe zum BLOCKMOVE findest in der
S7-Hilfe über die F1-Taste.

Für einen Eintrag im FIFO-Speicher kannst
du natürlich oben den benötigen Platz
freischieben, du kannst einen neuen Eintrag
aber auch unten anfügen.
Um das FIFO-Prinzip zu erfüllen, musst du
die Einträge jedoch jeweils in der richtigen
Reihenfolge entnehmen.

Dir ist aber auch klar, das du bei´einem
Eintrag von DBX 0.0 bis DBX 4.7 lediglich
5 Byte benutzt, während deine Messung
10 Byte Länge hat ?

P.S.: Wegen der 5 bzw. 10 Byte: kommt es zu
Bereichsüberschneidungen beim SFC 20 ?
 
Zuletzt bearbeitet:
ich bitte um Entschuldigung.

Habe mich mit den Bytes etwas verhaspelt... Es sollte natürlich heissen dbx0.0 bis dbx9.7 u.s.w. , sind ja immer DWs ;)

Kein Problem.:lol:


Ich sehe da gerade noch etwas:
Wie macht dir die SPS einen Strich durch
die Rechnung? Welcher Fehler ? Schon mal
im Diagnosepuffer nachgeschaut?
Kann es sein, das du mit 1000 Messungen a´
10 Byte = 10kByte deine angelegten
DB-Grenzen sprengst ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt zwei Möglichkeiten für den Ablauf des FIFOs:

1. Fester Speicherplatz für den neuen Eintrag.
Nachteil: Das erfordert vor dem Eintragen, alle bisherigen Einträge, um einen Speicherplatz zu verschieben. (zeitaufwendig)
Vorteil: Beginn und Ende der Werteliste verschieben sich nicht. Beim Anzeigen auf dem HMI ist z.B. Speicherplatz 10 immer der 10. letzt gespeicherte Wert.

2. Zeiger auf den nächsten Speicherplatz für einen neuen Wert = Fester Speicherplatz für jeden einzelnen Eintrag.
Vorteil: Kein Verschieben der Werte nötig.
Nachteil: Beginn und Ende der Werteliste verschieben sich ständig. Dadurch ist im festgelegten Speicherbereich das Ende des FIFOs meistens vor dessen Anfang. Er ist also geteilt.


Für welche Variante Du Dich entscheidest, ist somit auch davon abhängig, was Du mit den Werten hinterher machen willst.
 
SoftMachine:
-der Diagpuffer meinte dass eszu viele Move befehle seien.
-von zu geringer Grösse des DB gehe ich mal nicht aus, da der DB mit der Struktur des zugehörigen UDTs aufgebaut ist
-wie komme ich zur FAQ? Ich stell mich heute echt blöd an.. :confused:

Hucki:
-der FIFO sollte eigentlich so sein, dass der neueste Werteblock auf 0.0 geschrieben wird, vorher alle anderen Werteblöcke
um die Grösse eines Werteblock nach hinten (also der Werteblock vor dem neuen auf 10.0 geschoben wird) , mit normalem Blockmove schreibt man sich ja dusselig.
Grund dafür wäre das Anzeigen der z. Bsp. letzten zehn Werteblöcke auf einer HMI. Das lässt sich auch (für nur 10 Werteblöcke mit blockmove realisieren)
 
Hucki:
-der FIFO sollte eigentlich so sein, dass der neueste Werteblock auf 0.0 geschrieben wird, vorher alle anderen Werteblöcke
um die Grösse eines Werteblock nach hinten (also der Werteblock vor dem neuen auf 10.0 geschoben wird) , mit normalem Blockmove schreibt man sich ja dusselig.
Grund dafür wäre das Anzeigen der z. Bsp. letzten zehn Werteblöcke auf einer HMI. Das lässt sich auch (für nur 10 Werteblöcke mit blockmove realisieren)
Wofür brauchst Du die restlichen 990?

Nach dem jetzigen Infostand würde ich das zweigeteilt machen:
1. Die 1000 Werteblöcke würde ich über den beweglichen Zeiger auf feste Plätze eintragen und mir so die sehr aufwendige Verschieberei ersparen.
2. Für die Anzeige würde ich dann die jeweils letzten 10 Einträge in ein separates Register für's HMI kopieren. Das wäre nur ein vergleichsweise kleiner BLOCKMOVE und als Start hat man ja den Zeiger vom FIFO.
 
es sollen ja 1000 Werteblöcke gespeichert werden.

Blockinhalt:
1. DW enthält eine ausgelesene Nummer der Teils
2. DW enthält Messwert des Teiles von Sensor 1
3. DW enthält Messwert des Teiles von Sensor 2
4. DW enthält Messwert des Teiles von Sensor 3
5. DW enthält Messwert des Teiles von Sensor 4

Von dem nach hinten schieben bin ich nun abgekommen.
Das separate Register für die HMI lässt sich ja mit in den gleichen DB schreiben/lesen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
.

SoftMachine:
-der Diagpuffer meinte dass eszu viele Move befehle seien.
-von zu geringer Grösse des DB gehe ich mal nicht aus, da der DB mit der Struktur des zugehörigen UDTs aufgebaut ist
-wie komme ich zur FAQ? Ich stell mich heute echt blöd an.. :confused:
...

siehe
HIER
 
.
@ Dennsen

Nochmal zu den Bereichen beim BLOCKMOVE,
weil du offenbar ja im gleichen DB kopierst:

Hast du daran gedacht, dass sich das Zielfeld
und das Quellfeld NICHT überlappen dürfen ?

Als Abhilfe nimm einfach einen temporären DB
und kopiere erstmal deine vorhandenen Einträge
dorthin.
Anschliessend von dort wieder in deinen DB
zurückkopieren, aber um einen Eintrag versetzt.
 
Zurück
Oben