Doppelwörter Schieben

Waelder

Level-2
Beiträge
964
Reaktionspunkte
117
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie kann ich es Bewerkstelligen ein Datensatz mit 4 (oder mehr) Doppelwörtern zu Schieben ?

Ich habe einen FB, der soll einen Input haben bei dem möchte ich den Bereich der Doppelwörter (ggf. auch byteweise) einlesen, die Daten im Baustein zwischenspeichern und bei Anforderungen wieder bei Output (IN_OUT?) herausgeben. Mit BLOCKMOVE hab ich es nicht geschaft.

Irgendwie krieg ich das nicht gebacken...

Danke noch
Micha
 
Code:
L #Eingangsdoppelwort
T #STAT_Zwischenspeicher
 
U #Verschieben_zum_Ausgang
SPBN M001
 
L #STAT_Zwischenspeicher
T #Ausgangsdoppelwort
 
M001: NOP 0

Evt. brauchst du auch keinen Zwischenspeicher, liegt daran, ob am Eingang der Zustand sich ändert.

pt
 
pointer

hey, mal eine bescheidene frage,

das könnte doch auch mit pointer realisiert werden. ist doch auch nicht aufwendig.

bis denne
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Micha,

..Mit BLOCKMOVE hab ich es nicht geschaft..
Mit der SFC20 kannst du nur Bereiche kopieren, solange sich diese nicht überlappen. Wenn du also einen Bereich von 20 DBDs hast, kannst du diese zwar sonst wo hin kopieren, jedoch nicht und um ein DBD verschieben. Suche nach FiFo oder FiLo.

Gruß, Onkel
 
Hier mal ein Stück Code zur Orientierung. Dabei wird im Ring geschoben, also die letze Information wieder oben eingesetzt!

Code:
NETWORK
TITLE =RT-Info schieben
//Dieses Netzwerk schiebt die Teileinformationen für einen Rundtisch mit X
//Nestern. Dabei werden die Informationen nach rechts im Kreis verschoben, d.h.
//die Info aus Nest N erscheint in Nest N+1, die Info aus Nest X im Nest 1 !!!
//Als Informationseinheit dient eine DInt/DWord-Variable.
      U     #Rundtisch_in_POS; 
      U     L     10.3; 
      FP    L     10.0; 
      =     L     10.4; 
      SPBN  ENDI; 

      AUF   #Info_DB; 
      L     #Anzahl_Nester; //Intitialisierung der   //soviele DWorte sollen geschoen werden
      T     #Nest_Counter; //Schleifenvariable

      L     #Start_Addr;                                //hier gehts im DB los
      L     4; 
      -I    ; //4 weniger, es geht genau bei Start_Addr los
      T     #T_Start_addr; 

      L     #Nest_Counter; 
      SLW   2; //Nest_Counter mit 4 Multipl., wegen 2xDoppelwort !!
      L     #T_Start_addr; //letzte Nest-Variable sichern
      +I    ; 
      ITD   ; 
      SLD   3; //Adreßregister 1 mit Adresse laden
      LAR1  ; 
      L     DBD [AR1,P#0.0]; 
      T     #Schmiervariable; //in der Schmiervariable steht Inhalt vom letzten Nest 

      L     #Nest_Counter; //Schleife beginnt mit letztem Nest -1
      L     1; 
      -I    ; //das Ergebnis muß im Nest_Counter landen

//hier beginnt die Schleife

NEXT: T     #Nest_Counter; //der dekrementierte Akku muß wieder in Nest_Counter landen
      SLW   2; //Nest_Counter mit 4 Multipl., wegen 2xDoppelwort !!

      L     #T_Start_addr; 
      +I    ; 
      ITD   ; 
      SLD   3; //Adreßregister 1 mit Adresse laden
      LAR1  ; 
      L     DBD [AR1,P#0.0]; //es wird immer von Nest in Nest + 1 geschoben
      T     DBD [AR1,P#4.0]; 

      L     #Nest_Counter; //wenn Counter = 0, dann Ende der Schleife
      LOOP  NEXT; 

//zum Schluß noch gesicherte letzte Variable in erste Variable schreiben
      L     #Start_Addr; 
      ITD   ; 
      SLD   3; //Adreßregister 1 mit Adresse laden
      LAR1  ; 
      L     #Schmiervariable; 
      T     DBD [AR1,P#0.0]; 

// und Schmiermerker "Rundtisch gestartet" zurücksetzen

      SET   ; 
      R     L     10.2; 
      R     L     10.3; 

ENDI: NOP   0;
Irgendwo kam letztens der Hinweis, daß Blk_Move auch überlappend kopieren kann, das aber nur in "eine Richtung", da auch der SFC20 nicht den kompletten Block auf einmal kopiert, sondern Byte (oder Word???)-weise. Die Info wird sicher hier im Forum zu finden sein, genauer weiß ich es grad (zu spät :rolleyes:) nicht mehr.
 
Zuletzt bearbeitet:
Hallo Ralle,

..Irgendwo kam letztens der Hinweis, daß Blk_Move auch überlappend kopieren kann, das aber nur in "eine Richtung"..
Ich erinnere mich, es ist schon etwas länger her. Ich hab's jedoch nie probiert. Zu FiFo etc. gibt es jedenfalls eine Vielzahl an Fundstellen. Member Volker oder sps-concept habe sicherlich auch was anzubieten.

Gruß, Onkel
 
Wie kann ich es Bewerkstelligen ein Datensatz mit 4 (oder mehr) Doppelwörtern zu Schieben ?

Ich habe einen FB, der soll einen Input haben bei dem möchte ich den Bereich der Doppelwörter (ggf. auch byteweise) einlesen, die Daten im Baustein zwischenspeichern und bei Anforderungen wieder bei Output (IN_OUT?) herausgeben. Mit BLOCKMOVE hab ich es nicht geschaft.

Irgendwie krieg ich das nicht gebacken...

Danke noch
Micha

Wenn ich dich richtig verstnaden hab dann probiers so:

Leg am aufruf des FB und Intern im FB die selbe UDT an genauso am Out oder In /OUT.

Gruss Andy
 
Wie Schiebe ich eigentlich Daten auf einen IN_OUT ?

Wie kann ich eigentlich Daten auf eine IN_OUT Variable Schieben (>30BYTE div Daten) Das mag der SFC20 nicht.

Danke noch.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
das sollte kein prob für die sfc20 sein. 1024 byte habe ich schon von einem db in einen anderen übertragen. ich denke das es da gar keine grenze gibt
 
Merci Volker

Ich hab aber noch momentan folgendes Problem..

Ich hab in einem FB eine IN_OUT mit eben den Produktionsdaten. Ich muss nun die Daten eben löschen. Jeztet will aber der SFC20 nichts vom einer IN_OUT Variable an der DSTBLK wissen.

CALL "BLKMOV"
SRCBLK :=#EPMPTY //leerer Datenbereich (TEMP Variable)
RET_VAL:=#RET_VAL1 // return (TEMP)
DSTBLK :=#ROLL.DATA //Produktionsdaten (IN_OUT) <-- geht nicht !!! :-(
 
Zurück
Oben