Datenbaustein Bereiche kopieren

elektro_mensch

Level-1
Beiträge
90
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich hab mal ne Frage und bin ein wenig unter Zeitdruck.

Ich möchte aus dem Datenbaustein 100 einen bestimmten Bereich in den Datenbaustein 200 kopieren.

Die Struktur der Datenbausteine ist gleich.

Jetzt sollen die Datenbytes 10 - 60 aus den DB 100 in die Datenbytes 10- 60 des DB 200 kopiert werden.

Jetzt könnte ich das ja so machen
L DB100.DBB10
T DB200.DBB10
L DB100.DBB11
T DB200.DBB11
u.s.w.

Aber das 50 mal eintippen ist irgendwie nicht praktikabel, zumal es evtl. noch mehr Bytes werden können.

Bestimmt gibt es da ne viel bessere Lösung und ich würde mich über Tips freuen.

Vielen Dank schon mal......
 
Alternative 1: (2 Bytes = 1 Wort auf einmal kopieren)
=nur noch 25 Anweisungen

L DB100.DBW10
T DB200.DBW10
L DB100.DBW12
T ................


Alternative 2: (4 Bytes = 1 Doppelwort auf einmal kopieren)
=nur noch 13 Anweisungen

L DB100.DBD10
T DB200.DBD10
L DB100.DBD14
T ........


Alternative 3: (die der Profis)

Speicherbereich kopieren mit der SFC 20 "BLKMOV"

Beschreibung

Mit der SFC 20 "BLKMOV" (block move) kopieren Sie den Inhalt eines Speicherbereiches (= Quellbereich) in einen anderen Speicherbereich (= Zielbereich).

Zulässige Quellbereiche sind:

· Teile von Datenbausteinen

· Merker

· Prozeßabbild der Eingänge

· Prozeßabbild der Ausgänge



gruss, o.s.t.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit der SFC 20 "BLKMOV" (block move)
gruss, o.s.t.

Vielen Dank, sieht schon sehr gut aus !
Und superschnelle Antwort !

Leider bin ich im Augenblick "offline" und kann deshalb nicht probieren.
Da ich mit "Any" noch nichts gemacht habe noch kurz eine Nachfrage:

Das in der Hilfe erwähnte Beispiel mit den verschieben von Merkerbereiche leuchtet mir ein

Call SFC 20
SRCBLK :=P#M 100.0 BYTE 10
RET_VAL :=MW10
DSTBLK :=P#M 200.0 BYTE 10

Wenn ich das jetzt aber mit den DB´s versuche scheitere ich irgendwie am Syntax. Ist das hier richtig ?

Call SFC 20
SRCBLK :=P#DB100.DBX10.0 BYTE 10
RET_VAL :=MW10
DSTBLK :=P#DB200.DBX10.0 BYTE 10

Muss also das Bit (DBX10.0) angegeben werden, ab wo kopiert werden soll ? Wenn ich versuche da die Byteadresse (DBB10) einzugeben, gibt es vom Programm immer Syntaxfehler.

Vielen Dank schon mal..............
 
Hallo,

versuchs mal mit dem von mir erstellten Kopierbaustein FC303 im Projekt - der ruft letztlich den SFC20 auf, ist aber etwas einfacher aufzurufen.
Hab ihn schon öfter eingesetzt, z.B. um Aktualwerte zu retten.

viel Erfolg.
 

Anhänge

  • Copydb.zip
    124,6 KB · Aufrufe: 240
Zuletzt bearbeitet:
Weiß einer von euch ob der SFC20 auch in den Ladespeicher schreiben kann.

Ich habe eine CPU 312IFM und wollte für die statistische Auswertung in der SPS mit dem Ladespeicher "rum probieren".
Im Praktikum vor einigen Jahren habe ich sowas auch schon gemacht, allerdings dort mit Read_DBL und Write_DBL (SFC 83 / 84), nur das die CPU 312 IFM die beiden nicht hat / unterstützt....

Beim ersten Test lief es dann gar nicht mit BLK_Move und ich hatte jetzt Befürchtungen das der SFC20 gar nicht auf den Ladespeicher schreiben kann
 
Weiß einer von euch ob der SFC20 auch in den Ladespeicher schreiben kann.

..... ich hatte jetzt Befürchtungen das der SFC20 gar nicht auf den Ladespeicher schreiben kann


Lesen mit SFC20 von einem "UNLINKED_DB" [nur auf der MMC] sollte gehen.

Schreiben geht nicht mit SFC20...

GRUß
 
