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

Results 1 to 2 of 2

Thread: Pointer Zeiger FIFO LIFO

  1. #1
    Join Date
    07.05.2004
    Location
    Campbelltown
    Posts
    2,500
    Danke
    131
    Erhielt 293 Danke für 86 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    von Volker


    pointer
    Hier ein paar Beispiele zur indirekten Adressierung / Pointer

    Ein Merkerwort laden indem wir den Pointer direkt laden.
    Code:
    L P#30.0
    T MD 10
    L MW [MD 10] // lädt das mw30
    Dies ist unflexibel.
    -----------------------------------

    Eleganter geht es, indem wir den Pointer selbst erzeugen und über das Adressregister ansprechen.
    Code:
      L     30
      SLD   3
      LAR1                    // ergibt einen pointer von P#30.0 in adressregister1 
      L     MW [AR1,P#0.0]    // lädt das mw30
    Schon besser. Aber warum schieben wir 3 nach links?
    Das liegt am Aufbau des Pointer. vereinfacht: Byteadress(16Bit).Bitadress(3Bit). (genauerers im Bild im Anhang)
    Die 30 liegt also durch das schieben in der Byteadresse. die Bitadresse ist 0.
    -----------------------------------

    Nun gibt es noch den Versatz (p#0.0). Dieser wird zum Pointer im Adressregister hinzuaddiert.
    Code:
      L     MW [AR1,P#2.0]    // lädt das mw32 (30 + 2.0)
      U     M [AR1,P#4.4]     // fragt M 34.4 ab
    Fast perfekt.
    -----------------------------------

    Nun wollen wir auch noch die Bitadresse fexibel gestalten.
    Code:
      L     30
      SLD   3
      LAR1                    // im ar1 steht p#30.0
      L     4
      +AR1                    // die 4 wird zum ar1 hinzuaddiert. im ar1 steht jetzt p#30.4
      U     E [AR1,P#0.0]     // fragt e30.4 ab
      L     EW [AR1,P#0.0]    // das würde die cpu in stop bringen, da es das ew30.4 nicht gibt.
               // nur bei bitoperationen darf die bitadresse <>0 sein.
    -----------------------------------

    Um indirekt auf ein Datenwort zugreifen zu können, ist es zwingend erforderlich den Datenbaustein vorher zu öffnen.
    Code:
    L db10.dbw [AR1,P#0.0]   // dies funktioniert nicht
     
      AUF   DB    10
      L     DBW [AR1,P#0.0]    // so ist es richtig
    -----------------------------------

    Anwendungsbeispiel mit einer Schleife
    Code:
    FILO für Datenbyte (FirstInLastOut)
    FiLo         __\ byte1 \________________
                |  /       /                |
                |    byte2 \_________    /__|3.
                |          /         |   \
                |    byte3 \__    /__|2.
                |          /  |   \
                |    byte4 /__|1.
                |          \
                |
                |
    quelle    4.|__/ byte
                   \
    Ablauf: 
    1. zielbyte  3 wird nach zielbyte 4 kopiert. das alte byte 4 geht verloren.
    2. zielbyte  2 wird nach zielbyte 3 kopiert
    3. zielbyte  1 wird nach zielbyte 2 kopiert
    4. quellbyte 1 wird nach zielbyte 1 kopiert
    Code:
          AUF   #Datenbaustein      //Typ: Block_DB
          L     #Datenende          //Typ: INT
          L     1
          -I    
          T     #index              //Typ: DINT
    anf:  NOP   0                   //Schleifenanfang
          L     #index
          SLD   3                   //pointer erzeugen
          LAR1                      //in das Adressregister laden
          L     DBB [AR1,P#0.0]
          T     DBB [AR1,P#1.0]
          L     #index
          L     1
          -I                        //Index um 1 verringern
          T     #index
          L     1
          +I    
          L     #Datenanfang        //Typ: INT
          <=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
    einige Bauteine für weitere variablen / blöcke findet ihr auf der homepage von volker.
    -----------------------------------

    Indirekt auf einen Bereich im Temp-Bereich zugreifen
    nummer: typ int im temp-bereich an adresse 0
    maschine: Array [0..5] of int im temp-bereich ab adresse 2
    Code:
    // var zum test vorbelegen
          L     2
          T     #nummer
    //----------------
          L     P##maschine                 //pointer auf array laden
          LAR1                              //ins adressregister speichern
          L     #nummer
          L     2
          *I                                //mit 2 multiplizieren da typ:int
          SLD   3                           //pointer bauen
          +AR1                              //zum adressregister hinzuaddieren
          L     W [AR1,P#0.0]               //läd den wert von #maschine[2]
    -----------------------------------

    Es kann auch Adressregister2 (AR2) verwendet werden.
    Aber Vorsicht:
    Das DI-Register und das Adressregister AR2 werden systemseitig für den FB- und Multiinstanz-CALL verwendet. Bei FC's braucht ihr euch nicht darum zu kümmern.

    Weiterführende Themen: Any-Zeiger für Datentypen
    .
    Attached Images Attached Images
    Last edited by volker; 28.08.2015 at 19:00.
    Gegen Schwachsinn, Schwachköpfe und armselige Trittbrettfahrer kann man nicht argumentieren.

    Gott sieht alles, auch Signaturen in Geheimschrift,,... aber er petzt nicht.
    Reply With Quote Reply With Quote Pointer Zeiger FIFO LIFO  

  2. Folgende 148 Benutzer sagen Danke zu plc_tippser für den nützlichen Beitrag:

    /*Matthias*/ (18.06.2008),11koma00010100 (11.03.2016),1nsane (20.05.2008),admin77 (08.08.2013),AirKlaus (16.03.2017),Amkonianer (16.03.2015),Andy79 (02.12.2009),Anonymous42 (20.12.2013),ansem187 (19.12.2012),Antistiftler (22.10.2011),apachler (23.04.2007),AT_S (22.03.2017),B3nnY (31.05.2015),Bob1000 (30.08.2017),Bobbybau91 (24.03.2015),Bodenrocker (05.08.2014),BRT-38 (23.01.2019),Buschmann (30.04.2010),Bär1971 (31.01.2011),CaBr (05.10.2016),ch1576 (08.04.2011),character (05.10.2007),chrigu (07.08.2010),CL550 (11.05.2011),CNC840D (08.04.2008),Computerliebe (12.12.2007),corumlu3 (27.03.2013),Cosman (10.08.2008),cosmomaster (15.04.2011),cth (13.07.2008),Dagobert (04.04.2009),dan_mue (03.08.2010),Datenteufel (29.10.2009),Dave-1 (04.02.2015),Da_Basco (28.03.2008),DerSchlangen (20.04.2017),DiGo1969 (15.07.2011),Dina (08.10.2008),Din_Don (02.11.2015),DJ78 (02.08.2010),Django2012 (03.06.2012),don_looney (13.05.2015),drmicha (28.08.2009),easyprivate (25.02.2009),Erich04 (26.05.2011),erick_wick (06.10.2009),esse (19.01.2009),eYe (16.03.2009),frickel (25.04.2008),Ganz (06.04.2008),ganzneu (08.03.2014),Gleichstromer (17.09.2014),gordon (02.12.2013),Harry_99 (22.02.2015),Ibaxx (26.09.2007),Ice_T (13.09.2007),iFrost (19.06.2018),Jan (22.01.2012),Javigis (04.08.2016),jokey (06.10.2008),Joserl (05.09.2011),KG_TC (02.07.2008),kruz_007 (10.03.2014),Kuddel30 (25.10.2009),kuti (15.12.2013),Küffel (25.06.2008),Linus110880 (18.09.2015),lion1702 (16.03.2014),LOBBE1 (26.12.2019),logo78 (19.11.2010),LT Smash (16.08.2011),LUKFRIT (17.04.2018),mad_max (20.10.2013),manseluk (24.02.2015),Mario.mare (07.10.2009),Master Chief 117 (07.05.2008),max1de (21.02.2012),mechatronics (29.11.2012),mega_ohm (13.10.2009),Mewo (27.09.2017),Michael-FCK (10.03.2016),MikeJ (30.04.2010),Morpheus_2007 (23.12.2008),mrdoc (16.09.2011),MrEASY (13.02.2012),namenloser_fremder (20.05.2011),NapsterIP88 (13.08.2019),netmaster (17.06.2008),Nico99 (14.09.2010),NightHawk112 (06.02.2009),nixnutz (16.04.2013),NoPro (05.10.2018),Oboil (26.04.2010),Perfektionist (15.08.2008),Petri.f (19.02.2014),Pizza (31.10.2007),PoeHel (15.02.2011),polarbeer (28.08.2013),poweronat (24.02.2009),revilo16 (17.01.2017),richi999 (20.10.2008),Ritter (14.08.2008),Robin (27.02.2008),roman06 (15.02.2014),Rudi (11.10.2011),Rumbler (02.02.2009),s5t#in (14.04.2015),saustift (19.10.2010),schorsch_g (11.07.2014),Schurik (27.06.2016),selly (09.07.2010),sepp (20.07.2010),serpantin (30.05.2011),Sesssko (06.09.2010),Sickone4 (16.04.2013),SIGGI (07.10.2008),simaticanfänger (13.01.2009),skks (01.11.2010),skr (23.03.2016),Smarty160484 (20.10.2013),spezi (14.01.2014),SPS_S5_S7 (16.09.2010),t-poke (31.08.2009),thomass5 (20.09.2010),TobiasA (30.01.2008),Tuffi (22.08.2016),tuneit (23.09.2008),Tylerdurden88 (11.02.2012),tymanis (28.05.2012),underxpressure (16.12.2013),vollmi (09.07.2007),voni_1 (05.12.2009),votto (21.05.2008),waldy (08.12.2009),Werner v. Siemens (22.01.2012),winny-sps (04.04.2007),Wotsen (25.07.2011),xMaXiiMuSx (28.02.2018),zephyr550 (02.11.2010)

  3. #2
    Join Date
    23.06.2009
    Location
    Sassnitz
    Posts
    15,847
    Danke
    1,299
    Erhielt 4,660 Danke für 3,772 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wann man keine Wahl hat:
    • Speicherindirekte Adressierung geht nicht bereichsübergreifend (L W [#Pointer]), sondern nur bereichsintern (L DBW [#Pointer]) - die Bereichskennung muß immer in der Operation angegeben werden, eine eventuell im Pointer enthaltene Bereichskennung wird immer ignoriert.
    • Speicherindirekte Adressierung kann man zur indirekten Adressierung von Timern, Zählern, DB, FB und FC benutzen. Die registerindirekte Adressierung kann das nicht.


    Wenn man die Wahl hat, dann ist speicherindirekte Adressierung besser lesbar und nicht so fehleranfällig, weil der Zugriffs-Speicherbereich und der Variablenname des benutzten Pointers in der Operation steht.

    Speicherindirekte Adressierung eignet sich besonders
    • für Zugriff auf Arrays von einfachen Datentypen oder unstrukturierte Speicherbereiche. (Es kann kein zusätzlicher Versatz angegeben werden, wodurch für jeden Zugriff die genaue Adresse im Pointer stehen muß.)
    • wenn man mit mehreren Pointern arbeitet (z.B. Kopieraktionen), dann spart man sich das dauernde Umladen des AR1-Registers und muß AR2 nicht anfassen, was wiederum vorteilhaft bei der Verwendung in FB ist.

    Registerindirekte Adressierung eignet sich besonders
    • für Zugriff auf Strukturen. Da kann man die Anfangsadresse in einem Adressregister halten und per zusätzlichem Versatz in der Operation auf verschiedene Strukturmember zugreifen, ohne das Adressregister verändern zu müssen.
    • zur Verarbeitung von ANY-Pointern, weil auch bereichsübergreifende Operationen möglich sind, wo die Bereichskennung nicht in der Operation sondern im Pointer enthalten ist.


    Details siehe z.B.: Hilfe zu AWL > Index > Indirekte Adressierung

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Reply With Quote Reply With Quote Speicherindirekte Adressierung vs. Registerindirekte Adressierung  

  4. Folgende 5 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    drmicha (23.02.2015),kp400 (04.09.2019),LUKFRIT (17.04.2018),RGerlach (23.02.2015),Robin (27.03.2015)

Similar Threads

  1. Pointer Zeiger FIFO LIFO aus FAQ von Volker
    By jürgen g in forum Simatic
    Replies: 9
    Last Post: 23.12.2012, 00:53
  2. Zeiger, Pointer
    By redscorpion in forum Simatic
    Replies: 1
    Last Post: 14.07.2011, 08:14
  3. Zeiger/Pointer auf eine Struktur
    By logo78 in forum Simatic
    Replies: 2
    Last Post: 29.03.2009, 18:09
  4. Lifo-Baustein in SCL
    By broesel in forum Simatic
    Replies: 3
    Last Post: 15.05.2007, 09:07
  5. Schieberegister (FIFO) mit Pointer
    By Anonymous in forum Simatic
    Replies: 3
    Last Post: 31.03.2004, 19:55

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •