In particolar modo vedremo:
Il Problema
Un tecnico PLC ha realizzato un blocco FC (TIA Portal V16) al quale come parametro di ingresso gli passa un Array[*] of POSAGGI. Vorrebbe azzerare tutti i dati all’interno dell’array senza dover modificare l’FC in caso di cambio struttura dei dati. Questo perché il tipo di dati POSAGGI contiene dati misti di cui word, byte, bool ecc. Questo articolo ti mostrerà come risolvere questo problema tecnico specifico.
Causa Tecnica dell’Azzeramento
Per azzerare i dati in un array nel PLC S7-1500, è importante capire come gestire le variabili temp e come utilizzare funzioni come MOVE_BLK_VARIANT. Le variabili temp vengono inizializzate sempre a 0 se il blocco è ottimizzato e il firmware è V4 o successivo. Tuttavia, per garantire che l’azzeramento avvenga correttamente, è necessario utilizzare un approccio strutturato che gestisca le diverse tipologie di dati all’interno dell’array.
Soluzione Definitiva per Azzerare Array
Passo 1: Definire la Struttura dei Dati
Crea una struttura di dati coerente con gli elementi dell’array. Assicurati che tutte le variabili siano inizializzate a zero.
Passo 2: Utilizzare la Funzione MOVE_BLK_VARIANT
Utilizza la funzione MOVE_BLK_VARIANT per spostare gli elementi dell’array. Questo permette di copiare i dati dall’elemento precedente all’elemento successivo fino all’ultimo elemento, che viene poi azzerato.
Passo 3: Implementare il Codice
Ecco un esempio di codice per azzerare un array:
FUNCTION FC_SHIFT_Variant : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
execute : Bool;
END_VAR
VAR_OUTPUT
done : Bool;
END_VAR
VAR_IN_OUT
init : Variant;
buffer : Variant;
END_VAR
VAR_TEMP
bufferSize : UDInt;
BlkMove_Error : Int;
i : Int;
END_VAR
BEGIN
// Inizializzo "done"
#done := false;
// Eseguire le istruzioni solo con comando "execute" attivo.
// N.B.: per far avanzare il registro di un solo passo si deve attivare "execute" per una sola scansione.
IF NOT #execute THEN
RETURN;
END_IF;
// Controllo che "buffer" sia un array.
// Se è un array leggo la dimensione dell'array
// altrimenti esco dalla funzione.
IF IS_ARRAY(#buffer) THEN
#bufferSize := CountOfElements(#buffer);
ELSE
RETURN;
END_IF;
// Se il tipo di dati di "init" è diverso dal tipo di dati
// degli elementi di "buffer" esco dalla funzione.
IF TypeOf(#init) <> TypeOfElements(#buffer) THEN
RETURN;
END_IF;
// Le seguenti istruzioni vengono eseguite solo se i controlli precedenti
// hanno dato esito positivo
/
// Scorrimento degli elementi dell'array: il penultimo elemento
// viene copiato nell'ultimo il terzultimo nel penultimo e così via
// fino al primo elemento copiato nel secondo.
// L'indice dell'array parte da zero quindi l'ultimo elemento avrà indice
// pari al numero di elementi dell'array - 1.
// L'indice del penultimo elemento sarà quindi pari al numero di elementi dell'array - 2.
FOR #i := (UDINT_TO_INT(#bufferSize) - 2) TO 0 BY -1 DO
#BlkMove_Error := MOVE_BLK_VARIANT(SRC := #buffer
COUNT := 1
SRC_INDEX := #i
DEST_INDEX := #i + 1
DEST => #buffer);
IF #BlkMove_Error <> 0 THEN
RETURN;
END_IF;
END_FOR;
// al termine dello scorrimento copio "init" nel primo elemento dell'array.
#BlkMove_Error := MOVE_BLK_VARIANT(SRC := #init
COUNT := 1
SRC_INDEX := 0
DEST_INDEX := 0
DEST => #buffer);
IF #BlkMove_Error <> 0 THEN
RETURN;
END_IF;
// ogni eventuale errore nell'esecuzione della funzione causa l'uscita dalla funzione stessa.
// Se sono arrivato alla fine della funzione significa che l'esecuzione è avvenuta
// in modo corretto.
// Attivo l'uscita "done".
#done := TRUE;
END_FUNCTION
Codice e Configurazione dell’Azzeramento
Il codice sopra mostra come azzerare un array in S7-1500. Assicurati di adattare la struttura dei dati e di utilizzare la funzione MOVE_BLK_VARIANT per gestire gli spostamenti degli elementi.
Verifica e Test della Soluzione
Per verificare che l’azzeramento sia avvenuto correttamente, controlla che tutti i valori all’interno dell’array siano a zero. Puoi utilizzare strumenti di diagnostica di TIA Portal per verificare l’integrità dei dati.
Errori Comuni nell’Azzeramento
Ecco alcuni errori comuni nell’azzeramento di array nel PLC S7-1500:
- Utilizzo di tipi di dati incoerenti.
- Mancanza di inizializzazione delle variabili temp.
- Errori di configurazione del ciclo FOR.
Domande Frequenti su Azzerare Array
Qual è il metodo migliore per azzerare un array in S7-1500?
Il metodo migliore è utilizzare la funzione MOVE_BLK_VARIANT per gestire lo scorrimento degli elementi e azzerare il primo elemento con una variabile di inizializzazione.
Come posso gestire variabili di tipo Variant?
Le variabili di tipo Variant permettono di lavorare con diversi tipi di dati all’interno di un’unica variabile. Utilizza la funzione MOVE_BLK_VARIANT per spostare i dati tra strutture diverse.
Quali strumenti di diagnostica posso utilizzare?
Utilizza gli strumenti di diagnostica di TIA Portal per verificare l’integrità dei dati e la corretta esecuzione del codice.
Conclusione
Azzerare un array in S7-1500 può essere complesso, ma con la giusta configurazione e l’uso delle funzioni appropriate come MOVE_BLK_VARIANT, è possibile risolvere questo problema tecnico. Assicurati di testare attentamente il tuo codice per garantire che tutti i dati siano azzerati correttamente.
Stanco di andare a tentativi?
Se errori come questo ti mandano in panico, probabilmente ti mancano le basi solide della programmazione PLC.
Smetti di risolvere problemi uno alla volta e impara il metodo giusto dall’inizio.

“Semplifica, automatizza, sorridi: il mantra del programmatore zen.”
Dott. Strongoli Alessandro
Programmatore
CEO IO PROGRAMMO srl








