Diesen FC verstehe ich nicht

WL7001

Level-2
Beiträge
182
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

beim erstaunten Betrachten eines sehr umfangreichen Projektes habe ich diesen FC gefunden, dessen Arbeitsweise ich nicht verstehe. Das geht über meine Kenntnisse hinaus. Da ich ihn aber recht interessant finde wäre es nett wenn mir mal jemand erklären könnte, wie das Schritt für Schritt abläuft.
Insbesonders die von mir blau gekennzeichneten Zeilen verstehe ich nicht. Die fünf VarInput werden beim Aufruf übergeben.


FUNCTION "DataCopy" : INT
TITLE =Daten kopieren
VERSION : 1.0


VAR_INPUT
DB_Quelle : INT ;
Anfang_Quelle : INT ;
Laenge : INT ;
DB_Ziel : INT ;
Anfang_Ziel : INT ;
END_VAR
VAR_TEMP
TEMP5 : ANY ;
TEMP6 : ANY ;
END_VAR
BEGIN
NETWORK
TITLE =

L W#16#1002;
T LW 0;
L #Laenge;
T LW 2;
L #DB_Quelle;
T LW 4;
L #Anfang_Quelle;
SLD 3;
OD DW#16#84000000;
T LD 6;
NETWORK
TITLE =

L W#16#1002;
T LW 10;
L #Laenge;
T LW 12;
L #DB_Ziel;
T LW 14;
L #Anfang_Ziel;
SLD 3;
OD DW#16#84000000;
T LD 16;
NETWORK
TITLE =

