Step 7 wie kann man DB um eine Zeile verschieben?

PHOENIX35

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

zunächst einmal programmiere ich mit Step 7 erst seit kurzem und habe momentan ein Problem
bei dem ich mich überhaupt nicht zu Recht finde:confused:

Ich habe einen DB und füge der ersten Zeile immer einen neuen Wert hinzu und bevor das geschehen soll,
muss ich natürlich die DB Zeilen um einen nach unten verschieben.
Um das Problem zunächst zu lösen habe ich 50 MOVE Befehle benutzt was aber überhaupt nicht schön aussieht,
dass andere Problem ist das SFC20 BLOCKMOVE nicht funktioniert, da der Quellbereich und der Zielbereich gleich sind.

Ich habe mich nun über ANY Pointer informiert die man in AWL schreiben muss wovon ich nur sehr wenig Erfahrung habe,
aber schon eine Menge gelesen habe mir fehlt jetzt nur an Beispielen wie ich das schreiben könnte? Ist mein Problem
überhaupt mit einem ANY Pointer zu lösen? Oder wie könnte ich sonst an das Problem gehen?
 
Hallo Phoenix,

wieso fügst du in DB OBEN eine Zeile ein?? Wenn du sie unten einfügst, musst du nichts verschieben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Phoenix,

wieso fügst du in DB OBEN eine Zeile ein?? Wenn du sie unten einfügst, musst du nichts verschieben.

Ich denke es geht nicht um das Erstellen und Konfigurieren vom FB.

Es soll wohl eher ein FIFO sein: Neuer Wert? > alte Werte um eins verschieben > neuen Wert an erster Stelle eintragen.


Wie ist die Struktur des DB's? Hast du für deine 50/51 Werte ein Array benutzt?


Chris
 
Ahh... ja guten morgen... wer lesen kann uds so...

Ich würde das mit dem SFC20 machen.

Quelle: P#DB1.DBX0.0 WORD 50 Ziel: P#DB1.DBX2.0 WORD 50

Über den EN eingang des SFC kannst du Triggern wann das ausgeführt werden soll.

Dein DB1 müsste 51 Wörter (also 102Byte ) Groß sein. Wahlweise alls Array oder Einzelwörter.
 
Ja genau die Zeilen sollen zunächst um eins verschoben werden
und danach wird in die erste Zeile ein neuer Wert eingelesen (die Aufgabenstellung sieht es so vor) .

Der DB besteht aus 50 Variablen des Datentyps REAL.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
REAL ist DoppelWort
Dann muss du P#DB1.DBX0.0 DWORD 50 schreiben.

Brauchst du ein Register mit 50 Stellen? Wenn ja musste den DB 51 Stellen Groß machen, das erste sozusagen Einleseposition und ab Stelle 2 (Byte 4) dann dein eigentliches Schieberegister.
 
REAL ist DoppelWort
Dann muss du P#DB1.DBX0.0 DWORD 50 schreiben.

Brauchst du ein Register mit 50 Stellen? Wenn ja musste den DB 51 Stellen Groß machen, das erste sozusagen Einleseposition und ab Stelle 2 (Byte 4) dann dein eigentliches Schieberegister.

Ich hatte versucht den Zeiger über die Adressen zu erzeugen also mit dieser Variante P#DB1.DBX8.0 BYTE 208, aber weder die noch die Variante die du vorgeschlagen hast funktioniert:confused:

(8.0 weil ich noch eine andere Variable im DB habe die mit dem verschieben aber nichts zu tun hat)
 
dass andere Problem ist das SFC20 BLOCKMOVE nicht funktioniert, da der Quellbereich und der Zielbereich gleich sind.
Wenn Quellbereich und Zielbereich wirklich gleich sind - wozu dann mit SFC20 auf sich selber kopieren???
Du meinst vermutlich: die Bereiche überlappen einander. Dazu die Info: wenn der Zielbereich auf einer niedrigeren Adresse liegt als der Quellbereich, dann funktioniert SFC20 auch mit überlappenden Bereichen. Weil das so von Siemens aber nicht dokumentiert ist, könntest Du in zwei Schritten über einen zweiten (temporären) Puffer/Speicherbereich umkopieren: Quellbereich --> Puffer --> Zielbereich

Große FIFO oder Ringpuffer realisiert man oft nicht durch umkopieren, sondern mit 2 Index/Zeigern auf ersten und letzten Eintrag. Das ist zwar komplizierter zu verstehen, aber viel performanter als große Datenmengen umzuspeichern, wenn man eigentlich nur einen kleinen Datenbereich hinzufügen oder entfernen will.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie kommst du auf Byte 208? dieses Byte / Word/ Dword ist die LÄNGE!
Die StartAdresse ist das DBX.

Heißt P#DB1.DBX0.0 Dwoord 50 heißt auf deutsch: 50 Dword (Alternativ auch 100Word oder 200Byte) AB Adresse 0.0

In deinem Fall versuch mal P#DB1.DBX8.0 Byte 200 als Quelle und P#DB1.DBX12.0 Byte 200 als Ziel

Dein DB1 muss 212 Byte lang sein (Ganz unten muss stehen =212 oder mehr)
 
Ich würde das mit dem SFC20 machen.

Quelle: P#DB1.DBX0.0 WORD 50 Ziel: P#DB1.DBX2.0 WORD 50
Das kann nicht funktionieren, weil man so alle Bytes ab DBW2 mit dem Wert von DBW0 überschreibt bevor man sie wegkopiert hat. Umkopieren mit SFC20 funktioniert nicht mit überlappenden Bereichen, wenn der Zielbereich auf einer höheren Adresse als der Quellbereich liegt.

Harald
 
Das kann nicht funktionieren, weil man so alle Bytes ab DBW2 mit dem Wert von DBW0 überschreibt bevor man sie wegkopiert hat. Umkopieren mit SFC20 funktioniert nicht mit überlappenden Bereichen, wenn der Zielbereich auf einer höheren Adresse als der Quellbereich liegt.

Harald
Ah mist stimmt. Ich machs normalerweise von untem her. also bereich ab dbw auf dbw 0 kopieren. sorum gehts. mit grippe sollte man halt im bett bleiben :(


Gesendet von meinem SM-A520F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die zahlreichen Hilfestellungen:),
dass mit dem Puffer ist eine sehr gute Idee aber es stimmt das es sicherlich eleganter mit Zeigern ist.

Ich habe jetzt mein Programm in FUP und wollte ein FC mit AWL erstellen, indem ich dann einen ANY Pointer benutze um mein Problem zu lösen.

Wäre dies möglich? und wenn ja, wie sollte ich da am besten vorgehen?:confused:
 
Wäre es dann nicht naheliegend, die Richtung der Schieberei umzudrehen und den neuen Wert jeweils am anderen Ende "einzufügen"?
Oder werden beide SchiebeRichtungen benötigt?
Gruss, Heinileini

PS: Man könnte sich ja auch eine mitdenkende "SFC20-Variante" schaffen, die automatisch ermittelt, abhängig von Ziel- und Quell-Adresse, in welcher Reihenfolge sie kopiert.
Den kompletten ZielBereich kann man mit dieser Variante allerdings nicht mehr mit 1 Wert vorbesetzen (z.B. "löschen").
 
Zurück
Oben