# Block um ein Bit verschieben



## tobl2002 (5 Mai 2010)

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


----------



## tobl2002 (5 Mai 2010)

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


----------



## SKg (5 Mai 2010)

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ß


----------



## tobl2002 (5 Mai 2010)

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^^


----------



## Verpolt (5 Mai 2010)

Hallo,

du könntest auch mit BLOCK_MOVE den Bereich verschieben.

(SFC20)


----------



## SKg (5 Mai 2010)

Verpolt schrieb:


> Hallo,
> 
> du könntest auch mit BLOCK_MOVE den Bereich verschieben.
> 
> (SFC20)


 
Dem muß ich auch zustimmen! 


Gruß


----------



## tobl2002 (5 Mai 2010)

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?


----------



## Backdoor (5 Mai 2010)

Morgen,


ev so ?


```
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


----------



## SKg (5 Mai 2010)

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ß


----------



## tobl2002 (5 Mai 2010)

SKg schrieb:


> Das stimmt nicht !
> 
> Quelle : P#DB10.DBX0.0 byte 20
> 
> ...




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

Ziel: P#DB10.DBX0.*1* byte 20

Dann bin ich glücklich^^


----------



## hovonlo (5 Mai 2010)

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.


----------



## vierlagig (5 Mai 2010)

Fc90 reg_schb


----------



## SKg (5 Mai 2010)

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ß


----------



## SKg (5 Mai 2010)

vierlagig schrieb:


> Fc90 reg_schb


 
Sieht auch vielversprechend aus !

ist ein S5-S7 Converting Block

und heißt eigentlich Bit Shift Register

Gruß


----------



## SKg (5 Mai 2010)

SKg schrieb:


> 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!
> ...


 
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ß


----------



## Verpolt (5 Mai 2010)

SKg schrieb:


> Für das 0 setzen würde sich ja ein ausreichend großer DB, der nur mit Nullen gefüllt ist, anbieten!
> 
> Gruß




Wie meinst du denn das?


----------



## tobl2002 (5 Mai 2010)

SKg schrieb:


> 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!
> ...



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?


----------



## SKg (5 Mai 2010)

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ß


----------



## SKg (5 Mai 2010)

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


Gruß
SKg


----------



## tobl2002 (5 Mai 2010)

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^^


----------



## SKg (5 Mai 2010)

Das hat nur gültigkeit bei S7  300/400!

Ein indirekter Aufruf sieht etwa so aus!

AUF DB1

L P#50.7
T #Zeiger

U DBX [#Zeiger] < es wird DB1.DBX50.7 abgefragt
= A0.0

Du müßtest dann bloß den Zeiger richtig Stellen!

Gruß


----------



## tobl2002 (5 Mai 2010)

SKg schrieb:


> Ein indirekter Aufruf sieht etwa so aus!
> 
> AUF DB1
> 
> ...



aber nicht bei der S7-200, MicroWin...


----------



## SKg (5 Mai 2010)

Sorry hatte  den anderen Beitrag zu spät gelesen!


----------



## SKg (5 Mai 2010)

Schau mal auf seite 36 und 37 der Beschreibung!

Naja Bitweise abfragen scheint nicht zu funktionieren! 
Auszug aus der Beschreibung:
Bei der S7--200 können Sie mit einem Pointer auf die folgenden Speicherbereiche zugreifen: E, A,
V, M, S, AE, AA, SM, T (nur auf den aktuellen Wert) und Z (nur auf den aktuellen Wert). Mit der
indirekten Adressierung können Sie nicht auf einzelne Bits oder auf die Speicherbereiche HC​oder L zugreifen.
 

Arbeite leider selten bis garnicht mit S7 200

Gruß


----------



## SKg (5 Mai 2010)

_Darf man fragen wofür das ganze gut sein soll?_


----------



## tobl2002 (5 Mai 2010)

ja klar.
es geht hier bei um eine artikelverfolgung. 
ganz einfach eigentlich, artikel da oder Artikel nicht da. Über einen Drehgeber welcher sich an der Welle vom Band befindet, bekomme ich mehrere Impulse  pro umdrehung (schiebeimpuls für meine Schieberegister). So kann ich sagen in 1,53m (=z.b. 100Impulse = mein Variabler Wert) abstand von meinem Sensor zur Erfassung habe ich einen Artikel oder keinen. Im Prinzip spare ich mir so sehr viele Sensoren auf meinem Förderband. Alles natürlich unter der vorraussetzung, das keiner einen Artikel fest hält oder sonst was damit macht...

Ich hoffe das kann man so verstehen^^


----------



## SKg (5 Mai 2010)

So eine Art Multiplexen für Sensoren, ein Sensor viele viele Positionen


----------



## Larry Laffer (5 Mai 2010)

und du bekommst dein Schieberegister im Takt der Impulse des Inkr.Gebers weitergeschoben ? Wie groß ist denn die Impuls-Frequenz des Gebers ?

Gruß
LL


----------



## tobl2002 (5 Mai 2010)

Ähm das ist kein richtiger drehgeber, sonder ein Normaler Sensor mit etwa 4 Impulse / sec. Dies wird mit nem Interrupt ausgewertet, funktioniert alles auch schon schön.
Übrigends einen "normalen" drehgeber" mit 4096 Impulsen habe ich ebenfalls im Einsatz aber dann als HSC parametriert, was auch super funktioniert...


----------



## Larry Laffer (5 Mai 2010)

tobl2002 schrieb:


> Ähm das ist kein richtiger drehgeber, sonder ein Normaler Sensor mit etwa 4 Impulse / sec. Dies wird mit nem Interrupt ausgewertet, funktioniert alles auch schon schön...


 
Das glaube ich dir - allerdings wirst du so sicherleich nicht besonders genau sein - Zentimeter ?


----------



## tobl2002 (5 Mai 2010)

Stimmt, ist auch bei der Anlage nicht sehr wichtig +/-5cm müssten das etwa sein, erfassungsbereich etwa 200m. geht natürlich auch genauer, aber ist mir so voll und ganz ausreichend.


Leider noch mal eine Anmerkung zu  meinem Bit-schieben in der S7-200:
ich kann zwar maximal eine 127 bei N an den SHRB schreiben, aber das maximum ist leider schon 64. naja dann muss ich den eben 16x aufrufen^^


----------



## Approx (5 Mai 2010)

So wie ich es verstehe, ist der Weg pro Impuls eine Konstante. 
Warum zählst Du dann nicht einfach bei Erfassung die Impulse hoch und errechnest so den zurückgelegten Weg? Diesen dann auf den Gesamtweg (200m) vergleichen, und so weiter...
Ist doch sicher verständlicher, als viele Schiebe-Operationen. Wobei mir die Lösung mit dem SFC20 und Zwischenspeicher gut gefällt (für S7-300/400)

Gruß Approx


----------



## tobl2002 (5 Mai 2010)

mhhh ja an sowas hatte ich auch schon mal gedacht, problem ist dann aber nur das ich dann für jeden artikel einen zähler brauche. ich will ja auch noch bei 199,9m eine auswertung machen können wann da ein artikel ankommt... Im schlimmsten fall könnten es 1000 artikel und mehr sein. und dann 1000 zähler programmieren ist mir zu viel...

Oder habe ich das jetzt falsch verstanden?

Gruß
Tobl


----------



## rostiger Nagel (5 Mai 2010)

darf ich den mal fragen was passiert wenn du diese, bis zu 1000 Artikel 
auf dem Band hast. Soll dann an einer bestimmten Stelle des Bandes
eine Aktion ausgeführt werden zu einen bestimmten Artikel. Z.b. es soll
ausgeschleust werden?


----------



## Approx (5 Mai 2010)

Helmut_von_der_Reparatur schrieb:


> darf ich den mal fragen was passiert wenn du diese, bis zu 1000 Artikel
> auf dem Band hast. Soll dann an einer bestimmten Stelle des Bandes
> eine Aktion ausgeführt werden zu einen bestimmten Artikel. Z.b. es soll
> ausgeschleust werden?


@Helmut: Das wüsste ich auch gern. Dabei können es ja 1000 Artikel und mehr sein! Bei der angegebenen 200m Gesamtstrecke und 1000 Teile sind das dann schon alle 20cm ein Artikel. Bei mehr Teilen entsprechend weniger. 

@Tobl2002: Um bei den wandernden Bit's zu bleiben - was würdest Du denn mit der Erkenntnis anstellen, dass z.B. zum Zeitpunkt x das 782. Bit auf TRUE gesetzt ist? Bei laufendem Prozess ist dieses Bit ja u.U. schon nach 0,25s woanders!

Gruß


----------



## Larry Laffer (5 Mai 2010)

Hallo ihr,
das hier angewandte System kenne ich aus der Holz-Bearbeitung (Helmut sicherlich auch) als Streckensteuerung. Allerdings wird diese (da hier eine Genauigkeit < mm erforderlich ist) auch über Zähler gelößt. Hierbei gibt es dann aber meißt auch nur 20 - 40 Teile in einer Strecke, die auch nur ca. 20 m lang ist. Erfasst wird immer das Vorderkanten-Offset eines Teils und das Hinterkanten-Offset des gleichen Teils und zugeordnet wird das dem nächsten freien Index-Speicher (ich hatte das so in der Art mal mit einer S5 programmiert - dieses Programm habe ich aber nicht mehr). Auf diese Weise läßt sich jedenfalls die absolute Teile-Position ziemlich genau zuordnen und auf dem Wege kann man dann gut Ini's einsparen ... .

Mit einem echten Schieberegister würde ich hier nicht arbeiten - vor Allem bei der Genauigkeit und der Teilezahl auf der Strecke ... aber es scheint ja zu funktionieren ...

Gruß
LL


----------



## rostiger Nagel (5 Mai 2010)

Larry Laffer schrieb:


> Hallo ihr,
> das hier angewandte System kenne ich aus der Holz-Bearbeitung (Helmut sicherlich auch) als Streckensteuerung. Allerdings wird diese (da hier eine Genauigkeit < mm erforderlich ist) auch über Zähler gelößt. Hierbei gibt es dann aber meißt auch nur 20 - 40 Teile in einer Strecke, die auch nur ca. 20 m lang ist. Erfasst wird immer das Vorderkanten-Offset eines Teils und das Hinterkanten-Offset des gleichen Teils und zugeordnet wird das dem nächsten freien Index-Speicher (ich hatte das so in der Art mal mit einer S5 programmiert - dieses Programm habe ich aber nicht mehr). Auf diese Weise läßt sich jedenfalls die absolute Teile-Position ziemlich genau zuordnen und auf dem Wege kann man dann gut Ini's einsparen ... .
> 
> Mit einem echten Schieberegister würde ich hier nicht arbeiten - vor Allem bei der Genauigkeit und der Teilezahl auf der Strecke ... aber es scheint ja zu funktionieren ...
> ...


 
Genau darauf wollte ich hinaus, eine Streckensteuerung...


----------

