Block um ein Bit verschieben

tobl2002

Level-2
Beiträge
75
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.

Ich stehe vor einem Problem:
Um ein Signal abzuspeichern, benötige ich ein Schieberegister mit einem Bit welches ich um ein Bit schieben kann.

beispiel:
DBX 0.0 Wert: 1
DBX 0.1 Wert: 0
DBX 0.2 Wert: 0
DBX 0.3 Wert: 0
DBX 0.4 Wert: 0

Danach dann:
DBX 0.0 Wert: 0
DBX 0.1 Wert: 1
DBX 0.2 Wert: 0
DBX 0.3 Wert: 0
DBX 0.4 Wert: 0

Danach:
DBX 0.0 Wert: 0
DBX 0.1 Wert: 0
DBX 0.2 Wert: 1
DBX 0.3 Wert: 0
DBX 0.4 Wert: 0

Aber da natürlich nicht nur über 5Bits sonder über 1000 oder mehr...
Das ganze soll in einer S7-200 realisiert werden. Als Int-Wert ist es ja kein Problem (habe ich bereits auch schon bei einem anderen Programm realisiert) nur das macht an dieser Stelle keinen Sinn, da es viel zu viel Platz im DB benötigt.

Über Anregungen, Vorschläge und Tipps würde ich mich sehr freuen.

Gruß
Tobl
 
Zuletzt bearbeitet:
okay...
ich habe was gefunden:
Es geht ganz einfach mit dem "SHRB".^^

Wie kann ich aber das ganze bei einer S7-300 machen? hat da jemand eine Idee?

Gruß
Tobl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Suche mal in der Hilfe für AWL nach dem befehl SRW, SRD, SLW, SLD
oder in FUP nach SHR_I, SHR_DI, SHR_W, SHR_DW etc.

Gruß
 
Zuletzt bearbeitet:
mhhh hatte ich mir bereits schon mal angeschaut, damit schiebe ich aber nur 16 oder 32 Bit. Das ist leider viel zu wennig...

SHRB kann wohl auch nur 128 Bit schieben. Ist aber schon mal etwas mehr^^
 
mit Block_Move kann ich doch nur um ein komplettes Byte verschieben und nicht um ein Bit. oder?

Also bei der S7-200 funktioniert es.
Ich kann mit meinem SHRB z.B. 120 Bits schieben, dann hänge ich an meinen SHRB (an den ENO) noch einen SHRB und als DATA nehme ich den SM1.1 (Überlaufwert). usw. so komme ich ohne Probleme auf meine 1000 Bits.

Ich denke mal so ähnlich kann ich es bei der S7-300 auch machen. nur bestimmt nicht mit 120 Bits (oder mehr), oder?
 
Morgen,


ev so ?

Code:
CALL  SFC   20
       SRCBLK :=P#DB1.DBX0.0 BYTE 100
       RET_VAL:=MW100
       DSTBLK :=P#DB2.DBX0.0 BYTE 100

 CALL  SFC   20
       SRCBLK :=P#DB2.DBX0.0 BYTE 100
       RET_VAL:=MW102
       DSTBLK :=P#DB1.DBX1.0 BYTE 100

      L     0
      T     DB1.DBB    1

ENDE: NOP0


Lg Backdoor
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das stimmt nicht !

Quelle : P#DB10.DBX0.0 byte 20

Ziel: P#DB10.DBX40.0 byte 20

und schon hast du 20 Byte Daten um 40 byte verschoben!
achja die 20 byte die Frei werden müßen noch auf null gesetzt werden!
Gruß
 
Das stimmt nicht !

Quelle : P#DB10.DBX0.0 byte 20

Ziel: P#DB10.DBX40.0 byte 20

und schon hast du 20 Byte Daten um 40 byte verschoben!
achja die 20 byte die Frei werden müßen noch auf null gesetzt werden!
Gruß


Geht das auch???
Quelle : P#DB10.DBX0.0 byte 20

Ziel: P#DB10.DBX0.1 byte 20

