# kleines Problem mit Schieberegister



## Klaus.Ka (30 August 2008)

huhu
ich bin gerade dabei ein kleines Schieberegister für eine Anlage zu programmieren.Leider macht er nicht das was ich vorhabe..

FUNCTION FC 1 : VOID
TITLE =Schieberegister
AUTHOR :
VERSION : 0.1

VAR_INPUT
DB_NR : INT ; //DB_NR des Schieberegisters
Laenge : INT ; //Länge des Schieberegisters
Eingabe : BYTE ; //Aktueller Wert
Schiebetakt : BOOL ; //Schiebetakt
END_VAR
VAR_IN_OUT
HM_Flanke : BOOL ; 
END_VAR
VAR_TEMP
DB_Nummer : INT ; //Hilfsnummer
Schleifenzaehler : INT ; 
Zeiger_lesen : DWORD ; 
Zeiger_schreiben : DWORD ; 
Adresse_erster_DS : DWORD ; //Adresse des Datensatzes
END_VAR
BEGIN
NETWORK
TITLE =DB aufschlagen
L #DB_NR; 
T #DB_Nummer; 
AUF DB [#DB_Nummer]; 
NETWORK
TITLE =Länge des Schieberegister prüfen
L #Laenge; 
L 1; 
==I ; 
SPB Lae1; 
NETWORK
TITLE =Länge des Schieberegisters berechnen
L #Laenge; 
+ -1; 
SLD 3; 
T #Adresse_erster_DS; 
// Lesezeiger initialisieren
L P#1.0; 
T #Zeiger_lesen; 
// Schiebetakt generieren
U #Schiebetakt; 
FP #HM_Flanke; 
SPBN Ende; 
NETWORK
TITLE =Schleife für Schieberegister
L #Laenge; 
+ -1; 
schl: T #Schleifenzaehler; 
L #Zeiger_lesen; 
SRD 3; 
+ 1; 
SLD 3; 
T #Zeiger_schreiben; 
L DBB [#Zeiger_lesen]; 
T DBB [#Zeiger_schreiben]; 
// neuen Lesezeiger berechnen (1 Byte erhöhen)
L #Zeiger_lesen; 
SRD 3; 
+ 1; 
SLD 3; 
T #Zeiger_lesen; 
L #Schleifenzaehler; 
LOOP schl; 
Ende: NOP 0; 
NETWORK
TITLE =Aktuellen Wert ins Schieberegister schreiben
Lae1: L #Eingabe; 
T DBB [#Adresse_erster_DS]; 
END_FUNCTION

Vielleicht hat hier jemand eine Idee was ich falsch gemacht habe... 
danke im voraus
ciao
klaus.ka


----------



## vierlagig (30 August 2008)

frage: was macht er denn nicht?

hinweis: deine adressberechnung ist ziemlich aufwendig um nicht zu sagen kompliziert ...

bitte: code-tags benutzen!


----------



## Klaus.Ka (30 August 2008)

huhu vierlagig
sorry er schiebt den wert nicht weiter...
warum aufwendig bzw kompliziert? 
hast du nen besseren vorschlag?
ciao 
klaus.ka


----------



## vierlagig (30 August 2008)

Klaus.Ka schrieb:


> huhu vierlagig
> sorry er schiebt den wert nicht weiter...
> warum aufwendig bzw kompliziert?
> hast du nen besseren vorschlag?
> ...



ja, ich adressiere solche dinge in zusammenhängenden blöcken gern mit hilfe des adressregister 1 ... ein beispiel dafür findest du hier:

http://www.sps-forum.de/showpost.php?p=151825&postcount=8


----------



## Ralle (30 August 2008)

Klaus.Ka schrieb:


> huhu vierlagig
> sorry er schiebt den wert nicht weiter...
> warum aufwendig bzw kompliziert?
> hast du nen besseren vorschlag?
> ...



Schiebt er ihn gar nicht, oder steht hinterher etwas Falsches drin? Ich hab den Code nur mal so überflogen.

Du schiebst immer von: 

1 nach 2
2 nach 3
3 nach 4
4 nach 5
...

Wenn du also in 1 eine 15 stehen hast, wird die in einer Schleife (1 Schiebetakt) komplett durchgeschoben, bleibt aber auf 1 erhalten, da sie dort nicht gelöscht wird.
Du mußt hinten anfangen zu schieben:

...
6 nach 7
5 nach 6
4 nach 5
3 nach 4
2 nach 3
1 nach 2
1 löschen


----------



## Klaus.Ka (30 August 2008)

huhu vierlagig
werd mir deinen code mal anschauen....

huhu ralle
nein der code wird einmal eingetragen und bleibt und bleibt dann dort...
eigentlich sollte das schieberegister rückwärts laufen also von 15 nach 1

ciao
klaus.ka


----------



## vierlagig (30 August 2008)

Klaus.Ka schrieb:


> huhu vierlagig
> werd mir deinen code mal anschauen....



aufpassen:
bezieht sich auf den instanz-db des fbs
doppelwortadressierung
und kommt von hinten, also im array[0..7] of real von 7 nach 0


----------



## Ralle (30 August 2008)

Klaus.Ka schrieb:


> huhu vierlagig
> werd mir deinen code mal anschauen....
> 
> huhu ralle
> ...



Wo trägst du den Code ein, an Stelle 1 des SR?, da bleibt er auch, da er da ja nie gelöscht wird.

Du fängst an mit Zeiger_lesen P#1.0 daraus Zeiger schreiben (+1) macht P#2.0. In der nächsten Schleife erhöhst du um 1, also lesen: P#2.0. Schreiben P#3.0.
Damit jagst du den Wert an P#1.0 bei einem kompletten Schleifendurchlauf einmal durch dein Schieberegister. Das ist so sicher nicht gewollt oder?


----------



## Klaus.Ka (31 August 2008)

Ralle schrieb:


> Wo trägst du den Code ein, an Stelle 1 des SR?, da bleibt er auch, da er da ja nie gelöscht wird.
> 
> Du fängst an mit Zeiger_lesen P#1.0 daraus Zeiger schreiben (+1) macht P#2.0. In der nächsten Schleife erhöhst du um 1, also lesen: P#2.0. Schreiben P#3.0.
> Damit jagst du den Wert an P#1.0 bei einem kompletten Schleifendurchlauf einmal durch dein Schieberegister. Das ist so sicher nicht gewollt oder?


 
huhu ralle
stimmt du hast recht aber ich versteh net warum er nicht bei p#1.0 anfängt sondern bei p#10.0 und nicht richtig arbeitet.
irgendwo seh ich den wald vor lauter bäumen nicht.muß glaub ich nochmal neu anfangen...  
ciao
klaus.ka


----------



## Ralle (31 August 2008)

Wenn ich das richtig sehe, willst du ja von links nach rechts also vom Ende zum Anfang schieben. Du stellst deinen Wert z.Bsp. in 10 ein und schiebst in dann Richtung 1, also vom "höheren" Speicheort zum "niedrigeren", richtig?

dann mußt du deine Lesen- und Schreiben-Zeiger anders berechnen.

Mit dem hohen Wert anfangen, z.Bsp 10, bei Länge 10 des SR:

2 nach 1 (2-->lesen, 1-->schreiben)
3 nach 2
4 nach 3
...
9 nach 8
10 nach 9
neuer Wert in 10.


----------



## Klaus.Ka (31 August 2008)

huhu ralle
ja genau von oben nach unten.... 
bin gerade wieder am ändern... mal schaun ob es klappt 
schönen sonntag
ciao
klaus.ka

Hab meinen Denkfehler gefunden.... 
JUhU


----------

