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

Ergebnis 1 bis 2 von 2

Thema: Pointer Zeiger FIFO LIFO

  1. #1
    Registriert seit
    07.05.2004
    Ort
    Campbelltown
    Beiträge
    2.437
    Danke
    131
    Erhielt 276 Danke für 86 Beiträge

    Standard


    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
    .
    Angehängte Grafiken Angehängte Grafiken
    Geändert von volker (28.08.2015 um 18:00 Uhr)
    Gegen Schwachsinn, Schwachköpfe und armselige Trittbrettfahrer kann man nicht argumentieren.

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

  2. Folgende 141 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),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 (01.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 (07.03.2014),Gleichstromer (17.09.2014),gordon (02.12.2013),Harry_99 (22.02.2015),Ibaxx (26.09.2007),Ice_T (13.09.2007),Jan (22.01.2012),Javigis (04.08.2016),jokey (05.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),logo78 (18.11.2010),LT Smash (16.08.2011),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),netmaster (17.06.2008),Nico99 (14.09.2010),NightHawk112 (06.02.2009),nixnutz (16.04.2013),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 (15.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 (19.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),zephyr550 (02.11.2010)

  3. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.192
    Danke
    925
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard


    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
    Zitieren Zitieren Speicherindirekte Adressierung vs. Registerindirekte Adressierung  

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

    drmicha (23.02.2015),RGerlach (23.02.2015),Robin (27.03.2015)

Ähnliche Themen

  1. Zeiger, Pointer
    Von redscorpion im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 14.07.2011, 07:14
  2. Zeiger/Pointer auf eine Struktur
    Von logo78 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 29.03.2009, 17:09
  3. Lifo-Baustein in SCL
    Von broesel im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 15.05.2007, 08:07
  4. Schieberegister (FIFO) mit Pointer
    Von Anonymous im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 31.03.2004, 18:55
  5. Any-Zeiger
    Von Anonymous im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 16.10.2003, 20:28

Lesezeichen

Berechtigungen

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