Fehler in variablem ANY-Pointer

Astralavista

Level-1
Beiträge
799
Reaktionspunkte
112
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.
 
Dotzi´s Eintrag beachten. sorry bin grad beim Multitaskingversuch gescheitert.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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ß
 
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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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
 
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
 
[COLOR=red]    L     B#16#84                     // Speicherbereich:=Datenbasustein[/COLOR]
[COLOR=red]    T     LB [AR1,P#6.0]              // in Any-Pointer transferieren[/COLOR]      
 
 
 CALL  "BLKMOV"
       SRCBLK :=#BITS_OUT
       RET_VAL:=#Return_Val
       DSTBLK :=P#L 30.0 BOOL 32
 
      SPA   OUT
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
[COLOR=red]   L     B#16#84                     // Speicherbereich:=Datenbasustein[/COLOR]
[COLOR=red]   T     LB [AR1,P#6.0]              // in Any-Pointer transferieren[/COLOR]      
 
 
 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
 
Zurück
Oben