CALL "BLKMOV" (
SRCBLK := #TEMP5,
RET_VAL := #RET_VAL,
DSTBLK := #TEMP6);
BE ;
END_FUNCTION



Wie kommen denn überhaupt Daten in die #Temp5 und #Temp6 ?


Gruß Wilhelm
 
kennst den aufbau eines any pointers??
such mal danach im forum oder les dir die umfangreiche beschreibung von volker in den FAQ durch,dann wirst du es verstehen.
kleiner Tipp.
die LokalWörter sind bei diesen FC wichtig.
Gruß gerhard k
 
Zuviel Werbung?
-> Hier kostenlos registrieren
kennst den aufbau eines any pointers??
such mal danach im forum oder les dir die umfangreiche beschreibung von volker in den FAQ durch,dann wirst du es verstehen.
kleiner Tipp.
die LokalWörter sind bei diesen FC wichtig.
Gruß gerhard k

OK, danke für den Hinweis, habe ich jetzt erst gesehen, das #Temp5 aus LW 0-8 und #Temp6 aus LW 10-18 besteht und so die ANY POINTER für den SFC20 Quelle und Ziel zusammengebaut wird.

Jetzt fehlt mir nur noch die Erklärung für
L W#16#1002; T LW 0
und
OD DW#16#84000000; T LD 6;


Gruß und Danke soweit
Wilhelm
 
81 Eingänge 82 Ausgänge 83 Merker
84 Datenbaustein 85 Instanz-DB 86 Lokal daten (L-Stack)
87 Vorherige Lokal daten

OD DW#16#84000000 // Speicherbereich (hier DB)

Oder Doppelwort
 
Hallo!

Code:
[COLOR=Blue]      L     W#16#1002;     //Lade den Wert 1002 in Hexadezimal (Dieser Wert ist immer gleich)
      T     LW     0;              //Transferiere es in das Lokalwort 0
[/COLOR]      L     #Laenge; 
      T     LW     2; 
      L     #DB_Quelle; 
      T     LW     4; 
      L     #Anfang_Quelle; 
      SLD   3;                   //Bilde Pointer
[COLOR=Blue]      OD    DW#16#84000000;   //Oderverknüpfung mit dem Hexwert damit der Pointer für DBX (Bereichsübergreifend) formatiert wird
      T     LD     6;            //Transferiere Pointer in das Lokaldoppelwort 6
[/COLOR]NETWORK
TITLE =

[COLOR=Blue]      L     W#16#1002; 
      T     LW    10; 
[/COLOR]      L     #Laenge; 
      T     LW    12; 
      L     #DB_Ziel; 
      T     LW    14; 
      L     #Anfang_Ziel; 
      SLD   3; 
[COLOR=Blue]      OD    DW#16#84000000; 
      T     LD    16; 
[/COLOR]NETWORK
TITLE =

      CALL "BLKMOV" (
           [COLOR=Blue]SRCBLK                   := #TEMP5,[/COLOR]
           RET_VAL                  := #RET_VAL,
           [COLOR=Blue]DSTBLK                   := #TEMP6);[/COLOR]
      BE    ; 
END_FUNCTION

Da habe ich auch mal ein Beispiel gemacht:
http://www.sps-forum.de/showpost.php?p=80794&postcount=13

Das ist mit indirekter Adressierung so das nicht auf die Lokaldaten direkt zugegriffen werden muss.

godi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
L W#16#1002; T LW 0
LW 0 besteht aus LB 0 und LB 1

Code:
  L     B#16#[COLOR=yellowgreen]10[/COLOR]                   //10h für s7
           T     [COLOR=red]LB     0[/COLOR]
           [COLOR=skyblue]L     B#16#[COLOR=yellowgreen]02[/COLOR]                   //Typ BYTE[/COLOR]
[COLOR=skyblue]          T     [/COLOR][COLOR=red]LB     1[/COLOR]
der Code ist ein Auschnitt von Volkers Beschreibung aus dem FAQ

Hoffe jetzt ist es leichter verständlich.
Gruß gerhard K
 
Zuletzt bearbeitet:
Code:
[COLOR=#0000ff] L     W#16#1002;     //Lade den Wert 1002 in Hexadezimal (Dieser Wert ist immer gleich)[/COLOR]

@ godi
Ist der wirklich immer gleich??

1002 sind die letzten 2 Stellen nicht abhängig vom Datentyp oder
steh ich jetzt auf der Leitung??
 
Zuletzt bearbeitet:
Danke euch beiden für die Erklärungen. Ist ja ganz schön tricky, jedenfalls für mich. Wo würdet ihr denn die Programmierkenntnisse des Erstellers auf einer Skala von 0 bis 10 einstufen ? Damit ich mal eine Ahnung kriege, wo ich denn dann so ungefähr stehe, denn darauf wäre ich nicht gekommen :)

Gruß Wilhelm
 
Code:
[COLOR=#0000ff] L     W#16#1002;     //Lade den Wert 1002 in Hexadezimal (Dieser Wert ist immer gleich)[/COLOR]
@ godi
Ist der wirklich immer gleich??

1002 sind die letzten 2 Stellen nicht abhängig vom Datentyp oder
steh ich jetzt auf der Leitung??

Nein du stehst nicht auf der Leitung. Da habe ich mich falsch ausgedrückt.
Wie du sagst die 10 sind immer gleich und die 02 ist der Datentype (in diesem Fall Byte)
In dem link den ich im oberen Beispiel eingefügt habe stehen die genauen werte.
 
Wo würdet ihr denn die Programmierkenntnisse des Erstellers auf einer Skala von 0 bis 10 einstufen ?

wie bereits gesagt wurde ist es nichts besonderes, ich finde den code schlampig! das beispiel von godi wo der pointer ohne direkten zugriff auf die lokaldaten aufgebaut wird finde ich viel besser.

besonderer kentnisse sind hierfür nicht erforderlich, im prinzip liefert die hilfe zum any-pointer von s7 bereits 90% des codes als beispiel.

viel knowhow braucht der code nicht, kommentiert ist schlecht (sonst hättest du dir die frage hier sparen können), und der direkte zugriff auf datenbereiche wird in meiner firma mit dem tod bestraft...
 
Zurück
Oben