Step 7 Bitzugriff AWL

Limette

Level-2
Beiträge
282
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen,

Bei dem Code unten "kopiere" ich das Bit DB100.DBX0.0 auf das BOOL "Bitzuweisung", korrekt?
Meine Frage, wie würde es genau in die andere Richtung gehen? Also Bitzuweisung in den DB kopieren. Danke im Voraus.

Code:
      AUF   DB [100]

      L     0              //Byte_Nummer
      SLD   3
      L     0              //Bit_Nummer
      +D    
      LAR1  
      =     Bitzuweisung
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also tutti kompletti:
Code:
      AUF   DB [100]

      L     0              //Byte_Nummer
      SLD   3
      L     0              //Bit_Nummer
      +D    
      LAR1  
      U DBX [ AR1 , P#0.0 ]
      =     Bitzuweisung

Unter andersherum?

L Bitzuweisung
....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, Harald hat natürlich recht.
Wie viele Leute hab ich schon über solchen Codepassagen verzweifeln sehen...
(mich eingeschlossen...)

Code:
AUF   DB [100]
L     0              //Byte_Nummer
SLD   3
L     0              //Bit_Nummer
+D    
LAR1  
U     DB101.DBX324.7     //Bitzuweisung
=     DBX [ AR1 , P#0.0 ]

Du darfst jetzt gerne überlegen wieso. :rolleyes:
 
nein.

bis hierhin ist der db100 auf
U DB101.DBX324.7 //Bitzuweisung
ab hier ist der db 101 auf

= DBX [ AR1 , P#0.0 ]
also wird das bit des db101.dbx... beschrieben
 
Zuviel Werbung?
-> Hier kostenlos registrieren
dir sei gedankt Volker. :)

Andere Frage:
Ich würde gerne die Adresse die an einem Eingangs ANY anliegt in eine Temp ANY kopieren um mit der am Eingangs ANY anliegende Adresse einen SFC14 als "Record" zu bestücken. Aber es klappt nicht, es kommt Fehler 837F. Wenn ich an "Record" DB100.dbb0 direkt auflege, ist der Fehler weg.


Code:
L     P##EingangsANY // DB100.dbb0 aufgelegt
      LAR1  
      L     LD [AR1,P#0.0]
      T     #_Puffer1
      L     LD [AR1,P#4.0]
      T     #_Puffer2
      L     LW [AR1,P#8.0]
      T     #_Puffer3

      L     P##_TempAny
      LAR1  
      L     #_Puffer1
      T     LD [AR1,P#0.0]
      L     #_Puffer2
      T     LD [AR1,P#4.0]
      L     #_Puffer3
      T     LW [AR1,P#8.0]

      CALL  "DPRD_DAT"
       LADDR  :=2
       RET_VAL:=#_ret_val
       RECORD :=#_TempAny
      NOP   0
 
habs hinbekommen, so gehts wohl. :)

Code:
      L     P##EingangsANY         // IA_DATA ist IN- Variable vom Typ ANY
      LAR1                                 // AR1 zeigt nun auf die Anfangsadr. der Eingangsvariable
      L     P##_TempANY           // --> source = temporäre Variable vom Typ ANY
      T     #_Puffer1                   // Puffer1 (DWORD) ist ein Zeiger auf source

// copy in-parameter ANY to tmp ANY

      L     D [AR1,P#0.0]
      T     LD [#_Puffer1]              // Byte 0 bis Byte 3 des ANY kopieren
      L     #_Puffer1
      +     32
      T     #_Puffer1                   // zeiger auf temp. ANY um 4 Byte weiterstellen
      L     D [AR1,P#4.0]
      T     LD [#_Puffer1]              // Byte 4 bis Byte 7 des ANY kopieren      
      L     #_Puffer1
      +     32
      T     #_Puffer1                   // zeiger auf temporären ANY um 4 Byte weiterstellen
      L     W [AR1,P#8.0]
      T     LW [#_Puffer1]              // Byte 8 bis Byte 10 des ANY kopieren
 
Huhu zusammen,
passt bei meinem any alles? Ich will 20h(32dec)Byte in db 280h(640dec) ab Startbyte 22h(34) schreiben.
Ich führe im netzwerk danach einen blkmove mit einem 32byte array aus. Es kommt aber ret_val Fehler 8329.



Anhang anzeigen 23287
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
dein IN-ANY ist erstmal nur ein einfacher Pointer, der auf die Adresse im Speicher zeigt, an der der "echte" ANY steht.
Weiter habe ich mir deinen Code nicht angesehen ...

Gruß
Larry
 
Hallo zusammen,

habe gerade gesehen dass die angehängte Datei nicht abrufbar ist. Ich tippe es mal von Hand

"passt bei meinem any alles? Ich will 20h(32dec)Byte in db 280h(640dec) ab Startbyte 22h(34) schreiben.
Ich führe im netzwerk danach einen blkmove mit einem 32byte array aus. Es kommt aber ret_val Fehler 8329.
"
Code:
LAR1      P##_tempany                     0 | 0 | 22 | 2
 
L              LB[AR1,P#0.0]                  0 | 0 | 10 | 22
L              LB[AR1,P#1.0]                  0 | 0 | 2 | 10
L              LW[AR1,P#2.0]                 0 | 0 | 20 | 2
L              LW[AR1,P#4.0]                 0 | 0 | 280 | 20
L              LD[AR1,P#6.0]                 0 | 0 | 84000022 | 280
L              LW[AR1,P#6.0]                 0 | 0 | 8400 | 84000022
L              LW[AR1,P#8.0]                 0 | 0 | 22 | 8400
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe noch immer ein Problem mit deiner Beschreibung des Fehlers. Etwas kompletterer Code könnte (mir) hier helfen ...

Aber grundsätzlich schon mal :
Im ANY (wie auch sonst bei anderen S7-Pointern) wird immer ein Bit-Adresse übergeben. Dein Start-Byte 34 hat also die Bit-Adresse 34*8=272 entspricht Hex 110.
Ansonsten muss in den Bytes deines ANY's folgendes drinstehen :
Byte 0 : 10hex für Siemens
Byte 1 : 2 für Datentyp Byte
Word 2 : 32dez für Anzahl der Wiederholungen
Word 4 : DB-Nummer
DWord 6 : Speicher-Adresse verodert mit hex 84000000 -> in deinem Fall wahrscheinlich hex 84000110

Gruß
Larry
 
ok, danke. ich habe den code nur reinkopiert um zu zeigen was in dem any steht.
ich bekomme ja ein netzwerk danach bei einem blkmove den ret_val Fehler 8329, obwohl ich nur ein 32byte array in den db kopieren will, wo der any draufzeigt.
Deshalb habe ich gedacht, ich frage mal ob bei meinem any alles stimmt.
 
BLKMOVE Fehlercode W#16#8329 = Ausrichtungsfehler im 3. Parameter
--> das meint, die Adresse im ANY an DSTBLK endet nicht auf .0

Code:
//*** ANY für BLKMOV.DSTBLK erstellen: P#DB640.DBX34.0 BYTE 32 ***
      LAR1  P##aDSTBLK                  //Adresse der ANY-Variable aDSTBLK in TEMP

      L     W#16#1002                   //Kennung S7 + Datentyp BYTE
      T     W [AR1,P#0.0]               //ANY: Kennung S7 + Datentyp BYTE

      L     32                          //Länge 32 Byte
      T     W [AR1,P#2.0]               //ANY: Wiederholfaktor

      L     640                         //DB640
      T     W [AR1,P#4.0]               //ANY: DB-Nummer

      L     P#DBX 34.0                  //Adresse Startbyte DBB34
      T     D [AR1,P#6.0]               //ANY: Speicherbereich + Adresse

      CALL  "BLKMOV"
       SRCBLK :=#aSRCBLK                //(oder auch Dein #_TempANY)
       RET_VAL:=#iTEMP_INT
       DSTBLK :=#aDSTBLK                //man könnte aber auch direkt "P#DB640.DBX34.0 BYTE 32" dranschreiben

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Limette:
Du hast ja nicht nur den Code "hineinkopiert" sondern auch noch dahinter geschrieben, was du in den Registern stehen hast.
Wenn du da jetzt meinen Beitrag (oder auch den von Harald) hernimmst dann sollte dir auffallen, dass es da hinsichtlich dessen, was du schreibst und dem, was ich (bzw. Harald) geschrieben habe Diskrepanzen gibt.
Wie geht es jetzt weiter ?

Gruß
Larry
 
Zurück
Oben