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

Ergebnis 1 bis 10 von 10

Thema: Fehler in variablem ANY-Pointer

  1. #1
    Registriert seit
    15.12.2007
    Beiträge
    712
    Danke
    84
    Erhielt 105 Danke für 94 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich habe mir einen variablen ANY-Pointer gebaut.Anscheinend ist dort aber noch ein Fehler vorhanden den ich leider nicht finde.
    Auf jeden Fall gibt der Blockmove mir am RET_VAL eine 8128hex raus, was mir schon sagt das Fehler irgendwo im Zeiger sein muss.


    Code:
      LAR1  P##BITS_OUT
    
          L     B#16#10                     // Syntax-ID laden
          T     LB [AR1,P#0.0]              // in ANY-Pointer tranferieren
    
          L     B#16#1                      // Datentyp BOOL laden
          T     LB [AR1,P#1.0]              // in ANY-Pointer transferieren
    
          L     32                          // Länge der zu übertragenen Daten
          T     LW [AR1,P#2.0]              // in ANY-Pointer tranferieren
    
          L     #DEST_DB                    // Nummer des Ziel-DB
          T     LW [AR1,P#4.0]              // in ANY-Pointer tranferieren
    
          L     B#16#84                     // Speicherbereich DB laden
          T     LB [AR1,P#6.0]              // in ANY-Pointer transferieren
    
          L     B#16#0                      // Startbit 0 laden
          T     LB [AR1,P#7.0]              // in ANY-Pointer transferieren
    
          L     #Start_Sim_Adr              // Lade Startadresse
          T     LW [AR1,P#8.0]              // in ANY-Pointer tranferieren
    
      CALL  "BLKMOV"
           SRCBLK :=#BITS_OUT
           RET_VAL:=#Return_Val
           DSTBLK :=P#L 30.0 BOOL 32
    
          SPA   OUT
    In #DEST_DB steht aktuell der Wert 1219, in #Start_Sim_Adr eine 10.

    Ich hätte gerne das im Zeiger P#DB1219.DBX10.0 BOOL 32 steht.
    Zitieren Zitieren Fehler in variablem ANY-Pointer  

  2. #2
    Registriert seit
    13.03.2008
    Beiträge
    7
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Dotzi´s Eintrag beachten. sorry bin grad beim Multitaskingversuch gescheitert.
    Geändert von fr13th (10.02.2010 um 11:19 Uhr)

  3. #3
    Registriert seit
    20.11.2006
    Ort
    Hamburg
    Beiträge
    225
    Danke
    35
    Erhielt 35 Danke für 32 Beiträge

    Standard

    Hallo,

    dein Start_Sim_Adr muss um 3 Bit nach links gschoben werden. Dadurch kann auch eine Bit-Adresse adressiert werden.
    Code:
          L     10
          SLD   3
          T     #Start_Sim_Adr
    Gruß

  4. #4
    Registriert seit
    18.10.2007
    Beiträge
    127
    Danke
    1
    Erhielt 15 Danke für 13 Beiträge

    Standard

    Der Fehler liegt in der Startadresse bei P#8.0, die muss mit SLD 3 auf Bytegrenzen gesetzt werden. denn der Pointer adressiert in den Bits 0..2 die Bitadresse.

    Ich würde das Doppelwort 6..9 anders adressieren, da im Byte 7 noch die Startadresse steckt würde ich durch Maskieren und verodern den Speicherbereich in Byte 6 einpflanzen.

    Schau mal im Simatic Manager in der Hilfe nach unter "Format des Parametertyps ANY"

    Gruß Rolf

    EDIT:

    Da war ich wohl zu spät, Dotzi hats richtig beschrieben.
    Der Fehler ist trotz allem auch bei der Variante von fr13th vorhanden
    Nach den fr13th meinen Post gelsen hat hat er seinen Code korrigiert und den nächten Fehler eingebaut sein "L 8" vor dem "SLW 3" ist falsch und mehr. Es braucht nur das SLW 3 vor dem Transferieren in P8.0
    Geändert von R.Blum (10.02.2010 um 11:21 Uhr)

  5. #5
    Registriert seit
    13.03.2008
    Beiträge
    7
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    *bitte löschen*
    Geändert von fr13th (10.02.2010 um 11:20 Uhr)

  6. #6
    Astralavista ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    15.12.2007
    Beiträge
    712
    Danke
    84
    Erhielt 105 Danke für 94 Beiträge

    Standard

    Danke, das hat mir sehr weitergeholfen!!!

    Habe das ganze jetzt so gelöst:

    Code:
      LAR1  P##BITS_OUT
    
          L     B#16#10                     // Syntax-ID laden
          T     LB [AR1,P#0.0]              // in ANY-Pointer tranferieren
    
          L     B#16#1                      // Datentyp BOOL laden
          T     LB [AR1,P#1.0]              // in ANY-Pointer transferieren
    
          L     32                          // Länge der zu übertragenen Daten
          T     LW [AR1,P#2.0]              // in ANY-Pointer tranferieren
    
          L     #DEST_DB                    // Nummer des Ziel-DB
          T     LW [AR1,P#4.0]              // in ANY-Pointer tranferieren
    
          L     P#DBX 0.0                   // Startzeiger laden
          L     #Start_BOOL_Adr             // Startadresse laden
          SLD   3                           // Um 3 Bits verschieben
          +D                                // Startadresse mit Startzeiger addieren
          T     LD [AR1,P#6.0]              // in ANY-Pointer transferieren
    
    
     CALL  "BLKMOV"
           SRCBLK :=#BITS_OUT
           RET_VAL:=#Return_Val
           DSTBLK :=P#L 30.0 BOOL 32
    
          SPA   OUT
    Nicht wundern, die Start_Sim_Adr habe ich in Start_BOOL_Adr umbenannt.
    So scheint es zu funktionieren. Oder kann man da noch etwas verbessern?

  7. #7
    Registriert seit
    18.10.2007
    Beiträge
    127
    Danke
    1
    Erhielt 15 Danke für 13 Beiträge

    Standard

    Zitat Zitat von Astralavista Beitrag anzeigen
    Danke, das hat mir sehr weitergeholfen!!!

    Habe das ganze jetzt so gelöst:

    Code:
      LAR1  P##BITS_OUT
     
          L     B#16#10                     // Syntax-ID laden
          T     LB [AR1,P#0.0]              // in ANY-Pointer tranferieren
     
          L     B#16#1                      // Datentyp BOOL laden
          T     LB [AR1,P#1.0]              // in ANY-Pointer transferieren
     
          L     32                          // Länge der zu übertragenen Daten
          T     LW [AR1,P#2.0]              // in ANY-Pointer tranferieren
     
          L     #DEST_DB                    // Nummer des Ziel-DB
          T     LW [AR1,P#4.0]              // in ANY-Pointer tranferieren
     
          L     P#DBX 0.0                   // Startzeiger laden
          L     #Start_BOOL_Adr             // Startadresse laden
          SLD   3                           // Um 3 Bits verschieben
          +D                                // Startadresse mit Startzeiger addieren
          T     LD [AR1,P#6.0]              // in ANY-Pointer transferieren
     
     
     CALL  "BLKMOV"
           SRCBLK :=#BITS_OUT
           RET_VAL:=#Return_Val
           DSTBLK :=P#L 30.0 BOOL 32
     
          SPA   OUT
    Nicht wundern, die Start_Sim_Adr habe ich in Start_BOOL_Adr umbenannt.
    So scheint es zu funktionieren. Oder kann man da noch etwas verbessern?

    Sehr gute Lösung, damit vermeidest Du die angabe des Speicherbereiches, weil der bereits implizit im Startzeiger steht.

    Den Zielpointer würde ich nicht absolut angeben, sondern als Symobol wie: #Dest_Any vom Datentyp Any. Damit vermeidest Du Adresskonflikte, wenn Du den Baustein mal änderst.

    Es gehört nicht zum guten Ton, Lokalvariablen Absolut anzusprechen.

    Gruß Rolf

  8. #8
    Registriert seit
    20.11.2006
    Ort
    Hamburg
    Beiträge
    225
    Danke
    35
    Erhielt 35 Danke für 32 Beiträge

    Standard

    also bei mir würde das so aussehen:

    Code:
      LAR1  P##BITS_OUT
     
          L     B#16#10                     // Syntax-ID laden
          T     LB [AR1,P#0.0]              // in ANY-Pointer tranferieren
     
          L     B#16#1                      // Datentyp BOOL laden
          T     LB [AR1,P#1.0]              // in ANY-Pointer transferieren
     
          L     32                          // Länge der zu übertragenen Daten
          T     LW [AR1,P#2.0]              // in ANY-Pointer tranferieren
     
          L     #DEST_DB                    // Nummer des Ziel-DB
          T     LW [AR1,P#4.0]              // in ANY-Pointer tranferieren
     
          L     #Start_BOOL_Adr             // Startadresse laden
          SLD   3                           // Um 3 Bits Bits verschieben
          T     LD [AR1,P#6.0]              // in ANY-Pointer transferieren
     
        L     B#16#84                     // Speicherbereich:=Datenbasustein
        T     LB [AR1,P#6.0]              // in Any-Pointer transferieren      
     
     
     CALL  "BLKMOV"
           SRCBLK :=#BITS_OUT
           RET_VAL:=#Return_Val
           DSTBLK :=P#L 30.0 BOOL 32
     
          SPA   OUT

  9. #9
    Registriert seit
    18.10.2007
    Beiträge
    127
    Danke
    1
    Erhielt 15 Danke für 13 Beiträge

    Standard

    Zitat Zitat von Dotzi Beitrag anzeigen
    also bei mir würde das so aussehen:

    Code:
      LAR1  P##BITS_OUT
     
          L     B#16#10                     // Syntax-ID laden
          T     LB [AR1,P#0.0]              // in ANY-Pointer tranferieren
     
          L     B#16#1                      // Datentyp BOOL laden
          T     LB [AR1,P#1.0]              // in ANY-Pointer transferieren
     
          L     32                          // Länge der zu übertragenen Daten
          T     LW [AR1,P#2.0]              // in ANY-Pointer tranferieren
     
          L     #DEST_DB                    // Nummer des Ziel-DB
          T     LW [AR1,P#4.0]              // in ANY-Pointer tranferieren
     
          L     #Start_BOOL_Adr             // Startadresse laden
          SLD   3                           // Um 3 Bits Bits verschieben
          T     LD [AR1,P#6.0]              // in ANY-Pointer transferieren
     
       L     B#16#84                     // Speicherbereich:=Datenbasustein
       T     LB [AR1,P#6.0]              // in Any-Pointer transferieren      
     
     
     CALL  "BLKMOV"
           SRCBLK :=#BITS_OUT
           RET_VAL:=#Return_Val
           DSTBLK :=P#L 30.0 BOOL 32
     
          SPA   OUT

    Du siehst doch ein dass die Version vom TE eleganter ist, oder?

    Gruß Rolf

  10. #10
    Registriert seit
    20.11.2006
    Ort
    Hamburg
    Beiträge
    225
    Danke
    35
    Erhielt 35 Danke für 32 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wenn es für dich so eleganter ist, dann ist es wohl so.

    Ich benutze als Grundlage Volkers Beitrag http://sps-forum.de/showthread.php?t=12923

    Gruß

Ähnliche Themen

  1. FB mit variablem Adresszugriff
    Von FinalMistery im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 11.07.2011, 11:59
  2. Antworten: 9
    Letzter Beitrag: 17.06.2011, 08:02
  3. Schieberegister mit Array und Variablem Index
    Von bluebird277 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 30.03.2011, 12:05
  4. SFC20 BlockMove mit variablem Quell DB
    Von t-poke im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 02.09.2009, 05:12
  5. Achtung, Fehler beim Pointer bauen!
    Von Ralle im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 27.02.2009, 16:38

Lesezeichen

Berechtigungen

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