Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 10 von 10

Thema: Pointer Zeiger FIFO LIFO aus FAQ von Volker

  1. #1
    Registriert seit
    30.10.2012
    Beiträge
    31
    Danke
    17
    Erhielt 1 Danke für 1 Beitrag

    Standard


    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
    Zitieren Zitieren Pointer Zeiger FIFO LIFO aus FAQ von Volker  

  2. #2
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Wie lauten denn Deine Werte für Datenanfang und Datenende? Und gibt es diese Bytes in Deinem DB?

  3. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    jürgen g (17.12.2012)

  4. #3
    Registriert seit
    03.04.2008
    Beiträge
    6.205
    Danke
    237
    Erhielt 817 Danke für 691 Beiträge

    Standard

    Was steht in Index?

    Ist dir klar, was und vor allem wie du es machen willst?


    bike
    "Any fool can write code that a computer can understand.
    Good programmers write code that humans can understand."
    --Martin Fowler

  5. Folgender Benutzer sagt Danke zu bike für den nützlichen Beitrag:

    jürgen g (17.12.2012)

  6. #4
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Zitat Zitat von jürgen g Beitrag anzeigen
    ...
    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.

  7. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    jürgen g (17.12.2012)

  8. #5
    Registriert seit
    30.10.2012
    Beiträge
    31
    Danke
    17
    Erhielt 1 Danke für 1 Beitrag

    Standard

    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 ?


    mit besten Dank Jürgen

  9. #6
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

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

  10. Folgender Benutzer sagt Danke zu nutellahase für den nützlichen Beitrag:

    jürgen g (17.12.2012)

  11. #7
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Zitat Zitat von jürgen g Beitrag anzeigen
    ...
    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:
          AUF   #Datenbaustein              //Typ: Block_DB
          TAR1  #dTempAR1                   //Adressregister 1 temporär sichern; Typ: DWORD 
     
          L     #Datenende                  //Typ: INT                                 
    anf:  L     1
          -I    
          T     #index                      //Typ: DINT                                      
          SLD   3                           //Pointer erzeugen                               
          LAR1                              //in das Adressregister laden                 
          L     DBB [AR1,P#0.0]
          T     DBB [AR1,P#1.0]
          L     #Datenanfang                //Typ: INT                                     
          L     #index
          >=I                               //prüfen ob fertig
          SPBN  anf                         //ggf. Schleife wiederholen
     
          L     #Eintrag                    //Typ: BYTE
          T     DBB [AR1,P#0.0]             //neues Byte am Datenanfang eintragen
     
          LAR1  #dTempAR1                   //gesichertes Adressregister in AR1 zurückschreiben

  12. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    jürgen g (17.12.2012)

  13. #8
    Registriert seit
    30.10.2012
    Beiträge
    31
    Danke
    17
    Erhielt 1 Danke für 1 Beitrag

    Standard

    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

  14. #9
    Registriert seit
    30.10.2012
    Beiträge
    31
    Danke
    17
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Wünsche Euch frohe Weihnachten

    Gruß
    Jürgen
    Zitieren Zitieren Frohe Weihnachten  

  15. #10
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von jürgen g Beitrag anzeigen
    ... , 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:
    Zitat Zitat von hucki Beitrag anzeigen
    ...
    Code:
    ...
          TAR1  #dTempAR1                   //Adressregister 1 temporär sichern; Typ: DWORD 
    ...
          LAR1  #dTempAR1                   //gesichertes Adressregister in AR1 zurückschreiben

    Zitat Zitat von jürgen g Beitrag anzeigen
    Wünsche Euch frohe Weihnachten
    Weihnachten-2012-im-SPS-Forum
    Geändert von hucki (22.12.2012 um 23:56 Uhr)

Ähnliche Themen

  1. Pointer Zeiger FIFO LIFO
    Von plc_tippser im Forum FAQ
    Antworten: 1
    Letzter Beitrag: 22.02.2015, 18:53
  2. Zeiger, Pointer
    Von redscorpion im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 14.07.2011, 07:14
  3. Zeiger/Pointer auf eine Struktur
    Von logo78 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 29.03.2009, 17:09
  4. Wert mit Zeiger aus DB auslesen
    Von mst im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 03.03.2006, 20:20
  5. Schieberegister (FIFO) mit Pointer
    Von Anonymous im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 31.03.2004, 18:55

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •