Operazioni di Spostamento
Trasferimento e Gestione Dati
Il trasferimento dei dati è il sistema circolatorio del tuo programma PLC. Gestisci efficacemente le copie delle variabili, la serializzazione delle strutture e le manipolazioni dei blocchi di memoria.
Cosa sono le operazioni di spostamento in TIA Portal?
Le operazioni di spostamento consentono di copiare dati da una posizione di memoria a un'altra. Vanno dalla semplice copia di una variabile (MOVE) alla manipolazione complessa di intere strutture per la comunicazione (Serialize/Deserialize) o la gestione di aree dati contigue (MOVE_BLK).
TIA Portal offre istruzioni moderne per l'accesso simbolico, la gestione dinamica tramite i tipi Variant e funzioni ottimizzate per gli Array DB, mantenendo al contempo le istruzioni Legacy per la compatibilità con i vecchi sistemi S7-300.
Trasferimento di Base
Istruzioni fondamentali di copia e formattazione
MOVE — Copia valore
MOVECosa fa
Copia il contenuto dell'ingresso IN nell'uscita OUT. Se il tipo di dati differisce, può verificarsi una conversione implicita se sicura.
Quando usarlo
Inizializzare variabili, copiare setpoint HMI o trasferire risultati di calcolo.
Consigli Pro
È possibile aggiungere più uscite (OUT1, OUT2...) per copiare un valore a più destinazioni simultaneamente.
In SCL, usa semplicemente l'assegnazione: destinazione := sorgente;
Funziona con quasi tutti i tipi di dati (Bool, Int, Real, Struct, String).
Serialize / Deserialize
SERCosa fanno
Serialize converte una struttura complessa in un flusso di byte sequenziale (Array of Byte). Deserialize fa l'opposto.
Quando usarlo
Preparazione dei dati per l'invio tramite protocolli di comunicazione (TCP/IP, UDP) o archiviazione compatta.
Consigli Pro
Usa il parametro POS per tracciare l'indice di riempimento nel buffer di destinazione.
Essenziale per gli scambi con sistemi di terze parti che non comprendono gli UDT Siemens.
Assicurarsi che la dimensione del buffer sia sufficiente per evitare errori di runtime.
SWAP — Inverti
SWAPCosa fa
Inverte l'ordine dei byte (Endianness) nell'operando IN.
Quando usarlo
Comunicazione con dispositivi che utilizzano il formato 'Little-Endian' mentre il PLC utilizza il 'Big-Endian'.
Consigli Pro
Generalmente utilizzato su tipi Word o DWord.
Utile per l'elaborazione di dati provenienti da alcuni sensori Modbus.
Può essere utilizzato per riorganizzare codici ASCII ricevuti al contrario.
Spostamento di Blocchi
Manipolazione di aree di memoria massicce e contigue
MOVE_BLK / UMOVE_BLK
MOVE_BLKCosa fa
Copia un numero definito di elementi da un Array sorgente a un Array destinazione. UMOVE_BLK è la versione non interrompibile (atomica).
Quando usarlo
Gestione buffer, archiviazione dati storici o duplicazione di ricette di produzione.
Consigli Pro
L'indice di partenza (COUNT) definisce il numero di elementi da copiare.
UMOVE_BLK garantisce che i dati non vengano modificati da un OB di allarme durante la copia.
I tipi di dati sorgente e destinazione devono essere identici.
MOVE_BLK_VARIANT
Cosa fa
Versione avanzata di MOVE_BLK che supporta i tipi di dati Variant per un indirizzamento flessibile.
Quando usarlo
Sviluppo di blocchi di libreria riutilizzabili che lavorano su array di diverse dimensioni o tipi.
Consigli Pro
Consente di copiare tra array i cui tipi sono determinati a runtime.
Usa CountOfElements per automatizzare il parametro COUNT.
Molto potente in S7-1500 per la programmazione generica.
Riempimento Area
Inizializzazione rapida di intervalli di memoria
FILL_BLK / UFILL_BLK
FILLCosa fa
Riempe un'area di memoria (Array) con un valore unico specificato all'ingresso IN.
Quando usarlo
Reimpostare un array di misure a zero o inizializzare un buffer con un valore predefinito.
Consigli Pro
UFILL_BLK è preferibile per le aree critiche condivise con gli interrupt.
Molto più performante di un ciclo FOR per inizializzare un grande array.
COUNT specifica il numero di elementi da riempire a partire dal puntatore specificato.
Scatter / Gather
Decomposizione e composizione di bit
SCATTER / GATHER
Cosa fanno
SCATTER decompone una parola (Word, DWord...) in singoli bit verso una struttura o un array. GATHER fa l'opposto.
Quando usarlo
Estrazione di bit di stato da una parola di diagnostica o composizione di una parola di comando da bit di controllo.
Consigli Pro
Sostituisce vantaggiosamente una moltitudine di accessi ai bit (es: %X0).
Disponibile su S7-1200 e S7-1500.
Garantisce un codice più pulito e facile da mantenere.
Accesso Array DB
Lettura e scrittura in blocchi dati di tipo array
ReadFromArrayDB / WriteToArrayDB
Cosa fanno
Consentono di leggere o scrivere un elemento specifico in un blocco dati configurato come 'Array DB'.
Quando usarlo
Gestione di grandi elenchi di dati in cui l'indicizzazione deve essere dinamica e veloce.
Consigli Pro
Le versioni 'L' (es: ReadFromArrayDBL) accedono alla memoria di caricamento (Load Memory) per dati poco frequenti.
L'uso di Array DB è spesso più performante del classico accesso indicizzato.
Verificare che l'indice sia entro i limiti per evitare errori di accesso.
Manipolazione Variant
Strumenti per la programmazione dinamica
VariantGet / VariantPut
Cosa fanno
VariantGet estrae il valore di una variabile Variant in una variabile tipizzata. VariantPut scrive un valore tipizzato in una variabile Variant.
Quando usarlo
Elaborazione di dati il cui tipo esatto è noto solo al momento della chiamata del blocco.
Consigli Pro
Usa EQ_Type per verificare il tipo prima di estrarre il valore.
Fondamentale per creare funzioni di comunicazione generiche.
CountOfElements restituisce il numero di elementi se il Variant punta a un Array.
Limiti Array
Determinazione dinamica dei limiti
LOWER_BOUND / UPPER_BOUND
Cosa fa
Restituisce il limite inferiore (LOWER) o superiore (UPPER) di un array passato come parametro Variant.
Quando usarlo
Eseguire un ciclo su un array di dimensioni sconosciute (es: Array[*] of MyUDT).
Consigli Pro
Indispensabile per scrivere cicli FOR robusti: FOR i := LOWER_BOUND(...) TO UPPER_BOUND(...) DO
Funziona sia su array mono che multidimensionali.
Il parametro DIM specifica la dimensione desiderata (1 per impostazione predefinita).
Istruzioni Legacy
Compatibilità con i vecchi sistemi S7-300/400
Istruzioni come BLKMOV, FILL e FieldRead/FieldWrite sono conservate per compatibilità. Per i nuovi progetti S7-1200/1500, preferisci MOVE_BLK, FILL_BLK e accessi simbolici diretti.
Confronto dei metodi di copia
Scegliere la giusta istruzione di trasferimento
| Devi... | Istruzione consigliata | Esempio |
|---|---|---|
| Copiare una variabile semplice | MOVE | Setpoint -> Attuale |
| Copiare un'area di memoria | MOVE_BLK | Buffer FIFO |
| Inizializzare un array | FILL_BLK | Reset guasti |
| Preparare un messaggio TCP | Serialize | Struttura -> Flusso byte |
| Suddividere una parola in bit | SCATTER | Diagnostica parola -> struttura |
| Accesso dinamico | VARIANT | Blocco libreria universale |
Domande Frequenti
Qual è la differenza tra MOVE e MOVE_BLK?
MOVE è destinato a copiare un singolo valore o una struttura completa in una volta sola. MOVE_BLK è ottimizzato per copiare una parte di un array (un certo numero di elementi consecutivi).
Perché usare UMOVE_BLK invece di MOVE_BLK?
La 'U' sta per Uninterruptible (non interrompibile). Questa istruzione garantisce che l'operazione di copia non venga interrotta da un ciclo di allarme (OB prioritari), assicurando la totale coerenza dei dati copiati.
Quando usare Serialize e Deserialize?
Queste istruzioni sono vitali quando è necessario inviare dati strutturati tramite protocolli 'grezzi' come TSEND/TRCV o verso apparecchiature di terze parti. Gestiscono l'allineamento dei byte in modo standardizzato.
MOVE_BLK funziona con indirizzi assoluti (P#DB1.DBX0.0...)?
Sì, ma TIA Portal incoraggia l'uso di accessi simbolici. Per l'indirizzamento assoluto complesso, viene ancora utilizzato BLKMOV (Legacy), sebbene MOVE_BLK_VARIANT sia la soluzione moderna consigliata.