Verschiebeoperationen
Datentransfer & Verwaltung
Der Datentransfer ist das Kreislaufsystem Ihres SPS-Programms. Verwalten Sie Variablenkopien, Struktur-Serialisierung und Speicherblock-Manipulationen effizient.
Was sind Verschiebeoperationen in TIA Portal?
Verschiebeoperationen ermöglichen das Kopieren von Daten von einem Speicherort an einen anderen. Sie reichen vom einfachen Kopieren einer Variable (MOVE) bis hin zur komplexen Manipulation ganzer Strukturen für die Kommunikation (Serialize/Deserialize) oder die Verwaltung zusammenhängender Datenbereiche (MOVE_BLK).
TIA Portal bietet moderne Anweisungen für den symbolischen Zugriff, die dynamische Verwaltung über Variant-Typen und optimierte Funktionen für Array-DBs, während Legacy-Anweisungen für die Kompatibilität mit älteren S7-300-Systemen beibehalten werden.
Basistransfer
Grundlegende Kopier- und Formatierungsanweisungen
MOVE — Wert kopieren
MOVEWas es macht
Kopiert den Inhalt des Eingangs IN zum Ausgang OUT. Bei unterschiedlichen Datentypen kann eine implizite Konvertierung erfolgen, sofern diese sicher ist.
Wann man es verwendet
Initialisieren von Variablen, Kopieren von HMI-Sollwerten oder Transfer von Berechnungsergebnissen.
Profi-Tipps
Sie können mehrere Ausgänge (OUT1, OUT2...) hinzufügen, um einen Wert gleichzeitig an mehrere Ziele zu kopieren.
In SCL verwenden Sie einfach die Zuweisung: destination := source;
Funktioniert mit fast allen Datentypen (Bool, Int, Real, Struct, String).
Serialize / Deserialize
SERWas sie machen
Serialize wandelt eine komplexe Struktur in einen sequenziellen Byte-Strom (Array of Byte) um. Deserialize bewirkt das Gegenteil.
Wann man sie verwendet
Vorbereitung von Daten für den Versand über Kommunikationsprotokolle (TCP/IP, UDP) oder kompakte Speicherung.
Profi-Tipps
Verwenden Sie den Parameter POS, um den Füllindex im Zielpuffer zu verfolgen.
Unerlässlich für den Austausch mit Drittsystemen, die Siemens-UDTs nicht verstehen.
Stellen Sie sicher, dass die Puffergröße ausreicht, um Laufzeitfehler zu vermeiden.
SWAP — Vertauschen
SWAPWas es macht
Kehrt die Byte-Reihenfolge (Endianness) im Operanden IN um.
Wann man es verwendet
Kommunikation mit Geräten, die das 'Little-Endian'-Format verwenden, während die SPS 'Big-Endian' nutzt.
Profi-Tipps
Wird normalerweise bei Word- oder DWord-Typen verwendet.
Nützlich für die Verarbeitung von Daten bestimmter Modbus-Sensoren.
Kann verwendet werden, um falsch herum empfangene ASCII-Codes neu zu ordnen.
Block verschieben
Manipulation massiver und zusammenhängender Speicherbereiche
MOVE_BLK / UMOVE_BLK
MOVE_BLKWas es macht
Kopiert eine definierte Anzahl von Elementen von einem Quell-Array in ein Ziel-Array. UMOVE_BLK ist die nicht unterbrechbare (atomare) Version.
Wann man es verwendet
Pufferverwaltung, Archivierung historischer Daten oder Duplizieren von Fertigungsrezepten.
Profi-Tipps
Der Startindex (COUNT) definiert die Anzahl der zu kopierenden Elemente.
UMOVE_BLK stellt sicher, dass Daten während des Kopierens nicht durch einen Alarm-OB geändert werden.
Quell- und Zieldatentypen müssen identisch sein.
MOVE_BLK_VARIANT
Was es macht
Erweiterte Version von MOVE_BLK, die Variant-Datentypen für flexible Adressierung unterstützt.
Wann man es verwendet
Entwicklung von wiederverwendbaren Bibliotheksbausteinen, die mit Arrays unterschiedlicher Größe oder Typen arbeiten.
Profi-Tipps
Ermöglicht das Kopieren zwischen Arrays, deren Typen erst zur Laufzeit bestimmt werden.
Verwenden Sie CountOfElements, um den COUNT-Parameter zu automatisieren.
Sehr leistungsstark in S7-1500 für generische Programmierung.
Bereich füllen
Schnelle Initialisierung von Speicherbereichen
FILL_BLK / UFILL_BLK
FILLWas es macht
Füllt einen Speicherbereich (Array) mit einem am Eingang IN angegebenen Einzelwert.
Wann man es verwendet
Zurücksetzen eines Messwert-Arrays auf Null oder Initialisieren eines Puffers mit einem Standardwert.
Profi-Tipps
UFILL_BLK ist vorzuziehen für kritische Bereiche, die mit Interrupts geteilt werden.
Viel performanter als eine FOR-Schleife zur Initialisierung eines großen Arrays.
COUNT gibt die Anzahl der zu füllenden Elemente ab dem angegebenen Pointer an.
Scatter / Gather
Bit-Zerlegung und -Zusammensetzung
SCATTER / GATHER
Was sie machen
SCATTER zerlegt ein Wort (Word, DWord...) in einzelne Bits in eine Struktur oder ein Array. GATHER bewirkt das Gegenteil.
Wann man sie verwendet
Extraktion von Statusbits aus einem Diagnosewort oder Zusammensetzung eines Steuerworts aus Kontrollbits.
Profi-Tipps
Ersetzt vorteilhaft eine Vielzahl von Bitzugriffen (z. B. %X0).
Verfügbar auf S7-1200 und S7-1500.
Garantiert saubereren und leichter zu wartenden Code.
Array-DB-Zugriff
Lesen und Schreiben in Datenbausteinen vom Typ Array
ReadFromArrayDB / WriteToArrayDB
Was sie machen
Ermöglichen das Lesen oder Schreiben eines bestimmten Elements in einem als 'Array DB' konfigurierten Datenbaustein.
Wann man es verwendet
Verwaltung großer Datenlisten, bei denen die Indizierung dynamisch und schnell sein muss.
Profi-Tipps
Die 'L'-Versionen (z. B. ReadFromArrayDBL) greifen auf den Ladespeicher (Load Memory) für seltene Daten zu.
Die Verwendung von Array DBs ist oft performanter als der klassische indexierte Zugriff.
Prüfen Sie, ob der Index innerhalb der Grenzen liegt, um Zugriffsfehler zu vermeiden.
Variant-Manipulation
Werkzeuge für die dynamische Programmierung
VariantGet / VariantPut
Was sie machen
VariantGet extrahiert den Wert einer Variant-Variable in eine typisierte Variable. VariantPut schreibt einen typisierten Wert in eine Variant-Variable.
Wann man sie verwendet
Verarbeitung von Daten, deren exakter Typ erst zum Zeitpunkt des Bausteinaufrufs bekannt ist.
Profi-Tipps
Verwenden Sie EQ_Type, um den Typ vor dem Extrahieren des Wertes zu prüfen.
Grundlegend für die Erstellung generischer Kommunikationsfunktionen.
CountOfElements liefert die Anzahl der Elemente, wenn der Variant auf ein Array zeigt.
Array-Grenzen
Dynamische Bestimmung von Limits
LOWER_BOUND / UPPER_BOUND
Was es macht
Liefert die untere (LOWER) oder obere (UPPER) Grenze eines als Variant-Parameter übergebenen Arrays.
Wann man es verwendet
Durchlaufen eines Arrays unbekannter Größe (z. B. Array[*] of MyUDT).
Profi-Tipps
Unerlässlich für das Schreiben robuster FOR-Schleifen: FOR i := LOWER_BOUND(...) TO UPPER_BOUND(...) DO
Funktioniert sowohl bei ein- als auch mehrdimensionalen Arrays.
Der Parameter DIM gibt die gewünschte Dimension an (Standard 1).
Legacy-Anweisungen
Kompatibilität mit älteren S7-300/400 Systemen
Anweisungen wie BLKMOV, FILL und FieldRead/FieldWrite werden aus Gründen der Kompatibilität beibehalten. Bevorzugen Sie für neue S7-1200/1500-Projekte MOVE_BLK, FILL_BLK und direkte symbolische Zugriffe.
Vergleich der Kopier-Methoden
Wahl der richtigen Transfer-Anweisung
| Sie müssen... | Empfohlene Anweisung | Beispiel |
|---|---|---|
| Einfache Variable kopieren | MOVE | Sollwert -> Istwert |
| Speicherbereich kopieren | MOVE_BLK | FIFO-Puffer |
| Array initialisieren | FILL_BLK | Fehler-Reset |
| TCP-Nachricht vorbereiten | Serialize | Struktur -> Byte-Strom |
| Wort in Bits zerlegen | SCATTER | Wort-Diagnose -> Struktur |
| Dynamischer Zugriff | VARIANT | Universeller Bibliotheksbaustein |
Häufig gestellte Fragen
Was ist der Unterschied zwischen MOVE und MOVE_BLK ?
MOVE ist dafür gedacht, einen einzelnen Wert oder eine komplette Struktur auf einmal zu kopieren. MOVE_BLK ist für das Kopieren eines Teils eines Arrays (eine bestimmte Anzahl aufeinanderfolgender Elemente) optimiert.
Warum UMOVE_BLK anstelle von MOVE_BLK verwenden ?
Das 'U' steht für Uninterruptible (nicht unterbrechbar). Diese Anweisung garantiert, dass der Kopier-Vorgang nicht durch einen Alarmzyklus (priorisierte OBs) unterbrochen wird, was die Konsistenz der kopierten Daten sicherstellt.
Wann verwendet man Serialize und Deserialize ?
Diese Anweisungen sind lebenswichtig, wenn Sie strukturierte Daten über 'rohe' Protokolle wie TSEND/TRCV oder an Drittgeräte senden müssen. Sie verwalten das Byte-Alignment standardisiert.
Funktioniert MOVE_BLK mit absoluten Adressen (P#DB1.DBX0.0...) ?
Ja, aber TIA Portal fördert die Verwendung symbolischer Zugriffe. Für komplexe absolute Adressierung wird BLKMOV (Legacy) noch verwendet, obwohl MOVE_BLK_VARIANT die empfohlene moderne Lösung ist.