Operazioni di Confronto
Logica di decisione e Intervalli
Il confronto dei valori è il motore della logica decisionale industriale. Padroneggia i comparatori standard, i test di intervallo e le verifiche di validità.
Cosa sono le operazioni di confronto in TIA Portal?
Le operazioni di confronto consentono di confrontare due valori dello stesso tipo di dati (Interi, Reali, Tempo, ecc.) o di verificare se un valore si trova all'interno o all'esterno di un intervallo definito. Sono fondamentali per creare soglie di allarme, condizioni di transizione e cicli di regolazione.
TIA Portal offre comparatori standard (==, <>, >=, ecc.), istruzioni di intervallo (IN_Range, OUT_Range), test di validità per numeri a virgola mobile e istruzioni avanzate per tipi di dati Variant e puntatori DB.
Comparatori Standard
Valutazione dell'uguaglianza e delle disuguaglianze tra due operandi
CMP == — Uguale (Equal)
==Cosa fa
Confronta due operandi (IN1 e IN2). Se IN1 è uguale a IN2, l'istruzione restituisce TRUE. Supporta quasi tutti i tipi di dati semplici.
Quando usarlo
Verificare se un contatore ha raggiunto l'obiettivo, se un setpoint HMI corrisponde al valore attuale o se uno specifico stato macchina è attivo.
Consigli Pro
Attenzione con i tipi Real: l'uguaglianza stretta può fallire a causa della precisione. Preferisci un margine o un intervallo.
In SCL: IF value1 = value2 THEN ...
Puoi confrontare stringhe di caratteri (String) per verificare codici di identificazione.
CMP <> — Diverso (Not equal)
<>Cosa fa
Restituisce TRUE se i due operandi IN1 e IN2 sono diversi. È l'inverso dell'uguaglianza.
Quando usarlo
Rilevare una variazione di valore, assicurarsi che un sensore non restituisca 0 o verificare che una modalità di marcia non sia quella vietata.
Consigli Pro
Spesso utilizzato per attivare un'azione non appena un valore si discosta dal suo setpoint.
In SCL: IF value1 <> value2 THEN ...
Può essere utilizzato per confrontare timestamp (DTL) per vedere se una data è cambiata.
CMP >= — Maggiore o uguale
>=Cosa fa
Restituisce TRUE se il primo valore (IN1) è maggiore o uguale al secondo (IN2).
Quando usarlo
Attivare un allarme di alto livello, consentire il riscaldamento finché non viene raggiunta una temperatura.
Consigli Pro
Ideale per soglie di sicurezza in cui il valore limite deve essere incluso nella condizione.
In SCL: IF level >= setpoint THEN ...
Può essere utilizzato con tipi Time per verificare se è trascorso un tempo minimo.
CMP <= — Minore o uguale
<=Cosa fa
Restituisce TRUE se IN1 è minore o uguale a IN2.
Quando usarlo
Monitoraggio di basso livello, arresto di una pompa, validazione di una pressione minima.
Consigli Pro
Spesso accoppiato a un'isteresi per evitare oscillazioni dell'uscita.
Funziona nativamente con i tipi Date e Time.
In SCL: IF pressure <= min_limit THEN ...
CMP > — Maggiore (Greater than)
>Cosa fa
Restituisce TRUE se IN1 è strettamente maggiore di IN2.
Quando usarlo
Confronto stretto che non deve includere il valore target.
Consigli Pro
Meno usato di >= in automazione, ma utile per algoritmi matematici.
In SCL: IF current > max THEN ...
Preferibile per i confronti di indici di cicli (FOR).
CMP < — Minore (Less than)
<Cosa fa
Restituisce TRUE se IN1 è strettamente minore di IN2.
Quando usarlo
Test di limiti inferiori stretti.
Consigli Pro
Utile per verificare se un valore è 'negativo' (val < 0).
In SCL: IF val < 0 THEN ...
Funziona con i caratteri (ordinamento alfabetico).
Operazioni di Intervallo
Verifica dell'appartenenza a un intervallo [MIN..MAX]
IN_Range — All'interno
IN_RangeCosa fa
Verifica se un valore (VAL) si trova tra un limite minimo (MIN) e un limite massimo (MAX). L'intervallo è chiuso: MIN <= VAL <= MAX.
Quando usarlo
Monitoraggio della finestra di funzionamento (es: pressione tra 2 e 5 bar), validazione della velocità macchina.
Consigli Pro
Sostituisce vantaggiosamente due comparatori messi in serie, rendendo il segmento più leggibile.
Se MIN > MAX, l'istruzione restituisce sempre FALSE.
Molto utile per i 'Ready to Run' che richiedono diverse condizioni analogiche.
OUT_Range — All'esterno
OUT_RangeCosa fa
Restituisce TRUE se il valore (VAL) è all'esterno dell'intervallo definito da MIN e MAX. O VAL < MIN, o VAL > MAX.
Quando usarlo
Rilevamento di anomalie o superamento di soglie estreme (allarme di intervallo).
Consigli Pro
È l'esatto inverso di IN_Range.
Usalo per semplificare la logica di allarme di processo.
In SCL: res := (val < min) OR (val > max);
Test di Validità
Verifica dell'integrità dei numeri a virgola mobile
|OK| — Verifica validità
|OK|Cosa fa
Verifica se un valore mobile (Real o LReal) è un numero valido. Restituisce FALSE se il valore è NaN (Not a Number) o Inf (Infinito).
Quando usarlo
Dopo calcoli complessi (divisioni, radici quadrate, log) per evitare di propagare errori matematici che potrebbero arrestare il PLC.
Consigli Pro
Indispensabile prima di inviare un valore Real a un'uscita analogica o a un inverter.
Permette di rilevare una divisione per zero indiretta.
Pratico per filtrare i feedback di sensori guasti.
|NOT_OK| — Verifica invalidità
|NOT_OK|Cosa fa
Restituisce TRUE se il valore mobile è invalido (NaN o Inf).
Quando usarlo
Attivare un bit di errore di calcolo o forzare un valore di sicurezza.
Consigli Pro
Usalo per mettere la tua macchina in sicurezza se un calcolo di traiettoria fallisce.
È l'equivalente di IS_NAN in altri linguaggi.
In SCL: IF NOT OK(value) THEN ...
Confronti avanzati (Variant)
Istruzioni per la programmazione dinamica e i tipi complessi
EQ_Type / NE_Type
Cosa fa
Confronta il tipo di dati di una variabile di tipo Variant con quello di un'altra variabile o di un tipo definito.
Quando usarlo
In blocchi generici che devono elaborare diversi tipi di dati (es: un blocco di log che accetta Int o Real).
Consigli Pro
Essenziale per la programmazione orientata agli oggetti e le librerie riutilizzabili.
Permette di rendere sicuri gli accessi alla memoria dinamica.
Usato con l'istruzione VariantGet.
IS_NULL / NOT_NULL
Cosa fa
Verifica se un puntatore (Variant o DB_ANY) è nullo (non punta a nulla).
Quando usarlo
Evitare errori di accesso quando si utilizzano DB indirizzati indirettamente.
Consigli Pro
Testare sempre NOT_NULL prima di chiamare un metodo o leggere un dato tramite un puntatore.
Equivalente dell'oggetto 'Nothing' o 'null' in C#/Java.
Indispensabile per la gestione di liste concatenate o strutture dinamiche in PLC.
IS_ARRAY
Cosa fa
Verifica se una variabile Variant punta a un array (Array).
Quando usarlo
Programmazione di funzioni di elaborazione batch o di buffer di dati.
Consigli Pro
Accoppialo con CountOfElements per conoscere la dimensione dell'array.
Permette di creare funzioni di ordinamento universali.
Funziona anche per gli array di strutture (UDT).
Confronto dei comparatori — Quale usare?
Scegliere l'istruzione giusta per la tua logica PLC
| Vuoi... | Usa questo | Esempio |
|---|---|---|
| Testare l'uguaglianza esatta | CMP == | Codice prodotto corretto |
| Soglia di sicurezza alta | CMP >= | Pressione > 10 bar |
| Mantenere in una zona | IN_Range | Temp tra 18 e 24°C |
| Monitorare errori Real | |OK| | Verifica risultato divisione |
| Verificare un puntatore DB | NOT_NULL | DB di ricetta caricato |
| Verificare un tipo Variant | EQ_Type | L'ingresso è Int |
Domande Frequenti
Perché il mio confronto == fallisce a volte con i numeri Real?
I numeri Real (virgola mobile) hanno una precisione limitata. Un calcolo può dare 10.000001 invece di 10.0. Usa sempre IN_Range con una piccola tolleranza (es: tra 9.99 e 10.01) per confrontare valori mobili.
Qual è la differenza tra IN_Range e due comparatori messi in serie?
Funzionalmente è identico. Tuttavia, IN_Range è graficamente più compatto, più facile da leggere e più performante poiché il PLC elabora l'istruzione in un unico passaggio.
A cosa servono le istruzioni |OK| e |NOT_OK|?
Servono a rilevare gli errori 'silenziosi' dei calcoli Real. Se fai una radice quadrata di un numero negativo, il risultato è NaN. Senza il test |OK|, questo NaN inquinerebbe tutti gli altri calcoli e potrebbe causare un arresto della CPU.
Si possono confrontare strutture complete (UDT)?
L'istruzione CMP == non permette di confrontare direttamente due strutture. Devi confrontare ogni membro individualmente o utilizzare un blocco specifico che confronti le zone di memoria.