BLKMOV mit großen Datenmengen

thommymalta

Level-1
Beiträge
18
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo NG!


Ich habe da mal eine Frage zu BLKMOV bezüglich der maximalen Datenmenge die sich kopieren lässt.


Wenn ich BLKMOV beispielsweise mit P#DB110.DBX0.0 BYTE 2 als Quelle und P#DB120.DBX0.0 BYTE 2 als Ziel angebe sollte dies Problemlos möglich sein.
CALL "BLKMOV"
SRCBLK :=P#DB110.DBX 0.0 BYTE 2
RET_VAL:=#iReturn
DSTBLK :=P#DB120.DBX 0.0 BYTE 2
Was aber passiert, wenn ich wirklich viel Daten kopiere. Beispielsweise etwas wie: P#DB110.DBX0.0 BYTE 200 als Quelle und P#DB120.DBX0.0 BYTE 200 als Ziel.
CALL "BLKMOV"
SRCBLK :=P#DB110.DBX 0.0 BYTE 200
RET_VAL:=#iReturn
DSTBLK :=P#DB120.DBX 0.0 BYTE 200
Die Funktion ist meines Wissens nach nicht asynchron, oder? In dem Cycle wo ich einen großen Kopiervorgang anstoße blockiere ich dann u.U. die CPU bzw. es führt dazu, dass sie sogar ganz aussteigt, oder? Gibt es eine asynchrone Möglichkeit größere Datenmenge von Baustein A zu Baustein B zu kopiere ohne die Daten zu zerlegen und in einer Schleife beispielsweise immer nur 4 BYTE zu kopieren?


Fragend und Danken für eure Hilfe,
Thommy
 
Zuletzt bearbeitet:
Datenschubsen

Hallo thommymalta,

synchron oder asynchron ist doch hier nicht die Frage, oder? Von Interesse ist doch nur, ob die Funktion BlockMove z.B. durch einen Interrupt unterbrechbar ist...
Und wenn Du meinst, 200 Bytes (wie in Deinem Beispiel angegeben) wären eine grosse Datenmenge, naja :confused:

Vielleicht einfach mal ausprobieren, das klappt schon ;)

Gruss

Question_mark
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

thommymalta schrieb:
In dem Cycle wo ich einen großen Kopiervorgang anstoße blockiere ich dann u.U. die CPU bzw. es führt dazu, dass sie sogar ganz aussteigt, oder?

Nur wenn die max. Zykluszeit überschritten wird. Ansonsten denke mal über die Arbeitsweise einer SPS nach ...

Gruss

Question_mark
 
Hallo Thommy,
da die Bytes ja innerhalb des Arbeitsspeichers kopiert
werden, geht das ziemlich schnell:

CPU312: 90 micro + 2 micro / byte

CPU31x: 75 micro + 1,6micro / byte

CPU317: 16 micro + 0,05 micro / byte !

Wenn man also selbst mit der kleinen 312 tausend Byte kopiert,
dauert das 2090 microsec. oder knapp 2,1 ms.

Die 317 braucht für 16000 Byte 816 micro / 0,8 ms.
Im 'Normalfall' wirst du deine CPU mit BLKMOV nicht blockieren.

mfg.
Rolf
 
Hallo Question_mark!
synchron oder asynchron ist doch hier nicht die Frage, oder?
Doch, oder habe ich etwas falsch verstanden? Wenn ich z.B. mit SFC 83 "READ_DBL" Daten aus dem [load memory (Micro Memory Card)] lese, bekomme ich am [BUSY OUTPUT] mitgeteilt, ob der Lesevorgang abgeschlossen ist. Nun habe ich mich halt gefragt, was passiert wenn man etwas meeehr Daten mit BLKMOV ließt und ob es da ein Limit gibt.

Die Funktion ist wohl synchron denke ich. Die CPU geht also in STOP wenn meine vordefinierte maximale [Scan Cycle Monitoring Time] überschritten wird oder ich habe beim sporadischen Lesen größerer Datenmenge sprunghaft ansteigende Zykluszeiten. Bei Zeit sensitiven Applikationen kann das doch zu unerwünschten Effekten führen, oder?

