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

Ergebnis 1 bis 7 von 7

Thema: Frage zum Adressregister

  1. #1
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    also grundsätzlich habe ich mir indirekter Adressierung keine Probleme, aber im Zuge einer Mitarbeiterschulung bin ich nun doch auf einen Punkt gestossen:

    Ich lade in einem FB das Adressregister mit einem Anypointer aus dem TEMP-Bereich.

    Code:
    LAR1 P##ZIEL
    L      B#16#10
    T     LB [AR1, P#0,0]
    Warum kann ich in Zeile 3 beim Transferier-Befehl angeben, dass ich den Akku in das Lokalbyte LB schreiben will.
    Im AR1 steht ja der Speicherbereich B#16#86 ja eigentlich schon drinnen und weiss daher, dass es sich um Lokaldaten handelt- was macht der Compiler oder die CPU mit diesen redundanten Information?
    Oder was passiert eigentlich wenn ich statt LB DBB schreibe?

    Code:
    LAR1 P##ZIEL
    L      B#16#10
    T     B [AR1, P#0,0]
    funktioniert natürlich auch tadellos.

    Code:
    LAR1 P##ZIEL
    L      B#16#10
    T     DBB [AR1, P#0,0]
    funktioniert nicht,

    aber was genau passiert da eigentlich im Hintergrund?
    "DBB" gewinnt gegen AR1-Speicherbereich
    "B" nimmt den AR1-Speicherbereich
    "LB" funktioniert zufällig?

    Gruß
    Karl
    Zitieren Zitieren Frage zum Adressregister  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.180
    Danke
    923
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    Bei bereichsinterner registerindirekter Adressierung wird die eventuell in AR1/AR2 enthaltene Bereichskennung komplett ignoriert und durch den in der Operation angegebenen Bereich ersetzt.

    Die Bereichskennung in AR1/AR2 wird nur bei bereichsübergreifender registerindirekter Adressierung benutzt.

    PS: Beispiel

    Harald
    Geändert von PN/DP (31.03.2015 um 13:09 Uhr)
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    borromeus (31.03.2015)

  4. #3
    borromeus ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    Danke Harald,

    das heisst ja dann, dass

    Code:
    LAR1 P##ZIEL 
    L      B#16#10 
    T     B [AR1, P#0,0]
    nur zufällig funktioniert?

    Edit:
    das Ganze Übungsprogramm hier, es kopiert einfach einen String STR_I auf einen String STR_O:

    Code:
      LAR1  P##STR_I
          TAR1  
          T     #ADR1
    
          LAR1  P##Q
          L     B#16#10
          T     B [AR1,P#0.0]
          L     B#16#13
          T     B [AR1,P#1.0]
          L     W#16#1
          T     W [AR1,P#2.0]
          L     W#16#0
          T     W [AR1,P#4.0]
          L     #ADR1
          T     D [AR1,P#6.0]
    
          LAR1  P##STR_O
          TAR1  
          T     #ADR1
    
          LAR1  P##Z
          L     B#16#10
          T     B [AR1,P#0.0]
          L     B#16#13
          T     B [AR1,P#1.0]
          L     W#16#1
          T     W [AR1,P#2.0]
          L     W#16#0
          T     W [AR1,P#4.0]
          L     #ADR1
          T     D [AR1,P#6.0]
    
          CALL  "BLKMOV"
           SRCBLK :=#Q
           RET_VAL:=#RetVal
           DSTBLK :=#Z
    Geändert von borromeus (31.03.2015 um 14:01 Uhr)

  5. #4
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.626
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    Nein, denn der Bereich (L) wird ja über den Pointer im TEMP-Bereich mitgeladen.
    Gruß
    Michael

  6. Folgender Benutzer sagt Danke zu M-Ott für den nützlichen Beitrag:

    borromeus (31.03.2015)

  7. #5
    borromeus ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    Naja, Harald schreibt:
    "Bei bereichsinterner registerindirekter Adressierung wird die eventuell in AR1/AR2 enthaltene Bereichskennung komplett ignoriert"

  8. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.180
    Danke
    923
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    Die bereichsinterne Adressierung kann nur in den in der Operation angegebenen Bereich zugreifen.
    Bei bereichsübergreifender Adressierung ist in der Operation kein Bereich angegeben, der Bereich wird dem Pointer im Adressregister entnommen (ist flexibler).

    Code:
    L LW [AR1,P#0.0]   //bereichsinterne Adressierung auf TEMP-Bereich
    L W [AR1,P#0.0]    //bereichsübergreifende Adressierung in Bereich aus AR1

    Zitat Zitat von borromeus Beitrag anzeigen
    das heisst ja dann, dass

    Code:
    LAR1 P##ZIEL 
    L      B#16#10 
    T     B [AR1, P#0,0]
    nur zufällig funktioniert?
    Nein, das ist bereichsübergreifende Adressierung (die Operation enthält keine Bereichskennung), die Bereichskennung wird aus AR1 entnommen:
    Wenn #ZIEL an TEMP:2.0 liegt, dann: AR1 = P##ZIEL = P#L2.0
    Wenn #ZIEL an STAT:2.0 liegt, dann: AR1 = P##ZIEL = P#DIX2.0

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.180
    Danke
    923
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von borromeus Beitrag anzeigen
    Code:
    LAR1 P##ZIEL
    L      B#16#10
    T     LB [AR1, P#0,0]
    Warum kann ich in Zeile 3 beim Transferier-Befehl angeben, dass ich den Akku in das Lokalbyte LB schreiben will.
    Du bist der Programmierer, Du kannst angeben was du willst

    Bei der Operation "LAR1 P##ZIEL" wird eine absolute Adresse in AR1 geladen, der AWL-Compiler läßt Dich freundlicherweise die Adresse symbolisch angeben und ersetzt dann im Compilat das Symbol gegen die Adresse. Man kann danach versehentlich oder absichtlich "sicherheitshalber" bei "T (L)B [AR1, P#0,0]" die Bereichskennung L mit angeben oder weglassen - es funktioniert beides.
    Code:
    LAR1 P#L2.0            //Adresse von P##ZIEL mit Bereichskennung L
    L    B#16#10
    T    LB [AR1, P#0.0]   //benutzt Bereichskennung L aus Operation, Bereichskennung in AR1 wird ignoriert
    
    T    B [AR1, P#0.0]    //benutzt Bereichskennung L aus AR1, funktioniert genauso
    Du könntest aber auch schreiben:
    Code:
    LAR1 P#2.0            //Adresse(Offset) ohne Bereichskennung
    L    B#16#10
    T    LB [AR1, P#0.0]  //die Operation muß eine Bereichskennung enthalten!
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    borromeus (31.03.2015)

Ähnliche Themen

  1. Frage zum Adressregister (LAR AUF)
    Von -ASDF- im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 03.07.2012, 10:07
  2. Frage zum Flankenwechsel
    Von linuxluder im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 14.09.2008, 18:39
  3. Frage zum TP170A
    Von MSB im Forum HMI
    Antworten: 3
    Letzter Beitrag: 16.11.2006, 21:33
  4. Frage zum SFB41
    Von bernd67 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 27.09.2006, 16:23
  5. Frage zum FC-Aufruf
    Von Anonymous im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 27.09.2005, 12:01

Lesezeichen

Berechtigungen

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