Nochmal ne dumme Frage,

ich wollte jetzt einen Datenbausteinbereich (DB im Arbeitsspeicher) in einen Instanzdatenbaustein kopieren, geht das mit "BLKMOV" auch nicht

Als Fehler erhalte ich 8124 = Bereichsfehler beim LESEN eines Parameters

Jetzt habe ich den Bereich in den kopiert werden soll mal als normalen DB angelegt (auch im Arbeitsspeicher, also nicht Unlinked) und weiterhin nichts verändert, heißt gleicher Aufbau des Any Zeigers, und da geht es...
 
Nochmal ne dumme Frage,

ich wollte jetzt einen Datenbausteinbereich (DB im Arbeitsspeicher) in einen Instanzdatenbaustein kopieren, geht das mit "BLKMOV" auch nicht

Als Fehler erhalte ich 8124 = Bereichsfehler beim LESEN eines Parameters

Jetzt habe ich den Bereich in den kopiert werden soll mal als normalen DB angelegt (auch im Arbeitsspeicher, also nicht Unlinked) und weiterhin nichts verändert, heißt gleicher Aufbau des Any Zeigers, und da geht es...


...falls es offiziell nicht geht, wäre es auch gut so, denn man sollte m.E. NIE schreibend von außen auf IDBs zugreifen - das ist höchst unsauber, finde ich.

Selbst das Lesen geht ggf. nach der ersten Programmänderung im FB gegen den Baum, wenn der IDB neu generiert wurde!


Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In meinem Fall wäre das jetzt vielleicht nicht ganz so unsauber gewäsen

ich hatte folgendes vor:

Ich wollte ein statistische Auswertung von 6 Geräten machen, mit Laufzeit, Durchschnitt, Anzahl der Betätigungen und und und, das hatte ich erst für jeden einzeln abgefragt und dann wurde der FB ziemlich groß.
Dann hatte ich versucht mit Lade- und Arbeitspeicher zu arbeiten, was meine CPU aber gar nicht unterstützt.

Dann war meine Idee einen Datenbaustein mit den Werten anzulegen und immer die Werte für das akutelle Gerät in den IDB des FB zu laden und dann zu bearbeiten und zurück zu schreiben, dadurch kann ich mir halt etwas "Platz" sparen.

Das Laden der Werte klappte auch eigentlich fast schnell, allerdings hab ich Depp dann die ganze Zeit versucht auf einen Unlinked DB zu schreiben, was mit der SFC 20 nicht geht, wie mir hier gesagt wurde. Nur wusste ich nicht das ich den DB noch auf Unlinked hatte. Derzeit klappt das schreiben der neuen Werte teilweise, er schreibt zwar, aber nicht an die Adresse wo er hinschreiben soll, sondern immer an die gleiche Stelle.

Das mit dem IDB beschreiben ist daher auch nicht mehr akut.



UPDATE

wenn man so clever wäre und auch Baustein in CPU schuppst den man gerade testet ist die Chance sehr viel größer das es funktioniert......

es scheint jetzt doch zu funtkionieren
 
Zuletzt bearbeitet:
UPDATE

wenn man so clever wäre und auch Baustein in CPU schuppst den man gerade testet ist die Chance sehr viel größer das es funktioniert......


daher IM NORMALFALL IMMER

Erst SPEICHERN

Dann Transferieren


sonst ist eine Fehlersuche in den "OFFLINE"-Referenzdaten natürlich totaler Müll!


...ich kenne Einen, der hat schon 6 Stunden damit verbracht, OFFLINE zu suchen warum es ONLINE nicht geht! (ich war es zum Glück nicht :))

Gruß
 
hi, ein frage: kann ich diese Datenbausteine auch ohne blkmov kopieren?? nur mit registerindirekter adressierung???

Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... nein, es ist eine Frage wie groß dein Bereich ist und welchen Aufwand du betreiben möchtest ...

Du kannst natürlich auch schreiben :
Code:
L DB10.DBD100
T DB20.DBD10
 
L DB10.DBD104
T DB20.DBD14
 
usw.
... oder falls du SCL hast, dann kannst du dir da über Array's auch schöne BLOCK-MOVE's selber erstellen ...

Was ist der Hintergrund der Frage ?
 
Hi, danke für deine Hilfe.

Im DB 30 werden Motordaten erfasst! von DBW 1 bis DBW 55

diese sollen dann in den DB 35 DBW 1 bis DBW 55 kopiert werden. anschleißend steht der DB 30 für neue Motordaten zur Verfügung
 
Zurück
Oben