... die Funktion BlockMove z.B. durch einen Interrupt unterbrechbar ist...
Wie genau muss ich mir das vorstellen? Du meinst wenn die CPU auf Grund einer Zykluszeitüberschreitung in STOP geht? Bin mir nicht sicher was du hier meinst.

Dank schon einmal für die schnelle Antwort!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo thommymalta

ich habe mit BLK_MOV schon 8000 DW verschoben und hab dann eben in diesem einen Zyklus eine kurze Zykluszeiterhöhung, was sich aber auf die allgemeine Bearbeitung meines SPS-Programmes nicht wirklich auswirkt. Da gibt es bei Schleifen schon mal mehr Zykluszeit zusammen.
Wie schnell muss denn dein Zyklus sein? <10ms, <1ms?

Grüße Billhearts
 
Hallo Billhearts,

8000 DW auf einer 31x kopieren war vor 9 Jahren durchaus ein Problem, da war man schon froh, wenn man mit der Zykluszeit unter 50ms blieb... ;)

Harald
 
Hat wer eine Idee wie lange es ungefähr dauert 2160 Real Zahlen, also 8640 Bytes zu kopieren?
CPU ist eine 416-3.

Die zweite, für mich wichtigere Frage ist, wieviele Bytes kopiert der BLKMOVE pro Zyklus.
Hintergrund der Frage: der Baustein wird im PCS7 eingebaut. Alle, sagen wir mal 10s kommt ein neuer Wert, dann sollte der BLKMOVE fertig sein. Wenn der Baustein nun alle 1s aufgerufen wird bleiben 10 Zyklen für die Abarbeitung.

PS: klar, ich probier es eh aus. Es macht mich stutzig, dass der UBLKMOVE nur 512 Byte kann. Wann das auch die Kachelgröße des BLKMOVE ist, geht sich das NICHT aus.

Gruß
Karl
 
Hat wer eine Idee wie lange es ungefähr dauert 2160 Real Zahlen, also 8640 Bytes zu kopieren?
CPU ist eine 416-3.

Gruß
Karl

Kann man ja berechnen ...
Findet man in der Operationsliste der jeweiligen CPUs …

Als Bsp. für die 3xx CPUs, typ. Ausführungszeit in μs


CPU 310-315: 10 + 0,01 pro Byte
CPU 317: 7 + 0,01 pro Byte
CPU 319: 2 + 0,003 pro Byte
CPU 151/154: 10 + 0,01 pro Byte

Findet man in der Operationsliste der S7-300-CPUs …
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und hast Du eine Ahnung wieviele Zyklen der braucht?

Der macht das in einem Zyklus. Das Programm wird also hier unterbrochen bis alle daten Kopiert sind. Bzw ich hab mich da jetzt nie drum gekümmert aber wenn da was inkonsistent gewesen wäre, hätte ich das wohl schon gemerkt.

mfG René
 
Richtig. BLKMOV kopiert sofort in 1 Aufruf. Der Aufruf des SFC20 BLKMOV kehrt erst zum Programm zurück, wenn der BLKMOV fertig ist.

Gibts eigentlich eine Erklärung wie der Blkmov intern wohl funktioniert das er so schnell ist? Ich meine ab zwei Doppelwörtern zu kopieren lohnt sich der einsatz von Blkmov schon. Könnte man den so schnell nachbauen mit optimierterem Syntax als L DB100.dbd0 und T DB101.dbd0 (schleife)?

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibts eigentlich eine Erklärung wie der Blkmov intern wohl funktioniert das er so schnell ist? Ich meine ab zwei Doppelwörtern zu kopieren lohnt sich der einsatz von Blkmov schon. Könnte man den so schnell nachbauen mit optimierterem Syntax als L DB100.dbd0 und T DB101.dbd0 (schleife)?

Vermutung ist, dass dort intern eine Systemfunktion wie memcpy aus der C-Standardbibliothek aufgerufen wird. Zumindest hat diese die gleichen Beschränkungen bezüglich überlappender Speicherbereiche wie die Blockmove-Funktion. D.h. in AWL wird das niemals so schnell werden können wie mit dieser Funktion, zumindest nicht bei den CPUs die AWL/MC7 nicht nativ sprechen.
 
Zurück
Oben