Step 7 Probleme mit Any Pointer

D.Fricke

Level-1
Beiträge
24
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallöchen !!

ich habe ein kleines problemchen ... (was auch sonst)....:)

Ich habe ein FIFO geschrieben mit einer "reset funktion" .... Wenn der Anlagenbediener den Reset-Button drückt soll der entsprechende Eintrag (der Eintrag der entsprechenden Linie) gefunden und gelöscht werden.

Funzt normalerweise supi ..... hier der entsprechende Code Teil ....:
Code:
SPA End
rst: NOP 0
LAR1 #AR1Speicher
L L#0
T #Fertig
loop: NOP 0
AUF "Qeue2"
L #TeilnehmerNr
L DBD [AR1,P#0.0]
==D 
SPB mov
L -4
SLD 3
+AR1 
L #Fertig
L 1
+D 
T #Fertig
U( 
L #Fertig
L 60
>=D 
) 
SPB End
SPA loop
mov: NOP 0
//Zeiger für Quellbereich###############################
L B#16#10
T LB 6
L B#16#2 //Datentyp Byte
T LB 7
// L 8
// 234 Byte Qeue Laenge - Position für Austrag
L 234
TAR1 
-D 
//#########################################
T LW 8
L 2008
T LW 10
TAR1 
SRD 3
L 8
+D 
ITD 
SLD 3
T LD 12
L B#16#84
T LB 12
//#############################################################
//Zeiger auf Zielbereich#######################################
L B#16#10
T LB 16
L B#16#2
T LB 17
// L 8
//236 Byte Qeue Laenge - Position für Austrag
L 234
TAR1 
-D 
//############################################################
T LW 18
L 2008
T LW 20
TAR1 
ITD 
T LD 22
L B#16#84
T LB 22
/////########################################################
CALL "S7_BLKMOV"
SRCBLK :=#Quelle
RET_VAL:=DB2008.DBW400
DSTBLK :=#Ziel
//######Queue ist nicht leer#################################
U( 
L "Qeue2".Index
L L#2
>=D 
) 
//###############Reduziere Index um 2########################
SPBN End
L "Qeue2".Index
L L#2
-D 
T "Qeue2".Index
//#############Reduzier AR1 Speicher um 2####################
LAR1 #AR1Speicher
L L#-8
SLD 3
+AR1 
TAR1 #AR1Speicher
//###########################################################
SPA End

Nun habe ich heute leider mit ansehen müssen das die Adressierung der BLKMOV's nicht ganz gepasst hat ... und somit mein AR1 Speicher mit in die Queue gemovt wurde ....

Falls also irgendwer einen Rechen bzw. Programmierfehler findet wäre ich sehr dankbar .....
Vielen Dank im Voraus


edit:

OK Sorry .... war ein Bisschen hingeklatscht vorhin, hatte wenig Zeit .. Also hier ein Paar Zusatzinfo's :

Die Länge der Queue ist 236 Byte ... Datentyp der Einträge ist DINT Ein Eintrag besteht aus 2 DINT TeilnehmerNr. und Incode. Nach der Queue im DB kommt ein Zwischenspeicher für AR1 und Index welche ich zur internen Adressierung im FB benutze.
Was passiert ist ...: der BLKMOV hat Zahlenwerte mit in den Bereich der Queue gezogen, diese können nur vom AR1 Speicher kommen. Ich habe versucht den Fehler zu reproduzieren .. ohne Erfolg.
Code:
L B#16#10
T LB 16
L B#16#2
T LB 17
// L 8
//236 Byte Qeue Laenge - Position für Austrag
L 234     Hier habe ich meine Berechnungfür den Quellbereich schon um 2 Byte gekürzt .... 
TAR1 
-D
CPU 417 ... S7 5.5

Also .... hoffe irgendwer hat eine Idee ;) Gruß
 
