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

Ergebnis 1 bis 7 von 7

Thema: Pointer für DB erstellen von Multiinstanz

  1. #1
    Registriert seit
    19.06.2015
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich versuche einen aus einem Multiinstanz DB 30 einzelne Bits in einem anderen DB 503 zu verschieben.
    Das herauslesen funktioniert, die CPU meldet jedoch einen internen Fehler bei den Pointer-Zeilen (Adressüberschreitung).
    Das laden in den 503 funktioniert gar nicht.

    Wie würde es richtiger ausschauen? Bin nicht so der Profi wie ihr seht

    Code:
    //--- Pointing first ZM instance
    L P#0.0
    T #ZM_Adr
    
    L 220                                      //Start adresse
    T #ZM_AdrDest
    
    
    L 64
    NEXT: T #ZM_loop
    //*** Starting Loop *********
    
    AUF DB 30                                  // Activ DB Read
    
    L #ZM_Adr
    //---------------------------
    LAR1 
    
    L DBB [AR1,P#25.0]                  // Load DBB 25 Status
    T #ZM_BZM1                          // xxxx xxxx
    L B#16#1                               // 0000 0001
    UW                                        // ---- ---x 25.0 frg
    T #ZM_BZM2                         // 0000 000x
    
    L #ZM_BZM1                         // xxxx xxxx
    L B#16#80                          // 1000 0000 
    UW                                        // x--- ---- 25.7 SEV
    SRW 5                                    // ---- -x--
    L #ZM_BZM2                     // 0000 000x
    OW 
    T #ZM_BZM2                         // 0000 0x0x
    
    L DBB [AR1,P#24.0]                // Load DBB 24 Status
    T #ZM_BZM1                       // xxxx xxxx
    L B#16#1                            // 0000 0001
    UW                                  // ---- ---x 24.0 SER
    SLW 1                                // ---- --x-
    L #ZM_BZM2                         // 0000 0x0x
    OW 
    T #ZM_BZM2                        // 0000 0xxx
    
    L #ZM_BZM1                           // xxxx xxxx
    L B#16#8                           // 0000 1000
    UW                                   // ---- x--- 24.3 STO
    L #ZM_BZM2                      // 0000 0xxx
    OW 
    T #ZM_BZM2                       // 0000 xxxx
    
    //--- Pointing next ZM instance
    
    L P#26.0                               // Offset
    L #ZM_Adr                           // Adr ZM act
    +D                                    // Adr +Offset
    T #ZM_Adr                             //=Adr ZM next
    
    
    AUF DB 504                            //Transfer to DB
    L #ZM_BZM2
    T DBB [#ZM_AdrDest]
    L P#1.0
    L #ZM_AdrDest
    +I 
    
    // Oder:
    // L #ZM_AdrDest
    // LAR1 
    // AUF DB 504
    // L #ZM_BZM2
    // T DBB [AR1,P#1.0] 
    
    
    
    //*** Ending Loop ************
    L #ZM_loop
    LOOP NEXT

    Wäre wirklich dankbar wenn ihr weiter helfen könntet
    Zitieren Zitieren Pointer für DB erstellen von Multiinstanz  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.639
    Danke
    397
    Erhielt 2.379 Danke für 1.985 Beiträge

    Standard

    Hallo,
    ich muss gestehen, dass ich aus deinem Code nicht so recht schlau werde.
    Beschreib doch mal in Worten, was du von wo laden willst und wohin es dann gespeichert werden soll.
    Vielleicht dann auch noch, was so zwischendrin damit passieren soll ...

    (ich befürchte, dass es dann von der Code-Umsetzung ggf. ganz anders aussehen würde ...)

    Gruß
    Larry

  3. #3
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.274
    Danke
    439
    Erhielt 662 Danke für 499 Beiträge

    Standard

    Also wenn ich deinen Code richtig dechiffriere, dann möchtest du...
    Instanz-Bit24.0 auf DbByte-Bit0.1
    Instanz-Bit24.3 auf DbByte-Bit0.3
    Instanz-Bit25.0 auf DbByte-Bit0.0
    Instanz-Bit25.7 auf DbByte-Bit0.2
    ...schreiben.

    Das ganze dann 64mal (laut Wert im Schleifenzähler).
    Wie kommst du da auf 30Bits, ich zähl da mehr.

    Ist dass der Grund warum du beim Laden eine Adressüberschreitung bekommst?
    Die höchste Anfangsadresse für eine Instanz auf welche du hier zugreifen würdest wäre 1638.
    Ist dein DB so lang?

    Dass das Schreiben in den DB503 (in deinem Code steht 504!!!) nicht klappt ist klar.
    Sowohl L DBB[Variable] als auch der Weg über AR1 verlangen Pointer.
    Am Anfang lädst du ZM_AdrDest allerdings nur mit 220dez und nicht mit P#220.0
    Wenn du mit 220dez arbeitest enspricht das einem P#27.4
    Ein Byte-Zugriff auf irgendwas mit einem Bitwert im Pointer führt zum Fehler.

    Jetzt zu den ganzen Bit-Geschubse (SRW,SLW).
    Du könntest doch gleich direkt die Bits die du willst lesen und schreiben.
    Nicht getestet, könnte aber ungefähr so aussehen:
    Code:
    L      P#0.0                      //Startadresse Instanz QuellDB
    T      #ZM_Adr
    L      P#220.0                      //Startadresse Bytes im ZielDB
    T      #ZM_AdrDest
    
    L     64
    NEXT: T #ZM_loop
    
    LAR1  #ZM_Adr
    AUF   DB30                        //Bits aus Quell-DB lesen
    U     DBX[AR1,P#24.0]
    =     #Bit24_0
    U     DBX[AR1,P#24.3]
    =     #Bit24_3
    U     DBX[AR1,P#25.0]
    =     #Bit24_0
    U     DBX[AR1,P#25.7]
    =     #Bit24_3
    
    LAR1  #ZM_AdrDes                 //Bits auf Ziel-DB schreiben
    AUF   DB504                           //Oder 503?
    U     #Bit24_0
    =     DBX[AR1,P#0.1]
    U     #Bit24_3
    =     DBX[AR1,P#0.3]
    U     #Bit25_0
    =     DBX[AR1,P#0.0]
    U     #Bit25_7
    =     DBX[AR1,P#0.2]
    
    L     #ZM_Adr                   //Adressen hoch zählen  
    L     P#26.0                   
    +I
    T     #ZM_Adr
    
    L     #ZM_AdrDes  
    L     P#1.0
    +I
    T     #ZM_AdrDes
       
    L     #ZM_loop
    LOOP  NEXT
    Zu guter letzt. Zu Beführworten ist solch ein Bytegeschubse/Speichergestochere generell nicht.
    Es ist meist undurchsichtig, fehleranfällig, schwer wartbar und hat keine Querverweise.
    Wenn sich irgendwo durch Änderungen mal Adressen verschieben, dann geht alles in die Hose.

    Wäre es in diesem Fall nicht einfacher dass du dir dein Bytes innerhalb des Bausteins zusammenflickst zu die Instanz gehört und diese dann per OUT direkt und vor allem symbolisch an das Zielbyte im DB503 schreibst.

    Du kannst auch das innerhalb des Bausteins generierte Byte in der Instanz parken und dieses dann ohne Schleife und Adressgemurkse mit einfachen MOVE-Befehlen ans Ziel verschieben.
    64 Moves (L/T) sind in AWL schnell getippt.

    Das wäre für diejenigen welche dir an dem Projekt nachfolgen sicher leichter zu durchschauen.
    Geändert von RONIN (10.08.2016 um 20:51 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.639
    Danke
    397
    Erhielt 2.379 Danke für 1.985 Beiträge

    Standard

    @Ronin:
    Respekt ...


    @TE:
    Wenn der Quell- und der Ziel-Datenbereich identisch aussehen dann könnte auch BlockMove noch ein Ansatz sein. Ich würde aber dennoch gerne die verbale Beschreibung sehen ...

  5. #5
    Deadmau5 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    19.06.2015
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Sorry für die Verspätung, beim letzen Mal ist mein Antwort-Post sicher nicht "durchgegangen"

    Danke sehr für die perfekte Antwort! Ich habe nichts mehr an dem Code ändern müssen.
    Der war um einiges einfacher und besser und hat mir sehr weitergeholfen.

    "Die höchste Anfangsadresse für eine Instanz auf welche du hier zugreifen würdest wäre 1638.
    Ist dein DB so lang?"
    ->Ja der ist so lang.

    "Sowohl L DBB[Variable] als auch der Weg über AR1 verlangen Pointer."

    ->Wieso dieser Teil nicht funktioniert kann ich noch nicht verstehen, ich benutze doch Pointer?
    AUF DB 504
    L #ZM_BZM2
    T DBB [#ZM_AdrDest]
    L P#1.0
    L #ZM_AdrDest
    +I

  6. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    10.800
    Danke
    885
    Erhielt 3.162 Danke für 2.562 Beiträge

    Standard

    Zitat Zitat von Deadmau5 Beitrag anzeigen
    ->Wieso dieser Teil nicht funktioniert kann ich noch nicht verstehen, ich benutze doch Pointer?
    AUF DB 504
    L #ZM_BZM2
    T DBB [#ZM_AdrDest]
    L P#1.0
    L #ZM_AdrDest
    +I
    Du benutzt den dezimalen Zahlenwert 220 als Pointer --> das entspricht P#27.4 --> das ist eine "krumme" Adresse, auf der kein DBB anfangen kann.
    Um den Dezimalwert 220 als Pointer P#220.0 zu benutzen, muß die 220 mit 8 multipliziert werden, was man am cleversten durch 3 Bitstellen nach links shiften macht (SLD 3).

    Zitat Zitat von RONIN Beitrag anzeigen
    Sowohl L DBB[Variable] als auch der Weg über AR1 verlangen Pointer.
    Am Anfang lädst du ZM_AdrDest allerdings nur mit 220dez und nicht mit P#220.0
    Wenn du mit 220dez arbeitest enspricht das einem P#27.4
    Ein Byte-Zugriff auf irgendwas mit einem Bitwert im Pointer führt zum Fehler.
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #7
    Deadmau5 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    19.06.2015
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich hatte den Fehler weggemacht und auf P#220 geändert, es wurde aber nichts im DB504 geschrieben. (db503 war ein Tippfehler von mir)
    Wenn dieser Programmteil eurer Meinung funktionieren sollte, dann hatte sich vielleicht damals noch irgendwo einen Fehler eingeschlichen

Ähnliche Themen

  1. Step 7 Rolladen Multiinstanz-FB für S7
    Von reinip im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 06.10.2013, 12:55
  2. IN:Pointer in Multiinstanz
    Von mrdoc im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 08.02.2013, 18:54
  3. Multiinstanz Vergleicher für Integer
    Von bluebird277 im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 03.04.2009, 19:36
  4. Antworten: 12
    Letzter Beitrag: 18.09.2007, 08:45
  5. Pointer für lokale Variablen erstellen
    Von neuer_user im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 10.10.2006, 12:02

Stichworte

Lesezeichen

Berechtigungen

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