Tempo di lettura: 5 minuti

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.


Scopri i Corsi TIA Portal per Principianti →

IT EN ES FR HI DE ZH