Zuletzt bearbeitet:
Code:
SPA End
rst: NOP 0
LAR1 #AR1Speicher
L L#0
T #Fertig
loop: NOP 0
AUF "Qeue2"
L #TeilnehmerNr
L DBD [AR1,P#0.0]
==D 
SPB mov
[B][COLOR=#ff0000]L -4
SLD 3  //das müßte man mal testen, bin mir nicht ganz sicher, was passiert, wenn man mit [/COLOR][COLOR=#0000ff]-4 ein SLD 3[/COLOR][COLOR=#ff0000] ausführt, kommt da wirklich  32 (als Pointer) raus???[/COLOR][/B]
+AR1 
L #Fertig
L 1
+D 
T #Fertig
U( 
L #Fertig
L 60
>=D 
) 
SPB End
SPA loop
mov: NOP 0
//Zeiger für Quellbereich###############################
L B#16#10
T LB 6
L B#16#2 //Datentyp Byte
T LB 7
// L 8
// 234 Byte Qeue Laenge - Position für Austrag
L 234
TAR1 
-D 
//#########################################
T LW 8
L 2008
T LW 10
TAR1 
SRD 3
L 8
+D 
[B][COLOR=#ff0000]ITD //das ist schon 32 bit, wozu die Wandlung? Das macht bei großen Adressen Ärger, da bit 15, wenn 1 als Minuszeichen interpretiert wird, also weg damit[/COLOR][/B]
SLD 3
T LD 12
L B#16#84
T LB 12
//#############################################################
//Zeiger auf Zielbereich#######################################
L B#16#10
T LB 16
L B#16#2
T LB 17
// L 8
//236 Byte Qeue Laenge - Position für Austrag
L 234
TAR1 
-D 
//############################################################
T LW 18
L 2008
T LW 20
TAR1 
[B][COLOR=#ff0000]ITD //Wozu die Wandlung? Auch hier unnötig, bzw. eher falsch, denn ITD macht nur Sinn, wenn man mit negativen Zahlen arbeitet. Das macht bei großen Adressen Ärger, da bit 15, wenn 1 als Minuszeichen interpretiert wird, also weg damit[/COLOR][/B]
T LD 22
L B#16#84
T LB 22
/////########################################################
CALL "S7_BLKMOV"
SRCBLK :=#Quelle
RET_VAL:=DB2008.DBW400
DSTBLK :=#Ziel
//######Queue ist nicht leer#################################
U( 
L "Qeue2".Index
L L#2
>=D 
) 
//###############Reduziere Index um 2########################
SPBN End
L "Qeue2".Index
L L#2
-D 
T "Qeue2".Index
//#############Reduzier AR1 Speicher [B][COLOR=#ff0000]um 2[/COLOR][/B]####################
LAR1 #AR1Speicher
[B][COLOR=#ff0000]L L#-8
SLD 3  //um zwei verschieben [/COLOR][/B][COLOR=#ff0000][B]bedeutet [/B][/COLOR][COLOR=#0000ff][B]L L#-2 SLD3[/B][/COLOR][COLOR=#ff0000][B]  (macht 16 als Pointer) oder um was genau soll reduziert werden? hier -8*8 und siehe oben, das Verschieben des Minuszeichens!!![/B][/COLOR]
+AR1 
TAR1 #AR1Speicher
//###########################################################
SPA End

Ich hab mal schnell drübergeschaut und die Sachen rot angestrichen, die ich für nicht korrekt halte.
Generell halte ich das Arbeiten in negative Richtung für etwas unglücklich, da auch schwer lesbar.
Aber das SLD 3 auf eine negative Zahl, ist nicht das Selbe, wie mit 8 multiplizieren, würde ich mal so aus der Hüfte behaupten.
In diesem Falle also lieber *8 rechnen.
Ich rechne in der Regel mit einem Index, den ich normal hochzähle und erst zu einem Pointer (SLD3) mache, wenn ich ihn als Pointer einsetzen will.
Ist oft besser lesbar und verständlicher.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab das mal geprüft.
Es geht, ist aber reichlich gefährlich.

L -2
SLD3
T MW10 --> -16
T MD20 --> 524272

L L# -2
T MW10 --> -16
T MD20 --> -16

Das hast du also richtig, da du beim 2. Mal L L#-8 eingesetzt hast, beim ersten Mal bin ich mir nicht sicher, was im AR1 landet!

Aber: Schön ist das wirklich nicht und es birgt halt die Gefahr, dass man nicht L L# -8 sondern wie oben L -2 schreibt.
Insgesamt würde ich das auf jeden Fall ändern.
 
Zuletzt bearbeitet:
Hallo Ralle,

erstmal vielen Dank für die Hilfe .... :)

Bin nicht darauf gekommen die Queue von unten nach oben zu durchsuchen ..... :( ... da hätte ich mir die negativen Vorzeichen sparen können....Fehler sind dazu da um gemacht zu werden ;)

AR1 um 2 verringern ... da meinte ich 2 Einträge also 2x DINT. 64 bit ...

Das ITD ... habe ich drin gelassen da ich mal gelesen habe das es nix ausmacht .... Aber man lernt nie aus ....

Werde mir morgen den Code nochmal vornehmen ... der kommt Montag zum Kunden ....

Vielen Dank für die Mühe zu der Zeit ... Die Änderungen werde ich morgen umsetzen und dann nochmal die Ergebnisse posten !!!

Gruß
 
So Guten Morgen ....

Habe die Änderungen übernommen... lediglich die negativen Vorzeichen bleiben ... in diesem speziellen Fall brauch das nicht lesbar sein....

Habe ca. 20 Einträge generiert und über die Resetfunktion ausgetragen ... Problemlos !!!

Vielen Dank !!!! Echt super Forum :D
 
Zurück
Oben