Any Pointer wandern lassen??

Son1317

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich bin grade einen Anny Pointer am bauen aber dieser soll per Takt um ein Byte wandern.
Ich besitze eine Quelle dies ist mein Byte DB40.DBB54 und der Zeiger soll zwischen DB40.DBB0 bis DB40.DBB17 wandern!
Zuerst will ich mir das Byte DBB0 anschauen und die Quelle einfügen. Die Quelle dann verändern und wieder ins DBB0 schreiben.
Dann wird einmal ein Takt gegeben und möchte jetzt das DBB1 anschauen und die Quelle einfügen, dann verändern und wieder ins DBB1 schreiben.

Folgendes habe ich zurzeit geschrieben: (Dies zeigt nur das Lesen des Bytes was in die Quelle geschrieben werden soll)

LAR1 P##ANY_1 //Any_1 ist ein Temp im FC

L B#16#10 //Lade die Syntex ID
T LB[AR1,P#0.0] //transferiere es in den Any-Pointer

L B#16#2 //Lade Datentyp Byte
T LB[AR1,P#1.0] //transferiere es in den Any-Pointer

L 1 //Lade 1 Byte
T LW[AR1,P#6.0] //transferiere es in den Any-Pointer

L 40 //Byte 0 (DB40.DBB0)
T LW[AR,P#4.0]
L P#DBX0.0
T LD[AR1,P#6.0]


LAR1 P##ANY_2 //Any_2 ist ein Temp im FC


L B#16#10 //Lade die Syntex ID
T LB[AR1,P#0.0] //transferiere es in den Any-Pointer

L B#16#2 //Lade Datentyp Byte
T LB[AR1,P#1.0] //transferiere es in den Any-Pointer

L 1 //Lade 1 Byte
T LW[AR1,P#6.0] //transferiere es in den Any-Pointer

L 40 //Byte 54 (DB40.DBB54 = Quelle)
T LW[AR,P#4.0]
L P#DBX54.0
T LD[AR1,P#6.0]

Call "BLKMOV" //SFC20
SRCBLK :=#ANY_1
Ret_val :=MW12
DSTBLK :=#ANY_2


Wie bekomme ich jetzt hin, dass das lesen der Bytes sich pro takt verändert??
 
Du mußt zusätzlich noch eine Variable haben.
Hier mal der Einfachhheit halber ein alteres Bsp., aus dem du dir die entsprechende Passage (rot) leicht rausnehmen kannst.

Code:
FUNCTION "BLK_MOVE" : INT
TITLE =BLK_Move
{ S7_language := '7(1) Deutsch (Deutschland)  11.01.2006  16:20:46' }
AUTHOR : ralle
FAMILY : SYSTEM
NAME : BLK_MOVE
VERSION : 1.1


VAR_INPUT
  AnzahlDBB : INT ;    
  QuellDB : INT ;    
  QuellDW : INT ;    
  ZielDB : INT ;    
  ZielDW : INT ;    
END_VAR
VAR_TEMP
  Quelle : ANY ;    
  Ziel : ANY ;    
END_VAR
BEGIN
NETWORK
TITLE =Blocktransfer zwischen Datenbausteinen


      LAR1  P##Quelle; //Anfangsadresse des ANY-Pointers in AR1 laden


      L     B#(16, 2); //Syntax-ID und Typ: Byte laden
      T     LW [AR1,P#0.0]; 
      L     #AnzahlDBB; //Transferlaenge
      T     LW [AR1,P#2.0]; 
      L     #QuellDB; //Quelle-DB 
      T     LW [AR1,P#4.0]; 
      L     P#DBX 0.0; //Anfangs-DW im Quell-DB
[COLOR=#ff0000]      L     #QuellDW; [/COLOR]
[COLOR=#ff0000]      SLD   3; [/COLOR]
[COLOR=#ff0000]      +D    ; [/COLOR]
      T     LD [AR1,P#6.0]; 


      LAR1  P##Ziel; //Anfangsadresse des ANY-Pointers in AR1


      L     B#(16, 2); //Syntax-ID und Typ: Byte laden
      T     LW [AR1,P#0.0]; 
      L     #AnzahlDBB; //Transferlaenge
      T     LW [AR1,P#2.0]; 
      L     #ZielDB; //Ziel-DB
      T     LW [AR1,P#4.0]; 
      L     P#DBX 0.0; //Anfangs-DW im Ziel-DB
[COLOR=#ff0000]      L     #ZielDW; [/COLOR]
[COLOR=#ff0000]      SLD   3; [/COLOR]
[COLOR=#ff0000]      +D    ; [/COLOR]
      T     LD [AR1,P#6.0]; 


      CALL "BLKMOV" (
           SRCBLK                   := #Quelle,
           RET_VAL                  := #RET_VAL,
           DSTBLK                   := #Ziel);
END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich müsste dies dann ja nur beim Lesen der Bytes einfügen da die Quelle ja immer gleich bleiben soll!


L #QuellDW; <---was muss den da genau drin stehen?
SLD 3;
<---soll wohl um 3 Bits verschieben in meinem Fall währen dies wohl 8 Bits (pro Byte lesen)
+D ;
<-addieren

Ich versteh noch nicht so ganz was in der #QuellDW drin stehen soll!
 
Die Byteadresse!
SLD3 dient dazu aus Byte20 für das AR Byte20.0 (die rechten 3 Bits sind ja die Bitadresse) zu machen.

PS: in Ralle's Fall ist es eine Wortadresse.
 
Sorry Jungs wenn ich das nicht grade auf anhieb verstehe!

L #QuellDB <--dort schreibe ich z.B eine 1 rein da ich jetzt dass Byte 1 mir anschuen möchte
SLD3 <-- Ich denke mal das es wohl so bleiben wird
+D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
PS: in Ralle's Fall ist es eine Wortadresse.

Ne, ich hab das nur etwas ungeschickt benannt, ich kopiere ja auch Byte, also sollte es besser QuellByte heißen. ;) Na ja, ich benutze den Baustein schon so lange...

@Son1317

Schau mal in die FAQ des Forums. Da gibt es schöne Erläuterungen zum Thema Any und Pointer.
 
Sorry Jungs wenn ich das nicht grade auf anhieb verstehe!

L #QuellDB <--dort schreibe ich z.B eine 1 rein da ich jetzt dass Byte 1 mir anschuen möchte
SLD3 <-- Ich denke mal das es wohl so bleiben wird
+D

L #QuellDW //ja, hier eine 1 für Byte 1, später eine 2 für Byte 2 usw.
SLD 3 //aus der Int wird durch verschieben um 3 Bit nach links ein Pointer gemacht. Die rechten 3 Bit enthalten bei einem Pointer die Bitadresse, hier dann automatisch 0. Aus 1 wird also P#1.0
Das wird dann zu P#DBX0.0 addiert, also wird dann P#DBX1.0 eingelesen.
 
@Ralle
danke dir für die Hilfe!
Ich habe mir noch mal grad das Any-Format angeschaut und verstehe jetzt auch warum ich um 3 Bit verschiebe.

Werde mich jetzt auch mal hier weiter als User einbringen:cool::cool:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ne, ich hab das nur etwas ungeschickt benannt, ich kopiere ja auch Byte, also sollte es besser QuellByte heißen. ;) Na ja, ich benutze den Baustein schon so lange...

@Son1317

Schau mal in die FAQ des Forums. Da gibt es schöne Erläuterungen zum Thema Any und Pointer.

Achja, Typ 2, sry habe mich am Text festgehalten.
 
Zurück
Oben