Dann bin ich glücklich^^
 
Fürs bitweise Verschieben von Daten git es außer den Schiebe- auch noch die Rotationsbefehle. Und mit diesen läßt sich sich dann diese Kette zusammenbauen. Allerdings gibt's diese nur Doppelwortbreit.

RLDA und RRDA schieben den Inhalt von Akku1 um ein Bit nach links/rechts, das herausfallende Bit wandert in das Statusbit A1, das ursprüngliche A1 wandert in das freiwerdende Bit des Akku1. A1 dient also bei einer Kette zur Übergabe von einem DW zum nächsten.

Edit: Sorry, das ist S7-300, hab den Hinweis auf die S7-200 übersehen.
 
Sollte eigentlich funtionieren !
Ich weiß mein Beispiel war nicht sehr glücklich gewählt!

Aber drann denken Das du die frei werden bits auf 0 setzt weil diese art zu schieben eigentlich ein kopieren mit überschneidung ist!

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sollte eigentlich funtionieren !
Ich weiß mein Beispiel war nicht sehr glücklich gewählt!

Aber drann denken Das du die frei werden bits auf 0 setzt weil diese art zu schieben eigentlich ein kopieren mit überschneidung ist!

Gruß

Für das 0 setzen würde sich ja ein ausreichend großer DB, der nur mit Nullen gefüllt ist, anbieten!
aber nur wenn mehr als ein DW geschoben wird (ich meine den Bitversatz)!


Gruß
 
Zuletzt bearbeitet:
Sollte eigentlich funtionieren !
Ich weiß mein Beispiel war nicht sehr glücklich gewählt!

Aber drann denken Das du die frei werden bits auf 0 setzt weil diese art zu schieben eigentlich ein kopieren mit überschneidung ist!

Gruß

Vielen Dank. Werde ich mir mal die Tage anschauen. Wichtig ist erst mal das es bei der S7-200 funktioniert. was es ja auch tut.

Ähm das freiwerdende Bit wird doch wieder neu beschrieben....


Ich habe noch eine andere Frage:
Indirekte Adressierung bei der S7-200, habe ich schon gemacht, aber wie kann ich z.B. bei oben gennannten Programm das 589.Bit auswählen?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn das mit dem überschneidenden Kopieren nicht funktioniert mußt du einen Puffer einsetzen!


CALL SFC 20
SRCBLK :=P#DB1.DBX0.0 BYTE 100
RET_VAL:=MW100
DSTBLK :=P#DB2.DBX0.1 BYTE 100 <<<< hier erfolgt
die Verschiebung
CALL SFC 20
SRCBLK :=P#DB2.DBX0.0 BYTE 100
RET_VAL:=MW102
DSTBLK :=P#DB1.DBX0.0 BYTE 100


Möchtest du immer nur das 589. Bit abfragen oder soll das fließend sein!

Gruß
 
Wenn es fließend sein soll dann such mal in der Hilfe nach Baustein zum verändern des Pointers!


Gruß
SKg
 
Die Verschiebung ist kein Problem mehr. Es gibt ja bereits jede Menge Lösungsmöglichkeiten hier, die ich dann testen kann.

Die S7-300 war sowieso nur eine "Nebenfrage". Programmiert wird alles mit der S7-200.

Ich muss über einen Int-Wert einstellen können, das ich z.B. das 321. Bit aus meinem Schieberegister abfragen will. Dieser Wert ist variabel. (zwischen 1 und 1000)
Wenn ich das richtig in der Hilfe von MicroWin gelesen habe, gibt es aber wohl keine Möglichkeit direkt ein Bit indirekt zu adressiern.
Meine Idee geht dahin eine Wert vorzugeben (z.B. wieder die 321) den dann durch 8 zu dividiern, und dann schon mal mein Byte auszuwählen. Der rest von meiner Division gibt ja dann mein Bit an, welches ich mir dann nur noch aus den 8 raussuchen muss...
Ich bin da noch am probieren...

bei anderen Ideen bitte melden^^
 
Zurück
Oben