S7 mit SFC20 datenblock in die lokaldaten kopieren

funkdoc

Level-1
Beiträge
491
Reaktionspunkte
44
Zuviel Werbung?
-> Hier kostenlos registrieren
hi

wie ja bekannt dürfen sich beim BLKMOV befehl der quell und zielbereich nicht überlappen.

nun möchte ich zb. einen datenblock aus dem ersten datensatz eines DBs in die temp lokaldaten eines FBs kopieren um sie dann wieder im gleichen DB ab dem zweiten datensatz einzufügen (datenblock um einen satz verschieben).

wie muss ich in der var.deklaration des fbs die tempdaten deklarieren bzw. wie muss so ein befehl aussehen?

grüsse
 
Wenn dein Ziel eine Struktur ist, dann kannst du den Namen schon an den SFC antragen - ansonsten wie gehabt :

P#L4.0 Byte 10 // ab Lokalbyte 4 - 10 Bytes

oder im DB

P#DB10.DBX6.0 Byte 20

Gruß
LL
 
hat sich erledigt... habe einen UDT angelegt mit der gleichen struktur wie der DB.

ne andere frage ist jetzt ob das ganze auch gut geht mit insgesamt 672 Bytes oder geht mir da die cpu in stop?

grüsse
 
Zuletzt bearbeitet:
Also, mit 672 Bytes könnte es im Lokaldatenstack eng werden.

Zum Thema SFC20:
Es ist zwar richtig, dass sich (lt. Handbuch) der Quell- und Zielbereich nicht überlappen dürfen.
Ist die Zieladresse (z.B. innerhalb eines DB) niedriger als die Quelladresse, funktioniert der SFC20 auch bei überlappenden Speicherbereichen. Habe Tests auf verschiedenen S7-300 CPUs gemacht, gab bisher noch keine Probleme damit.

Der Grund, warum das funktioniert, dürfte daran liegen, dass der SFC20 intern Byte- oder Wortweise arbeitet (so genau hab ich es nicht nachvollzogen), ist die Quelleadresse z.B. DBX2.0 und die Zieladresse DBX0.0, so wird auf jeden Fall ohne Datenverfälschung kopiert.


mfg Maxl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi maxl

es geht tatsächlich...

habs nie ausprobiert.. da ja in der hilfe steht dass es sich nicht überlappen soll. steht glaub ich sogar dabei dass bei überlappung dann gar nix kopiert wird.


das ersetzt mir dann einen FIFO auf ziemlich unspektakuläre weise.

danke
von welcher gegend bist du denn?:cool:

grüsse
 
Wenn dein Ziel eine Struktur ist, dann kannst du den Namen schon an den SFC antragen - ansonsten wie gehabt :

P#L4.0 Byte 10 // ab Lokalbyte 4 - 10 Bytes

oder im DB

P#DB10.DBX6.0 Byte 20

Wie sähe es eigentlich aus, wenn ich in einem FB die Daten aus dem statischen Bereich mit dem SFC 20 kopieren möchte?
Irgendwie kam man in einem FB doch an die Nummer des Instanz-DB heran, dann könnte man sich den ANY-Pointer eigentlich selbst zusammensetzen.

Thomas
 
die statischen daten sind ja kein problem...
die werden ja im instanzDB abgelegt.
die kannst du dir direkt abholen... zb. P#DB1.DBX0.0 byte 128

grüsse
 
die statischen daten sind ja kein problem...
die werden ja im instanzDB abgelegt.
die kannst du dir direkt abholen... zb. P#DB1.DBX0.0 byte 128

grüsse

Nur dass ich beim programmieren des FBs den Instanz-DB noch nicht kenne, bzw. gar nicht kennen will. Also die feste DB-Nummer geht so nicht.

Ich werde morgen mal sehen was der Step 7 Manager für eine Adresse anzeigt, wenn ich wie Larry meinte den symbolischen Namen an den SFC eintrage.
Zu hause hab ich nur Version 5.1, da funktioniert das mit den Symbolen noch nicht richtig gut.

Thomas
 
hi tom

du kannst zwar einen FB programmieren ohne kenntnis vom instanzDB...
aber beim aufrufen von einem übergeordneten baustein (OBx,FBx...) heraus musst du sogar selber angeben wie der instanzDB heissen und adresssiert werden soll.

ein instanzDB ist für einen FB unabdingbar.
wenn du also deinen FB eine var.delkaration gibst, kannst du den symbolischen namen des datensatzes angeben.


grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie sähe es eigentlich aus, wenn ich in einem FB die Daten aus dem statischen Bereich mit dem SFC 20 kopieren möchte?
Irgendwie kam man in einem FB doch an die Nummer des Instanz-DB heran, dann könnte man sich den ANY-Pointer eigentlich selbst zusammensetzen.
Der ANY-Pointer sieht dann z.B. so aus
P#DIX20.0 BYTE 20
Da die Instanz-DB Zugriffe mit dem DI-Register erfolgen, ist das so problemlos möglich. Achtung: Dieser Aufruf ist allerdings nicht mehr Multiinstanzfähig.

Alternativ kann man sich den ANY-Pointer auch selber zusammenbauen.

mfg Maxl
 
es geht tatsächlich...

habs nie ausprobiert.. da ja in der hilfe steht dass es sich nicht überlappen soll. steht glaub ich sogar dabei dass bei überlappung dann gar nix kopiert wird.
Die alte Leier: "Probieren geht über studieren"

Ich verwende das gerne z.B. zum sortieren von Datentabellen (wird von hinten nach vorne sortiert). Außerdem kommt bei mir diese Variante bei der Diagnose einer Schrittkette zum Einsatz (die letzten 100 Schrittnummern speichern - die aktuellste liegt am Ende der tabelle)

Noch was zur Datenmenge beim SFC20:
Bisher ist mir keine Beschränkung der Datenmenge bekannt, das Größte was ich bisher probiert habe waren 40k bei einer CPU412-PCI und 8k bei einer 315-2DP (1AF03). Es wirkt sich unangenehm auf die Zykluszeit aus (lässt sich mittels Operationsliste auch schön berechnen) - aber ansonsten gibts kein Problem.

von welcher gegend bist du denn?:cool:
sieht man das nicht an der Fahne?


mfg Maxl
 
Zurück
Oben