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

Ergebnis 1 bis 7 von 7

Thema: Anzahl der möglichen Multiinstanzen durch Befehl +AR1 begrenzt.

  1. #1
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.356
    Danke
    455
    Erhielt 695 Danke für 520 Beiträge

    Cool


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute!

    In einem meiner FB's verwende ich die altbekannte Methode der Übergabe eines Datenbereichs an den FB via Any-Pointer.
    Der Pointer wird dann im FB umkopiert, kurz aufbereitet und dann an einen SFC20 übergeben.

    Code:
          TAR1  #SaveAR1                    //Adressregister sichern
          TAR2  #SaveAR2
    
          LAR1  P##P_Data                   //P_Data aus IN-Bereich nach TEMP kopieren
          L     #SaveAR2
          +AR1  
          LAR2  P##P_Data_tmp
    
          L     D [AR1,P#0.0]               //Zeiger kopieren
          T     LD [AR2,P#0.0]
          L     D [AR1,P#4.0]
          T     LD [AR2,P#4.0]
          L     W [AR1,P#8.0]
          T     LW [AR2,P#8.0]
    
          L     LW [AR2,P#2.0]              //Zeiger umwandeln auf Hälfte 1 des Ursprungszeigers
          L     2                           //Enstspricht SX-Bereich des vorangegangenen Bausteins
          /I    
          T     LW [AR2,P#2.0]
    
          LAR1  #SaveAR1                    //Adressregister wiederherstellen
          LAR2  #SaveAR2
    Diese Variante funktioniert tadellos, solange bis der Multiinstanz-Offset beim Aufruf die Zahl 4095 überschreitet. Anscheinend ergibt sich das Problem
    in der Verwendung des Befehls +AR1, welcher einen Offset auf das AR1 aufaddiert. Hier verwendet um den Multiinstanz-Offset aufzuaddieren.

    Anscheinend funktioniert der +AR1 Befehl nur bis zu einem Wert von 4095.
    Die Ursache wird wohl hier liegen: (Auszug aus der Hilfe zum Befehl +AR1)
    "+AR1: Die Ganzzahl (16 Bit), die zum Inhalt von AR1 addiert werden soll, wird durch den Wert in AKKU1-L angegeben. Zulässig sind Werte von -32768 bis +32767"
    Wenn ich das richtig lese wird eine 16Bit Zahl als Pointer interpretiert und dann aufgerechnet.
    16Bit - Vorzeichen -> 15Bit - 3Bit Bitadresse -> 12Bit: 4095

    Soweit eigentlich klar: Meine Frage jetzt nur.... wie könnte man das umgehen? Ich möchte nicht jedes mal eine neuen FB anfangen nur weil mir die Multiinstanzen ausgehen.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!
    Zitieren Zitieren Anzahl der möglichen Multiinstanzen durch Befehl +AR1 begrenzt.  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Versuch mal:

    Code:
          TAR1  #SaveAR1                    //Adressregister sichern
          TAR2  #SaveAR2
    
          L     P##P_Data                   //P_Data aus IN-Bereich nach TEMP kopieren
          L     #SaveAR2
          +D
          LAR1  
          LAR2  P##P_Data_tmp
    
          L     D [AR1,P#0.0]               //Zeiger kopieren
          T     LD [AR2,P#0.0]
          L     D [AR1,P#4.0]
          T     LD [AR2,P#4.0]
          L     W [AR1,P#8.0]
          T     LW [AR2,P#8.0]
    
          L     LW [AR2,P#2.0]              //Zeiger umwandeln auf Hälfte 1 des Ursprungszeigers
          L     2                           //Enstspricht SX-Bereich des vorangegangenen Bausteins
          /I    
          T     LW [AR2,P#2.0]
    
          LAR1  #SaveAR1                    //Adressregister wiederherstellen
          LAR2  #SaveAR2
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. Folgende 2 Benutzer sagen Danke zu Ralle für den nützlichen Beitrag:

    gordon (14.07.2016),RONIN (07.08.2012)

  4. #3
    Avatar von RONIN
    RONIN ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.356
    Danke
    455
    Erhielt 695 Danke für 520 Beiträge

    Standard

    Oh man bin ich blö.....

    Ich war so auf den +AR1 Befehl fixiert. Darauf hätt ich nun wirklich selber kommen können.

    Danke!
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  5. #4
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard

    Wenn man zwei Adressen mit +D addiert muss man bei einer von beiden Adressen die Bereichskennung ausmaskieren, sonst wird die nämlich mitaddiert.

    Ausmaskieren ginge beispielsweise mit
    UD DW#16#FFFFFF

  6. Folgende 3 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    gordon (14.07.2016),Ralle (07.08.2012),RONIN (08.08.2012)

  7. #5
    Registriert seit
    06.10.2003
    Beiträge
    3.414
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Zitat Zitat von RONIN Beitrag anzeigen
    ..Diese Variante funktioniert tadellos, solange bis der Multiinstanz-Offset beim Aufruf die Zahl 4095 überschreitet. Anscheinend ergibt sich das Problem
    in der Verwendung des Befehls +AR1, welcher einen Offset auf das AR1 aufaddiert. Hier verwendet um den Multiinstanz-Offset aufzuaddieren.

    Anscheinend funktioniert der +AR1 Befehl nur bis zu einem Wert von 4095.
    Die Ursache wird wohl hier liegen: (Auszug aus der Hilfe zum Befehl +AR1)

    Wenn ich das richtig lese wird eine 16Bit Zahl als Pointer interpretiert und dann aufgerechnet.
    16Bit - Vorzeichen -> 15Bit - 3Bit Bitadresse -> 12Bit: 4095

    Soweit eigentlich klar: Meine Frage jetzt nur.... wie könnte man das umgehen? Ich möchte nicht jedes mal eine neuen FB anfangen nur weil mir die Multiinstanzen ausgehen.

    Darüber sind andere auch schon drüber gestolpert .

    http://www.sps-forum.de/showthread.p...AR1#post113925
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  8. #6
    Avatar von RONIN
    RONIN ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.356
    Danke
    455
    Erhielt 695 Danke für 520 Beiträge

    Standard

    Ja so muss es dann ausschaun!

    Code:
     TAR1  #SaveAR1                    //Adressregister sichern
          TAR2  #SaveAR2
    
          L     P##P_Data                   //P_Data aus IN-Bereich nach TEMP kopieren#
          L     #SaveAR2
          UD    DW#16#FFFFFF                //Bereichskennung aus SaveAR2 ausmaskieren
          +D    
          LAR1
    Getestet und funktioniert:

    EDIT:

    Code:
          TAR1  #SaveAR1                    //Adressregister sichern
          TAR2  #SaveAR2
    
           LAR1     #SaveAR2               <- Hier steht der Große Wert.... > 4095
           L     P##P_Data                   <- Hier steht der Kleine Wert der da der AnyPointer ja im IN-Bereich des FB's liegt wohl er wohl nie den Wert 4095 überschreiten....  
           +AR1
    So wärs auch gegangen, einfach die beiden Zeilen vertauschen. Manchmal steht mal halt wirklich auf der Leitung.


    EDIT:
    Die wohl beste Variante (z.b. wegen dem Problem ein Beitrag weiter unten) findet man hier
    Any-Pointer über Bausteinschnittstelle
    Geändert von RONIN (03.12.2015 um 07:34 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  9. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.200
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von RONIN Beitrag anzeigen
    EDIT:

    Code:
          TAR1  #SaveAR1                    //Adressregister sichern
          TAR2  #SaveAR2
    
           LAR1     #SaveAR2               <- Hier steht der Große Wert.... > 4095
           L     P##P_Data                   <- Hier steht der Kleine Wert der da der AnyPointer ja im IN-Bereich des FB's liegt wohl er wohl nie den Wert 4095 überschreiten....  
           +AR1
    So wärs auch gegangen, einfach die beiden Zeilen vertauschen.
    Vorsicht: So herum hat man aber nachher in AR1 die Bereichskennung "DB" statt "DI" (*) was nicht ganz richtig ist.
    Beim Eintritt in einen FB zeigen DI- und DB-Register beide auf den Instanz-DB. Der Code funktioniert zunächst.
    Doch macht man die Adress-Berechnung nachdem das DB-Register verändert wurde (**) dann greift man mit "L D [AR1,P#0.0]" nicht mehr auf den FB-Eingangsparameter im IDB zu. (mit "L DID [AR1,P#0.0]" wäre man auf der sicheren Seite)

    (*) weil der Instanzoffset in AR2 die Bereichskennung "DB" hat und +AR1 die in AR1 vorhandene Bereichskennung nicht verändert
    (**) z.B. einfach durch einen vollqualifizierten DB-Zugriff: L "GlobalDB".VariableX

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    Ralle (02.12.2014),RONIN (18.12.2014)

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 22.10.2011, 11:17
  2. Siemens S5 und der Befehl B
    Von joe209 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 08.01.2010, 13:09
  3. FB in S7-Graph begrenzt?
    Von tino2512 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 05.10.2007, 19:38
  4. Anzahl der RT ausreichend??
    Von Krumnix im Forum HMI
    Antworten: 1
    Letzter Beitrag: 15.02.2005, 16:20

Stichworte

Lesezeichen

Berechtigungen

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