BlockMOV SFC20 ???

Kiter11

Level-1
Beiträge
47
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich rufe in meinem FB zwei von "außen" (IN Parameter BLOCK_DB) deklarierte DB´s auf. z.B DB100(IN1) und den DB222(IN2).

Nun möchte ich im Ablauf des FB an verschiedenen Stellen Datenbereiche des DB100 in den DB222 verschieben.

Ich bin auf den Block mov gestoßen, der wenn ich ihm normal den DB100 und DB222 vorgebe auch funktioniert.

Allerdings nicht wenn ich ihm die IN1 und IN2 Parameter gebe.

Hier mal mein Quellcode


Call "BLKMOV"

SRCBLK:= P#IN1.DBx1540.0 Byte 40
RET_VAL:= MW10
DSTBLK:= P#IN2.DBx0.0 Byte 40


Kann mir da einer sagen wie das richtig funktioniert? Der schimpft immer Syntaxfehler.
 
Hallo Kiter,

wenn Du Dir mal die IN-Variablen mit "Variablen beobachten/steuern" ansiehst, steht da nur die Nummer des DB's drin.
Und kein "DB" oder sowas. Daher weiss der SFC 20 nicht auf was er zugreifen soll.
Wenn Du die DB-Nummer unbedingt variabel übergeben musst, musst Du Dir Any-Zeiger bauen. Mit:
Code:
AUF #IN0
L DBNO
kannst Du den übergebenen DB rausfinden und ihn dann in Deinen Zeiger einbauen.

Grüße
Gebs
 
In Anlehnung an Gebs:

So was musst Du dir hier zusammenbasteln, einmal für die Quell- und einmal für die Zieladresse...


Aus der S... - Hilfe
Format des Parametertyps ANYFormat des Parametertyps ANY

STEP 7 speichert die Daten des Parametertyps ANY in 10 Byte. Beim Aufbau eines Parameters vom Typ ANY müssen Sie darauf achten, dass alle 10 Byte belegt sind, da der aufgerufene Baustein den gesamten Inhalt des Parameters auswertet. Wenn Sie beispielsweise in Byte 4 eine DB-Nummer spezifizieren, müssen Sie auch den Speicherbereich in Byte 6 explizit angeben.
STEP 7 verwaltet die Daten von elementaren und zusammengesetzten Datentypen anders als die Daten für Parametertypen.
ANY-Format bei Datentypen
Bei elementaren und zusammengesetzten Datentypen speichert STEP 7 die folgenden Daten:

  • Datentypen
  • Wiederholfaktor
  • DB-Nummer
  • Speicherbereich, in dem die Informationen gespeichert werden
  • Anfangsadresse der Daten

image%5C1_a30typ_22_a_vec.gif

Der Wiederholfaktor kennzeichnet eine Menge des gekennzeichneten Datentyps zum Übergeben durch den Parametertyp ANY. Dadurch können Sie einen Datenbereich angeben und auch Felder und Strukturen in Verbindung mit dem Parametertyp ANY verwenden. STEP 7 kennzeichnet Felder und Strukturen als Anzahl (mit Hilfe des Wiederholfaktors) an Datentypen. Sollen z. B. 10 Wörter übergeben werden, muss beim Wiederholfaktor der Wert 10 und beim Datentyp der Wert 04 eingetragen sein.
Die Adresse wird im Format Byte.Bit gespeichert, wobei die Byteadresse in den Bits 0 bis 2 von Byte 7, in den Bits 0 bis 7 von Byte 8 und in den Bits 3 bis 7 von Byte 9 gespeichert wird. Die Bitadresse wird in den Bits 0 bis 2 von Byte 9 gespeichert.
Beim Nullpointer vom Datentyp NIL sind ab Byte 1 alle Bytes mit 0 belegt.
Nachfolgenden Tabellen zeigen die Codierung der Datentypen bzw. der Speicherbereiche für den Parametertyp ANY.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Du die DB-Nummer unbedingt variabel übergeben musst, musst Du Dir Any-Zeiger bauen. Mit:
Code:
AUF #IN0
L DBNO
kannst Du den übergebenen DB rausfinden und ihn dann in Deinen Zeiger einbauen.



Hallo, danke für die Antworten.

Mit dem oben zitierten Quellcode, kann ich ja die als z.B. INT eingelesene Zahl als DBNummer deklarieren, doch wie rufe ich dann diesen DB auf, wie heißt der denn nach dieser deklaration?
 
Ein Programmbeispiel für die Verwendung des SFC20 BLKMOV mit einem ANY-Zeiger (P#DB100.DBX0.0 BYTE 10) mit einer variablen DB-Nummer findest Du hier:

http://www.sps-forum.de/showthread.php?t=25704

http://www.sps-forum.de/showpost.php?p=185036&postcount=5

http://www.sps-forum.de/showpost.php?p=185037&postcount=6

Gruß Kai

He Kai, gib doch noch 12 Varianten auf den selben Thread an! *ROFL*

PS: Noch ne UraltQuelle: http://www.sps-forum.de/showpost.php?p=25492&postcount=5
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
um das Suchen zu ersparen,

cudos an KAI, von dem die Lösung stammt:

Code:
FUNCTION FC 100 : VOID
TITLE =Werte kopieren
//16
AUTHOR : KAI
FAMILY : SPSFORUM
NAME : 'ANY'
VERSION : 1.0
 
VAR_INPUT
  DB_QUELLE : INT ; 
END_VAR
VAR_TEMP
  DB_REGISTER : WORD ; 
  AR1_REGISTER : DWORD ; 
  ANY_QUELLE : ANY ; 
  RETVAL : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =Register sichern
 
      L     DBNO; // DB-Register
      T     #DB_REGISTER; 
 
      TAR1  #AR1_REGISTER; // AR1-Register
 
NETWORK
TITLE =ANY-QUELLE (ANY)
 
      L     P##ANY_QUELLE; // ANY-QUELLE (ANY)
      LAR1  ; 
 
      L     B#16#10; // Syntax-ID (STEP 7)
      T     B [AR1,P#0.0]; 
 
      L     B#16#2; // Datentyp (BYTE)
      T     B [AR1,P#1.0]; 
 
      L     10; // Anzahl (10)
      T     W [AR1,P#2.0]; 
 
      L     #DB_QUELLE; // DB-Nummer (#DB_QUELLE)
      T     W [AR1,P#4.0]; 
 
      L     P#DBX 0.0; // Bereichszeiger (DBX0.0)
      T     D [AR1,P#6.0]; 
 
NETWORK
TITLE =Werte kopieren
 
      CALL SFC   20 (
           SRCBLK                   := #ANY_QUELLE,
           RET_VAL                  := #RETVAL,
           DSTBLK                   := P#DB110.DBX0.0 BYTE 10);
      NOP   0; 
 
NETWORK
TITLE =Register wiederherstellen
 
      AUF   DB [#DB_REGISTER]; // DB-Register
      LAR1  #AR1_REGISTER; // AR1-Register
 
END_FUNCTION

Um das Ziel auch noch indirekt zu gestalten brauchts nur noch einen zweiten ANY als TEMP-Variable mit der gleichen Vorgehensweise.

dtsclipper
 
Zurück
Oben