norman_timo
Level-1
- Beiträge
- 11
- Reaktionspunkte
- 1
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
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: