Problem ARRAY/Schieberegister

Barni

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe folgendes Problem. Ich habe in einem Programm ein großes ARRAY erstellt in das REAL Werte abgelegt werden soll. Dieses Array ist 7500 Felder lang. Ich möchte jetzt das dieses ARRAY als FIFO ausgeführt werden soll. Das funktioniert aber mit dem Befehl:

STACK[1..7499] := STACK[0..7498];

nicht so ganz. Ich will aber auch kein LOOP einfügen, da sonst meine Zykluszeit ins unendliche geht.

Kann mir jemand eine geeignete Lösung vorschlagen?
Vielen Dank!

Gruß Barni
 
Hallo Barni,

wie wäre es Dein FIFO als Ringpuffer auszulegen, statt ein Schieberegister zu benutzen?

Grüße
Gebs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Barni,

wie wäre es Dein FIFO als Ringpuffer auszulegen, statt ein Schieberegister zu benutzen?

Grüße
Gebs
*ACK*

Und zwei Zeiger, ein Zeiger auf den aktuellen Input und einer auf den aktuellen Output. Dort fügt man dann Daten ein oder entnimmt sie und verändert nur den Wert des Zeigers.
 
Wie ich das mache ist prinzipiell egal, nur an der Ausführung scheitert die Sache bei mir :)

Ich muss die ganze Sache in SCL realisieren und da ich da zeimlicher Neuling bin, weiß nicht genau wie ich das umsetzen soll. Am liebsten wäre mir ein einfacher Push-Befehl damit die Zykluszeit weitestgehend geschont wird
 
Ich schreib jetzt aber nicht den Code auf, sondern nur mal die Verfahrensweise, ganz grob:

1. Du hast ein Array 0..100
2. Du hast einen In-Zeiger, der steht am Anfang auf -1 (leer)
3. Du hast einen Out-Zeiger, der steht am Anfang auf -1 (leer)
4. ein Wert kommt
Eintrag in 0, In-Zeiger auf 1, Out-Zeiger auf 1
5. noch ein Wert kommt
Eintrag in 1, In-Zeiger auf 2, Out-Zeiger bleibt 1
6. noch ein Wert kommt
Eintrag in 2, In-Zeiger auf 3, Out-Zeiger bleibt 1
.
.
.
7. ein Wert wird abgeholt
Auslesen aus 1 (Out-Zeiger), Out-Zeiger auf 2, wenn In-Zeiger <> -1 also nicht leer, In-Zeiger bleibt auf 3
8. ein Wert wird abgeholt
Auslesen aus 2 (Out-Zeiger), Out-Zeiger auf 3, wenn In-Zeiger <> -1 also nicht leer, In-Zeiger bleibt auf 3
9. ein Wert wird abgeholt
Auslesen aus 3 (Out-Zeiger), Out-Zeiger auf 4, wenn In-Zeiger <> -1 also nicht leer, In-Zeiger bleibt auf 3, Da In-Zeiger nun < Out-Zeiger, beide einfach wieder auf -1

Einige Sonderfälle sind zu beachten:
Wenn der In-Zeiger die 100 überschreitet macht er bei 0 weiter, ebenso der Out-Zeiger. Der In-Zeiger darf den Out-Zeiger nicht "überholen". Wenn doch, gehen Werte verloren und der Out-Zeiger muß "mitgezogen" werden. Umgekehrt ist das ähnlich, sonst werden Werte ausgelesen, die nicht mehr gültig sind. Man kann z.Bsp. einen vereinbarten Wert, den es sonst nicht gibt auf "leere" Zellen schreiben, z.Bsp. -1, wenn diese ausgelesen wurden. Dann erkennt man einfach am Inhalt der Zelle, daß diese leer ist.

Es gibt sicher irgendwo schon fertigen Code für so was, vielleicht in der Oscar-Lib?

PS: Wenn es nur um das Einlesen geht, reicht sogar ein Zeiger, der immer erhöht wird. Wenn du am Ende des Array bist, einfach den Zeiger wieder auf Null. Dann ist mein Beispiel schon fast zu viel des Guten. :)

In SCL kannst du auf ein Array mit einem Index (Int) zugreifen.

Test := MyArray
 
Zuletzt bearbeitet:
unterstützte DB-Größe ausreichend?

Hallo Barni,

was hast Du für eine CPU? Nicht alle S7-CPUs unterstützen DB mit 30kB.
Ob die Ziel-CPU das kann würde ich vor dem ausprogrammieren abklären.

Mit DB max 16kB wird das ganz Programm etwas verzwickter.

Gruß
PN/DP
 
Zurück
Oben