SFC20 - Blockmove - indirekt Adressiert ???

DaMeista

Level-2
Beiträge
75
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
:confused: Die Haare raufend wende ich mich mal vertrauensfoll an das Forum:

Ich möchte einen simplen Blockmove machen. Allerdings ist die SOURCE-ADRESS dynamisch.

Ein Auszug aus der AWL:


L #Fachnummer
L P#32.0
*I
LAR1
AUF "Regal"
U DBX [AR1,P#0.1]
SPBN leer

CALL "BLKMOV"
SRCBLK :=dbx[ar1,p#0.0] BYTE 32
RET_VAL:=#RetVal
DSTBLK :="SS_Client_Fachdaten".RBG1.Fachdaten.leer

leer: NOP 0


Warum nimmt er meinen Source-Block nicht an???
Die Meldung des Compilers ist: SYNTAXFEHLER BEI BYTE

Ich muß ihm doch aber sagen wieviele Byte ich übertragen möchte.
Wo versteckt sich der Fehler???

Für euere Hilfe bedanke ich mich schon mal im Voraus!
 
Wer suchet...

Suche mal nach Anypointer bzw. Blockmove hier im Forum.
Ist schon seeehr häufig beschrieben worden.

Gruß
Flinn
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
wie Flinn schon geschrieben hat da war mal ein Baustein im umlauf den kann man mit Int Variablen Indirekt Adressieren. Wenn Du den nicht findest
melde dich mal müßte das ding noch haben.

HDD
 
Die ganze Liebesmüh war vergebens - ich kriegs nicht hin!
Auch die Suche im Forum blieb - zumindest für diesen speziellen Fall - leider erfolglos.

Vielleicht hat doch jemand nen Tipp der mir drauf hilft.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Flinn!
Sehr nett! Allerdings ist mir das für diese Uhrzeit ganz klar zuviel input! ANY-Pointer zu Fuß parametrieren? Davor hab ich mich bislang erfolgreich gedrückt. Nun geht wohl kein Weg mehr dran vorbei :D
Vielen Dank für Deine Mühe!
Morgen früh versuch ich es nochmal.
 
hier ein auszug aus meinem aktuellen projekt:
Code:
// Offset auf Ziehlfeld berechnen
      L     #Schleifenzaehler
      +     -1
      L     #Anzahl_Werte
      *I    
      ITD   
      SLD   3
      L     #Startadresse
      +D    
      T     #Startadresse

      L     #Schleifenzaehler
      L     1
      +I    
      T     #Schleifenzaehler

// Pointer auf das Ziehlfeld ausgeben
      L     P##Pointer_Schritt_Aktuell
      LAR1  
      L     #SyntaxID
      T     LB [AR1,P#0.0]              // Syntax-ID in den Any-Pointer schreiben
      L     #Bereichstyp
      T     LB [AR1,P#1.0]              // Bereichstyp schreiben (B#16#2 = Byte; B#16#4 = Word)
      L     #Anzahl_Werte
      T     LW [AR1,P#2.0]              // Anzahl der zu übertragenden Werte (Byte/Word)
      L     #DB_Nr
      T     LW [AR1,P#4.0]              // DB-Nummer schreiben
      L     #Startadresse
      T     LD [AR1,P#6.0]              // Pointer Startadresse schreiben

// ### angeforderten Datensatz umkopieren
      CALL  "BLKMOV"
       SRCBLK :=#Pointer_Schritt_Aktuell
       RET_VAL:=#retval
       DSTBLK :=#Schritt_Aktuell
 
Hier eine Allgemeine Lösung:
Code:
//Quelldb bestimmen
 [COLOR=black][FONT=&quot]LAR1 P##Quelle                                            //Lade die Anfangsadresse  [/FONT][/COLOR][COLOR=black][FONT=&quot]des ANY–Pointers in AR1.[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]L B#16#10                                                      //Lade die Syntax–ID und[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]T LB [AR1,P#0.0]                                           //transferiere sie in den ANY–Pointer.[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]L B#16#2                                                        //Lade Datentyp Byte und[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]T LB [AR1,P#1.0]                                           //Transferiere es in den ANY–Pointer.[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]L 40                                                                  //Lade 40 Byte und[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]T LW [AR1,P#2.0]                                          //transferiere sie in den ANY–Pointer.[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]L 99                                                                  //Quelle ist der DB99(Beispiel), DBB0[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]T LW [AR1,P#4.0][/FONT][/COLOR]
  [COLOR=black][FONT=&quot]L P#DBX 0.0[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]T LD [AR1,P#6.0][/FONT][/COLOR]

//Ziel Bestimmen
[COLOR=black][FONT=&quot]LAR1 P##ziel                                                 //Lade die Anfangsadresse des ANY–Pointers in AR1.[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]L B#16#10                                                      //Lade die Syntax–ID und[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]T LB [AR1,P#0.0]                                           //transferiere sie in den ANY–Pointer.[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]L B#16#2                                                        //Lade Datentyp Byte und[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]T LB [AR1,P#1.0]                                           //Transferiere es in den ANY–Pointer.[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]L 40                                                                //Lade 40 Byte und[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]T LW [AR1,P#2.0]                                          //Transferiere sie in den ANY–Pointer.[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]L #Dbnr                                                            //Ziel ist der DB(mux), DBB0[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]T LW [AR1,P#4.0][/FONT][/COLOR]
  [COLOR=black][FONT=&quot]L P#DBX 0.0[/FONT][/COLOR]
  [COLOR=black][FONT=&quot]T LD [AR1,P#6.0][/FONT][/COLOR]
und Dann Quelle,bzw. Ziel dem SFC20 übergeben
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und hier den Baustein von Ralle geht mit Int Vari

//------------------------------------------------------------------------
//
//AWL-Quelle - Erzeugt durch:
//WinPLC7
//Version=V3.47
//
//Anzahl der Bausteine: 1
//
//------------------------------------------------------------------------
//
//
//------------------------------------------------------------------------
//
//STL-Source - Generated with:
//WinPLC7
//Version=V3.47
//
//Count of blocks: 1
//
//------------------------------------------------------------------------
//
//
FUNCTION FC112:VOID
TITLE=BLK_Move


AUTHOR:Ralle
FAMILY:SYSTEM
NAME:BLK_MOVE
VERSION:01.01


VAR_INPUT
AnzahlDBB:INT;
QuellDB:INT;
QuellDW:INT;
ZielDB:INT;
ZielDW:INT;
END_VAR

VAR_OUTPUT
RET_VAL: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
L #QuellDW;
SLD 3;
+D;
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
L #ZielDW;
SLD 3;
+D;
T LD [AR1,P#6.0];

CALL SFC20(
SRCBLK:=#Quelle,
RET_VAL:=#RET_VAL,
DSTBLK:=#Ziel);
END_FUNCTION

Ralle Gut gemacht auch wenn Du gerade in Mannheim bist
Wenn Du die Quelle brauchst kurze Info
HDD
 
Zuletzt bearbeitet von einem Moderator:
Danke an euch!!!
Ihr habt mir damit echt weitergeholfen. Die AWL´s haben mich auf den Pfad der Tugend zurück geführt. Ich glaub ich habs verstanden.

Jetzt werde ich mich mal an die Umsetzung wagen.

Nochmals Vielen Dank! Ihr seid spitze!
So ein Forum is ne dolle Erfindung!

Wäre schön, wenn ich mich mal revanchieren könnte - aber dazu braucht es wohl noch ein wenig mehr Erfahrung...

Bis die Tage...
 
Musterlösung

Hallo,
die Musterlösung zum SFC20 gibt's mit ANY-Pointer als PDF beim grünen Riesen-Support unter ID:1118413 im Kap. 9.4
 
Zuviel Werbung?
-> Hier kostenlos registrieren
:confused: Die Haare raufend wende ich mich mal vertrauensfoll an das Forum:

Ich möchte einen simplen Blockmove machen. Allerdings ist die SOURCE-ADRESS dynamisch.

Ein Auszug aus der AWL:


L #Fachnummer
L P#32.0
*I
LAR1
AUF "Regal"
U DBX [AR1,P#0.1]
SPBN leer

CALL "BLKMOV"
SRCBLK :=dbx[ar1,p#0.0] BYTE 32
RET_VAL:=#RetVal
DSTBLK :="SS_Client_Fachdaten".RBG1.Fachdaten.leer

leer: NOP 0


Warum nimmt er meinen Source-Block nicht an???
Die Meldung des Compilers ist: SYNTAXFEHLER BEI BYTE

Ich muß ihm doch aber sagen wieviele Byte ich übertragen möchte.
Wo versteckt sich der Fehler???

Für euere Hilfe bedanke ich mich schon mal im Voraus!

Der ANY-Pointer muss in einer tmpVariablen zusammen gebaut werden.
Bsp. tmpANY_SRCBLK

L P##tmpANY_SRCBLK
LAR1
L B#16#10 // S7ID Anypointer
T B [AR1, P#0.0]
L B#16#02
T B [AR1, P#1.0] // Datentyp 0x02 = Byte
usw. bist Du alle 10 Byte (siehe TIA Hilfe „Zeiger“/ANY-Pointer“
Mit Daten vorgesetzt hast.
Bei der Anfangsdresse wenn sie variabel sein soll das SLD 3 auf Byteadresse des Pointers nicht vergessen und den Speicherbereich 0x84 auf Byte 6 [AR1, P#6.0] als letztes (nach Pointer) transferieren und alles wird gut! (C;


Gesendet von iPhone mit Tapatalk
 
Cool 13 Jahre später...

Da kommt schon ein hauch von Nostalgie auf... ja,ja so war das früher.

Heute im TIA und 1500 ist das alles vollsymbolisch.

Habe die letzten 8 Jahre so nen Pointergebastel nicht mehr gebraucht.
Find ich aber toll das noch Leute sich um unsere Ursprünge bemühen...:-D
 
Cool 13 Jahre später...

Da kommt schon ein hauch von Nostalgie auf... ja,ja so war das früher.

Heute im TIA und 1500 ist das alles vollsymbolisch.

Habe die letzten 8 Jahre so nen Pointergebastel nicht mehr gebraucht.
Find ich aber toll das noch Leute sich um unsere Ursprünge bemühen...:-D

Das geht auch bei TIA ab 14 für die S7 300/400 vollsymbolisch im FUP.
Einfach ein UDT mit den Daten die man BLKMOV en will anlegen.
Eine Variable im DB oder DI mit dem Datentyp des UDT anlegen. Die Variable per Drag&Drop an SRCBLK respektive DSTBLK ziehen und er verarbeitet den AnyPointer im Hintergrund automatisch.


Gesendet von iPhone mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das geht auch bei TIA ab 14 für die S7 300/400 vollsymbolisch im FUP.
Einfach ein UDT mit den Daten die man BLKMOV en will anlegen.
Eine Variable im DB oder DI mit dem Datentyp des UDT anlegen. Die Variable per Drag&Drop an SRCBLK respektive DSTBLK ziehen und er verarbeitet den AnyPointer im Hintergrund automatisch.


Gesendet von iPhone mit Tapatalk

Es ging um dynamische Zuweisungen, also welche, deren Adresszuweisung man zur Laufzeit ändern kann. Dazu muß man den Any-Pointer manipulieren können, sprich selbst "zusammenbauen".
 
Es ging um dynamische Zuweisungen, also welche, deren Adresszuweisung man zur Laufzeit ändern kann. Dazu muß man den Any-Pointer manipulieren können, sprich selbst "zusammenbauen".

Das hatte ich verstanden, vielen ist aber die Möglichkeit der Übernahme des Symbols bei statischen ANY-Pointern garnicht bekannt. Dynamisch würde ich das heute in SCL machen (überlagern) weil es in AWL zu sperrig ist.
Aber da hat jeder seine Präferenzen.


Gesendet von iPhone mit Tapatalk
 
Zurück
Oben