Pointer Zeiger FIFO LIFO aus FAQ von Volker

jürgen g

Level-1
Beiträge
31
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ,

habe diesen Beitrag im FAQ gefunden, da ich mich am Pointer versuche.
Ich bin noch Neuling und habe wenig Erfahrung im AWL programmieren.
Dieser Beitrag hat mir bisher sehr weiter geholfen.
Verstehe leider den Code für die Schleife nicht!
Habe sie versucht sie zu simulieren aber meine CPU geht immer auf Stop,
sobald ich " LAR1" aktiviere .
Code:
 AUF   #Datenbaustein      //Typ: Block_DB                               alles klar
      L     #Datenende          //Typ: INT                                 alles klar
      L     1                                                                      alles klar
     -I
      T     #index              //Typ: DINT                                       alles klar
anf:  NOP   0                   //Schleifenanfang                               alles klar
      L     #index                                                                       alles klar
      SLD   3                   //pointer erzeugen                               alles klar
      LAR1                      //in das Adressregister laden                 hier geht meine CPU auf STOP
      L     DBB [AR1,P#0.0]                                                        alles klar
      T     DBB [AR1,P#1.0]                                                        alles klar
      L     #index                                                                   warum wird hier index um 1 erniedrigt,
      L     1
      -I                        //Index um 1 verringern
      T     #index
      L     1                                                                           um dann gleich wieder um 1 zu erhöhen
      +I    
      L     #Datenanfang        //Typ: INT                                      ab hier ist wieder alles
      <=I                       //prüfen ob fertig
      SPB   ende                //wenn ja ende
      SPA   anf                 //sonst schleife wiederholen
ende: NOP   0
      L     #Eintrag            //Typ: BYTE
      T     DBB [AR1,P#0.0]     //neues byte eintragen


Ich weiß, dass dieser Eintrag schon sehr alt ist aber ich hoffe es kann mir dennoch einer weiterhelfen.

Gruß

Jürgen
 
...
Code:
 ...
      L     #index                                                                   warum wird hier index um 1 erniedrigt,
      L     1
      -I                        //Index um 1 verringern
      T     #index
      L     1                                                                           um dann gleich wieder um 1 zu erhöhen
      +I    
      L     #Datenanfang        //Typ: INT                                      ab hier ist wieder alles
      <=I                       //prüfen ob fertig
      SPB   ende                //wenn ja ende
...
...
Volker verringert erst den Index um 1, um dann mit der +1 den bisherigen Index zu prüfen, ob der Index schon am Datenanfang ist und damit, ob überhaupt noch zum Schleifenanfang zurück gesprungen werden muss.
Warum er das so gemacht hat, kann ich Dir nicht sagen, aber sicher gibt es da auch andere Lösungen. Wie so oft - viele Wege führen nach Rom.
 
Hallo,
vielen Dank für Euer Interesse.
Als Datenanfang bzw. Datenende hätte ich ein Wert erfunden z. B. "1" und "10"
Mein Byts habe ich im DB angelegt zb db5.dbb1 bis db5.dbb10.
Als Eintrag habe ich dann wieder einen Wert erfunden. Z.B. 123.
Der Index Wert stellt für mich die zukünftige Pointer Adresse dar.

Ich habe mir den Code einfach vorgenommen zu analysieren, damit ich mit der AWL vertrauter werde.
Die Funktion des Pointers habe ich gut verstanden, denke ich zumindest, und habe auch schon einige Übungen probiert.
Funktionieren.

Da ich aber gerne noch weiter kommen möchte, versuche ich nun verschiedene Codes im Internet zu analysieren.

Bei dem vorliegenden Code verstehe ich eben z.B. das erst erhöhen und gleich wieder verringern des index nicht.

Hucki: kannst mir erklären wie da geprüft wird ob der Index am Datenanfang ist. Ich erkenne dabei kein Prüfen, da der Wert nirgends verglichen oder geladen wird ? :confused::confused::confused:


mit besten Dank Jürgen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit jeder Lade Anweisung wird der alte Inhalt von Akku1 nach Akku2 kopiert, der neu geladene Wert steht nun in Akku1! Der alte Wert aus Akku2 geht dabei verloren!

Code:
L     #index    // Index z.B. 4 => Im Akku1 steht nun eine 4, im Akku 2 der alte Inhalt von Akku 1
L     1           // Akku1 = 1; Akku2 = 4
-I                // Akku2 - Akku1 = 3; im Akku2 steht immer noch 4!!!
T     #index  // Index beträgt nun 3! Akku2 bleibt unverändert    
L     1          // Akku1 = 1, Akku2 = 3
+I              // Akku1 = 4, Akku2 = 3
L     #Datenanfang // wenn jetzt Datenanfang =4 dann wird aus der Schleife rausgesprungen!
<=I        
SPB   ende

Am besten gehst du mit den Mauscursor im Programm auf den entsprechenden Code (L, T, <=I, SPB) und drücke F1 dort steht das sehr gut beschrieben!

Ansonsten wäre halt noch zu klären, wieso die CPU in STOP geht?? Welcher Datenbaustein ist denn aufgeschlagen?? Hast du den richtigen DB übergeben??
 
...
Bei dem vorliegenden Code verstehe ich eben z.B. das erst erhöhen und gleich wieder verringern des index nicht.

Hucki: kannst mir erklären wie da geprüft wird ob der Index am Datenanfang ist. Ich erkenne dabei kein Prüfen, da der Wert nirgends verglichen oder geladen wird ? ...
Ich hoffe, die Erklärungen von nutellahase geben Dir weiteren Aufschluss.

Wie gesagt, Volker hat erst den Index um 1 auf den neuen Index verringert und gespeichert. Dann hat er den Wert im Akku wieder um 1 erhöht, um den zuletzt benutzten Index mit dem Datenanfang zu vergleichen.
Bei den meisten Operationen stellen im Normalfall der Akku1 und (wenn benötigt) der Akku2 die daran beteiligten Parteien zur Verfügung.

Ich persönlich würde Volkers Programm auch so vereinfachen:
Code:
[FONT=courier new]      AUF   #Datenbaustein              //Typ: Block_DB
[/FONT][FONT=courier new]      TAR1  #dTempAR1                   //Adressregister 1 temporär sichern; Typ: DWORD [/FONT]
[FONT=courier new] 
      L     #Datenende                  //Typ: INT                                 [/FONT]
[FONT=courier new]anf:  L     1[/FONT]
[FONT=courier new]      -I    [/FONT]
[FONT=courier new]      T     #index                      //Typ: DINT                                      [/FONT]
[FONT=courier new]      SLD   3                           //Pointer erzeugen                               [/FONT]
[FONT=courier new]      LAR1                              //in das Adressregister laden                 [/FONT]
[FONT=courier new]      L     DBB [AR1,P#0.0][/FONT]
[FONT=courier new]      T     DBB [AR1,P#1.0][/FONT]
[FONT=courier new]      L     #Datenanfang                //Typ: INT                                     [/FONT]
[FONT=courier new]      L     #index[/FONT]
[FONT=courier new]      >=I                               //prüfen ob fertig[/FONT]
[FONT=courier new]      SPBN  anf                         //ggf. Schleife wiederholen[/FONT]
[FONT=courier new] 
      L     #Eintrag                    //Typ: BYTE[/FONT]
[FONT=courier new]      T     DBB [AR1,P#0.0]             //neues Byte am Datenanfang eintragen[/FONT]
[FONT=courier new] 
      LAR1  #dTempAR1                   //gesichertes Adressregister in AR1 zurückschreiben[/FONT]
 
Hallo,
entschuldigt bitte, dass ich mich erst jetzt melde.
Ich möchte mich nochmals bei euch bedanken, habt mir sehr weitergeholfen.
Hab die ganze Sache nochmals simuliert und es läuft.

Habe den AWL Code auch verstanden.
Das mit dem Akku wusste ich eigentlich schon, habe aber übersehen, dass
am Schluß der Datenanfang verglichen wird und nicht der Index.

Ich werde mir jetzt den Code von Hucki durcharbeiten, weiß noch nicht, was inder Zeile 2 passiert
 
... , weiß noch nicht, was inder Zeile 2 passiert
Mir wurde hier mal erklärt, das es generell eine gute Angewohnheit sei, das Adressregister zu sichern, bevor man damit herum hantiert, und es hinterher wieder herzustellen.
Deshalb hab' ich es mit eingefügt, obwohl es wahrscheinlich nicht unbedingt notwendig wäre:
...
Code:
[FONT=courier new]...
[/FONT][FONT=courier new]      TAR1  #dTempAR1                   //Adressregister 1 temporär sichern; Typ: DWORD [/FONT]
[FONT=courier new]...
[/FONT][FONT=courier new]      LAR1  #dTempAR1                   //gesichertes Adressregister in AR1 zurückschreiben[/FONT]


Wünsche Euch frohe Weihnachten
Weihnachten-2012-im-SPS-Forum
 
Zuletzt bearbeitet:
Zurück
Oben