TIA Pointer (Variant) fuer FC zwecks "MemCopy"

norman_timo

Level-1
Beiträge
11
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

ich verzweifle gerade mit TIA V14 und der Programmierung meiner S7-1500.

Primaeres Ziel:
Ich wuerde gerne einen Merker-Speicherbereich in einen anderen Merker-Speicherbereich kopieren.
Herausforderung: Ich moechte gerne einen kompletten Bereich, in dem mehrere Merker-Variablen definiert sind auf einmal kopieren. Leider sind das auch unterschidliche Typen (Bool, Byte und Word). Die Merker sind vom Speicherbereich schon fortlaufend hintereinander abgelegt.

Angedachter Weg: (darf gerne auch diskutiert werden)
Entwicklung eines Function-Calls FC, der zwei IN Parameter vorsieht:
- IN: SRCADDR (VARIANT)
- IN: DSTADDR (VARIANT)

Beispiel:
SRCADDR := "P#M2.0 BOOL 19"
DSTADDR := "P#M102.0 BOOL 19"

Der FC kontrolliert, ob Quell- und Zielbereich von der Groesse her passen und kopiert dann "einfach" Speicherbereich aus SRCADDR nach DSTADDR.

Schwierigkeiten:
Ich hab nun mehrere Anweisungen gefunden, die ich verwenden kRealisierung mit ann, aber keiner funktioniert mit o. g. Anforderung:
1) MOVE_BLK_VARIANT
-> Akzeptiert kein BOOL als Quelladresse (warum auch um Herrgottsnamen nicht?!?)
-> Kann daher auch nur Byteweise kopieren
2) POKE_BLK
-> Anzahl zu kopierender Elemente nur in Bytes moeglich

Jetzt hab ich mir gedacht, ich erlaube als Quell- und Ziel-Adresse nur Bool mit dem Ziel, ich berechne mir Anzahl kompletter Bytes und Rest Anzahl Bits, so dass ich dann den ersten Teil mittels MOVE_BLK_VARIANT und den zweiten Teil dann mittels POKE_BOOL und einer For-Schleife kopieren kann.
Den Typ kann ich mittels TypeOf abfragen und dann auch mit "Bool" vergleichen. Aber...:
3) Wie komm ich bei einer Angabe "P#M2.0 BOOL 19" an die 19? Gibt es da auch so etwas wie beim Typ mit TypeOf?
4) Wie kann ich dann Pointer Arithmetik betreiben, ich will ja dann zuerst die Anzahl Bytes kopieren, dazu muesste ich einen dynamischen Pointer anlegen (in meinem Beispiel muesste ja dann ein "P#M2 Byte 2" gebaut werden, aber wie?
-> Und wie komme ich dann an "P#M4.0 Bool 3" fuer das Kopieren des 2. Teils?

Vielleicht koennt Ihr mir hier weiterhelfen?
(frueher war das irgendwie einfacher, da gab es noch direkte Adressierung ohne Einschraenkung :-/ )

Viele Gruesse
norman_timo
 
Zuletzt bearbeitet:
Warum versuchst du in einer S7-1500 Adressbasiert zu arbeiten?
Arbeite doch besser Symbolisch.
Definiere einen Datentyp den kannst du in immer 1:1 kopieren.
Das geht auch mit einem Merker vom Typ deines Datentyps.

Gruß

Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jens,

ich arbeite deshalb addressbasiert, weil ich Daten aus verschiedenen CPU mit einer übergeordneten CPU zusammensammle. So habe ich mir ausgedacht, dass ich bei z. B. 5 CPU's die Remote Daten so hole, dass ich mittels S7-GET von der Remote CPU die Daten in einen festen Speicherbereich hole.
Beispiel:

Zentral-CPU holt Daten aus CPU1 (100 Bytes) und schreibt diese in den Bereich M100...
Zentral-CPU holt Daten aus CPU2 (100 Bytes) und schreibt diese in den Bereich M200...
usw.

Jetzt benötigt die zentrale CPU nicht alle Daten und auch nicht so am Stück für seine eigene Prozesslogik. Deshalb möchte ich z. B. vom M100.0 19 Bits auf z. B. M4.0 schreiben, dann M114.4 4 Bits auf xyz....

Da es sich um sehr viele Digitalwerte handelt wollte ich wenigstens die PRogrammlogik auf Speicheradresse Mx.y und Anzahl Bits beschränken.

Ich könnte jetzt natürlich viele Datentypen deklarieren, aber das ist m. E. nach unübersichtlicher. Die "Einzelmerker" sind als Variablen in der Remote-CPU definiert, und diese werden auch per Copy-Paste in der Zentral-CPU übernommen.

Oder habe ich Deinen Vorschlag falsch verstanden?

VG
norman_timo
 
Belegungsplan.png

Hier ein Beispiel (Auszug) aus dem Speicherbereich einer Remote-CPU, welcher dann per S7-GET von der Zentrale eingelesen wird. Für die "Einzelzugriffe" sind natürlich Variablen definiert (im Bild zu sehen: 24 Bit-Merker und 5 Word-Merker plus ein halber ;-)

VG
norman_timo
 
Zurück
Oben