1. Bit

Il bit è la più piccola unità di informazione binaria e può assumere soltanto due valori:

0 oppure 1

Lo 0 e l’1 sono valori logici. In un dispositivo elettronico devono essere rappresentati mediante grandezze fisiche; negli ingressi digitali questo avviene normalmente attraverso determinati intervalli di tensione e corrente.

In un sistema industriale con ingressi nominali a 24 V in corrente continua, quindi, non bisogna intendere che soltanto 0,000 V significhi 0 e soltanto 24,000 V significhi 1. L’ingresso riconosce come stato 0 oppure stato 1 determinati intervalli di valori, con soglie definite dalle caratteristiche dell’ingresso.

I valori logici e i valori elettrici sono quindi due cose distinte:

valore elettrico → interpretazione dell’ingresso → valore logico 0 oppure 1

2. Che cosa rappresentano 0 e 1

Una volta ottenuto uno stato logico, gli si attribuisce un significato all’interno del sistema.

Per esempio:

0 = pulsante non premuto
1 = pulsante premuto

oppure:

0 = finecorsa non raggiunto
1 = finecorsa raggiunto

Queste associazioni non sono universali. Dipendono dal circuito, dal tipo di sensore e dalla logica adottata.

Il significato dipende da come è progettato il circuito. Per esempio, con un contatto normalmente chiuso usato per sicurezza, l’ingresso può essere 1 quando il circuito è integro e diventare 0 quando il contatto si apre per intervento o guasto. Quindi 1 e 0 indicano due stati logici; il loro significato concreto dipende dal circuito e dalla logica utilizzata.

Bisogna distinguere:

condizione fisica → segnale elettrico → stato logico → significato attribuito allo stato

3. Byte e numero delle combinazioni

Ogni bit può assumere due valori: 0 oppure 1.

Con due bit si hanno:

2 × 2 = 4

combinazioni:

00
01
10
11

Con tre bit:

2 × 2 × 2 = 8

Con quattro bit:

2 × 2 × 2 × 2 = 16

In generale, con n bit, il numero delle combinazioni possibili è:

2ⁿ

Ogni bit aggiunto raddoppia quindi il numero delle combinazioni.

Un gruppo di 8 bit prende il nome di byte.

Di conseguenza un byte presenta:

2⁸ = 256 combinazioni differenti

da:

00000000

a:

11111111

4. Sistema binario

Le combinazioni di bit possono essere interpretate come numeri binari.

Una stessa sequenza di bit può però essere interpretata in modi diversi. Se vogliamo rappresentare soltanto numeri da zero in su, utilizziamo una rappresentazione senza segno: tutti i bit contribuiscono al valore del numero.

Per esempio, con 4 bit senza segno:

0000 = 0
0001 = 1
0010 = 2

1111 = 15

Se invece vogliamo rappresentare anche numeri negativi, occorre stabilire una diversa convenzione. Una sequenza di bit non indica quindi, da sola, se il valore rappresentato è positivo o negativo: il significato dipende dalla codifica utilizzata.

Nel seguito consideriamo, per semplicità, numeri binari senza segno.

Quando si utilizzano n bit, i valori rappresentabili sono:

da 0 a 2ⁿ − 1

Con tre bit si hanno quindi otto valori:

000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7

Con 3 bit si rappresentano dunque, senza segno, i numeri da 0 a 7.

Con 8 bit si rappresentano, senza segno, i numeri da 0 a 255.

Le stesse sequenze di bit possono essere utilizzate anche con significati differenti, per esempio come insieme di stati o secondo altre codifiche. Ma quando vengono interpretate come numeri binari interi senza segno, l’intervallo 0 … 2ⁿ − 1 è determinato univocamente.

5. Dal mondo reale al bit

In un sistema di automazione le informazioni provengono da dispositivi reali: pulsanti, finecorsa, sensori, pressostati, fotocellule e altri elementi.

Questi dispositivi producono o modificano un segnale elettrico.

Il circuito d’ingresso del sistema di controllo riceve tale segnale e, in funzione delle proprie soglie elettriche, determina se esso deve essere interpretato come stato logico 0 oppure come stato logico 1.

Il percorso è quindi:

condizione fisica → segnale elettrico → ingresso → 0/1

Soltanto dopo questa conversione il controllore dispone di un bit che può utilizzare nella propria elaborazione logica.

6. Ingressi digitali

Un ingresso digitale è il punto attraverso cui il controllore riceve dal campo un’informazione che può assumere soltanto due stati.

A un ingresso possono essere collegati, per esempio, pulsanti, finecorsa, pressostati, fotocellule, sensori di prossimità o contatti ausiliari, utilizzando contatti NA o NC secondo la funzione richiesta.

Il dispositivo esterno modifica la condizione elettrica presente sul morsetto d’ingresso. Il circuito elettronico del controllore rileva questa condizione e rende disponibile alla logica interna il corrispondente stato digitale.

Il percorso è:

dispositivo di campo → segnale elettrico → ingresso digitale → stato logico

Un ingresso digitale non misura il valore di una grandezza, ma rileva soltanto quale dei due stati previsti è presente.

Un pressostato, per esempio, non comunica al controllore una pressione di 4,7 bar: segnala soltanto se la pressione si trova da una parte o dall’altra della soglia impostata.

Allo stesso modo, un finecorsa non fornisce la posizione esatta di un organo meccanico: segnala soltanto se la posizione associata al suo intervento è stata raggiunta oppure no.

Il riferimento elettrico

Perché un ingresso possa riconoscere correttamente un segnale, deve esistere anche un riferimento elettrico comune tra il circuito di campo e il modulo d’ingresso.

Non è quindi sufficiente collegare semplicemente l’uscita di un sensore al morsetto dell’ingresso: occorre rispettare lo schema previsto dal costruttore e collegare correttamente alimentazione, riferimento e segnale.

Sensori PNP e NPN

Molti sensori industriali digitali utilizzano uscite elettroniche di tipo PNP oppure NPN.

Un sensore PNP, quando attivo, porta verso l’ingresso una tensione positiva rispetto al riferimento comune.

Un sensore NPN, quando attivo, porta invece il segnale verso il riferimento a 0 V.

Il modulo d’ingresso deve essere compatibile con il tipo di uscita utilizzato dal sensore. PNP e NPN non sono quindi due modi diversi di indicare lo stesso segnale, ma due differenti modalità di collegamento elettrico.

Nel caso tipico di un sensore a tre fili sono presenti:

  • un filo per l’alimentazione positiva;
  • un filo per lo 0 V;
  • un filo di uscita collegato all’ingresso del controllore.

Il colore dei conduttori e lo schema di collegamento devono comunque essere verificati sulla documentazione del sensore.

Tempi di risposta e filtraggio

Un ingresso digitale non reagisce necessariamente a qualsiasi variazione, indipendentemente dalla sua durata.

I moduli d’ingresso possono utilizzare filtri per evitare che disturbi elettrici, rimbalzi dei contatti o variazioni molto brevi vengano interpretati come cambiamenti reali dello stato.

Di conseguenza, un impulso troppo breve può non essere riconosciuto dal controllore.

Questo aspetto diventa importante quando si devono acquisire segnali rapidi, per esempio impulsi provenienti da encoder, sensori di conteggio o dispositivi che cambiano stato molto velocemente. In questi casi possono essere necessari ingressi specifici ad alta velocità.

Protezione e isolamento

Il morsetto d’ingresso non è collegato direttamente alla parte logica del controllore.

Tra il segnale proveniente dal campo e l’elettronica interna sono normalmente presenti circuiti destinati ad adattare e proteggere il segnale e, in molti dispositivi, a realizzare anche una separazione elettrica tra campo e parte logica.

Questo permette al controllore di ricevere segnali provenienti dall’impianto senza esporre direttamente la propria elettronica interna alle condizioni elettriche presenti sul campo.

Diagnostica

La lettura di un ingresso fornisce uno stato, ma non sempre permette di conoscere direttamente la causa che lo ha prodotto.

Se un ingresso rimane a 0, per esempio, le cause potrebbero essere diverse:

  • il sensore non è intervenuto;
  • manca l’alimentazione del sensore;
  • il collegamento è interrotto;
  • il dispositivo è guasto.

Per questo, negli impianti più complessi, il semplice stato dell’ingresso viene spesso affiancato da ulteriori segnali, controlli o funzioni diagnostiche.

Esempio di collegamento

Consideriamo un sensore di prossimità PNP a tre fili alimentato a 24 V in corrente continua.

Il sensore viene alimentato attraverso i due conduttori dedicati. Il terzo conduttore costituisce l’uscita e viene collegato a un ingresso digitale del controllore.

Quando il sensore rileva l’oggetto, la sua uscita commuta e il segnale raggiunge il morsetto d’ingresso. Il controllore acquisisce così il cambiamento di stato e può utilizzarlo nel programma di automazione.

La catena completa diventa:

presenza dell’oggetto → sensore → uscita elettrica → ingresso digitale → stato utilizzabile dal programma

7. Ingressi analogici

Un ingresso digitale distingue soltanto due stati. Un ingresso analogico, invece, permette al controllore di acquisire un valore che può variare all’interno di un determinato intervallo.

È il caso, per esempio, della misura di:

  • temperatura;
  • pressione;
  • livello;
  • portata;
  • posizione;
  • tensione;
  • corrente.

Il sensore o il trasmettitore converte la grandezza fisica da misurare in un segnale elettrico compatibile con l’ingresso del controllore.

In ambito industriale sono molto comuni segnali come:

0–10 V

oppure:

4–20 mA

Un trasmettitore di pressione, per esempio, può essere configurato in modo che:

4 mA = 0 bar

20 mA = 10 bar

Tra questi due estremi, il valore della corrente varia in relazione alla pressione misurata. Una corrente di 12 mA, trovandosi a metà dell’intervallo 4–20 mA, corrisponde in questo esempio a una pressione di 5 bar.

La relazione tra segnale elettrico e grandezza fisica prende il nome di scalatura.

Il percorso diventa quindi:

grandezza fisica → sensore o trasmettitore → segnale analogico → ingresso analogico → valore numerico

Conversione analogico-digitale

Il controllore lavora internamente con valori digitali. Il segnale analogico ricevuto deve quindi essere convertito in un numero.

Questa operazione viene eseguita da un convertitore analogico-digitale, indicato normalmente con la sigla ADC.

L’ADC suddivide il campo disponibile in un numero finito di livelli.

Il numero di livelli dipende dalla risoluzione del convertitore.

Per esempio:

  • 8 bit → 2⁸ = 256 livelli;
  • 10 bit → 2¹⁰ = 1024 livelli;
  • 12 bit → 2¹² = 4096 livelli;
  • 16 bit → 2¹⁶ = 65 536 livelli.

Un ingresso analogico non può quindi distinguere un numero infinito di valori: ogni misura viene associata a uno dei livelli disponibili.

Aumentando il numero di bit aumenta il numero dei livelli e diventa possibile distinguere variazioni più piccole del segnale.

Campo di misura e scalatura

Il valore numerico prodotto dall’ingresso non coincide necessariamente con la grandezza che interessa all’operatore.

Supponiamo ancora di utilizzare un trasmettitore:

4–20 mA → 0–10 bar

Il controllore acquisisce il segnale elettrico e lo converte in un valore numerico. Il programma deve poi associare quel valore alla corrispondente pressione.

La scalatura permette quindi di passare dal valore acquisito alla relativa unità fisica:

valore acquisito → 6,3 bar

anziché lavorare direttamente con il valore interno generato dal convertitore.

Segnale 0–10 V

Un altro segnale analogico molto utilizzato è 0–10 V.

In questo caso il valore della grandezza misurata viene rappresentato da una tensione compresa tra 0 e 10 V.

Per esempio, un trasmettitore di pressione con campo 0–10 bar potrebbe fornire:

0 V = 0 bar
5 V = 5 bar
10 V = 10 bar

Anche in questo caso i valori intermedi vengono convertiti proporzionalmente.

A differenza del 4–20 mA, nel segnale 0–10 V il valore minimo della grandezza corrisponde normalmente a 0 V. Per questo una tensione nulla può essere più difficile da distinguere da alcune condizioni di guasto, come un’interruzione del collegamento.

Il segnale in tensione è inoltre più sensibile alle cadute di tensione e ai disturbi lungo il collegamento rispetto a una trasmissione in corrente; per questo la scelta tra 0–10 V e 4–20 mA dipende anche dalla distanza, dall’ambiente e dalle caratteristiche dell’impianto.

Perché si utilizza 4–20 mA

Nel segnale 4–20 mA lo zero della grandezza misurata non corrisponde a una corrente nulla.

Nel nostro esempio:

4 mA = 0 bar

Questo permette di distinguere, almeno in determinate condizioni, una misura pari al minimo del campo da un’anomalia come l’interruzione del circuito, che può portare la corrente verso 0 mA.

Il valore di 4 mA viene per questo indicato come zero vivo.

Il segnale in corrente presenta inoltre vantaggi nella trasmissione su distanze relativamente elevate e una buona resistenza ai disturbi rispetto a molte trasmissioni in tensione.

Valori fuori campo

Un ingresso analogico può ricevere anche un valore al di fuori dell’intervallo previsto.

Un segnale inferiore o superiore al campo nominale può indicare, a seconda del dispositivo e dell’impianto:

  • una condizione fuori scala;
  • un guasto del sensore;
  • un’interruzione o un problema del collegamento;
  • un valore reale che ha superato il campo previsto.

Il programma può quindi controllare non soltanto il valore della misura, ma anche la sua plausibilità.

8. Ingressi speciali

Non tutti i segnali utilizzati nell’automazione possono essere trattati semplicemente come ingressi digitali ordinari oppure come ingressi analogici generici.

Alcune applicazioni richiedono circuiti d’ingresso progettati per acquisire particolari tipi di segnale.

Tra i più comuni troviamo:

  • ingressi per conteggio veloce;
  • ingressi in frequenza;
  • ingressi per encoder;
  • ingressi per termocoppie;
  • ingressi per termoresistenze, come Pt100 e Pt1000.

Conteggio veloce e frequenza

Un normale ingresso digitale può non essere adatto a segnali che cambiano stato molto rapidamente.

Per contare impulsi ad alta frequenza si utilizzano quindi ingressi veloci o contatori hardware, capaci di acquisire eventi senza dipendere esclusivamente dal normale ciclo di elaborazione del programma.

Questi ingressi possono essere utilizzati, per esempio, per:

  • conteggiare pezzi;
  • misurare una frequenza;
  • determinare una velocità;
  • acquisire impulsi provenienti da determinati sensori.

Encoder

Gli encoder producono sequenze di impulsi che permettono di ricavare informazioni sul movimento.

A seconda del tipo di encoder e dell’interfaccia utilizzata, il controllore può determinare grandezze come:

  • posizione;
  • spostamento;
  • velocità;
  • direzione di movimento.

Gli encoder incrementali, per esempio, possono fornire due segnali impulsivi sfasati tra loro. Dal loro ordine il sistema può determinare anche il verso di rotazione.

Termocoppie e termoresistenze

Anche la temperatura può richiedere ingressi specifici.

Una termocoppia genera una piccola tensione legata alla differenza di temperatura e richiede un circuito di misura adatto al tipo di termocoppia utilizzato.

Una termoresistenza, come una Pt100, varia invece la propria resistenza elettrica in funzione della temperatura.

Questi sensori non vengono quindi collegati indifferentemente a un normale ingresso 0–10 V o 4–20 mA, salvo utilizzare un apposito trasmettitore che converta preventivamente il loro segnale.

Il tipo di ingresso deve sempre essere scelto in funzione del segnale che deve essere acquisito.

Con questi dispositivi si completa il quadro generale degli ingressi:

ingressi digitali → stati 0/1

ingressi analogici → valori variabili

ingressi speciali → segnali che richiedono modalità di acquisizione dedicate

9. Uscite digitali

Dopo aver acquisito e interpretato le informazioni provenienti dagli ingressi, il controllore deve poter comandare dispositivi esterni. Questo avviene attraverso le uscite.

Un’uscita digitale può assumere due stati logici:

0 oppure 1

e viene utilizzata per comandare dispositivi che richiedono due condizioni distinte, per esempio:

  • lampada spenta / accesa;
  • relè diseccitato / eccitato;
  • elettrovalvola chiusa / aperta;
  • contattore diseccitato / eccitato;
  • segnalatore acustico inattivo / attivo.

Il percorso è quindi opposto a quello degli ingressi:

stato logico → uscita digitale → segnale elettrico → dispositivo di campo

Il controllore decide, attraverso il programma, quale stato assegnare all’uscita. Il circuito elettronico del modulo di uscita trasforma quindi quello stato logico in una condizione elettrica utilizzabile all’esterno.

Comando e potenza

Un’uscita del controllore non è necessariamente in grado di alimentare direttamente il dispositivo che deve essere comandato.

Una piccola lampada di segnalazione o la bobina di un relè possono, in alcuni casi, essere collegate direttamente all’uscita, purché tensione e corrente siano compatibili con le caratteristiche dichiarate dal costruttore.

Un motore, una resistenza di potenza o un altro carico che richiede correnti elevate non vengono invece alimentati direttamente dall’uscita del controllore.

In questi casi l’uscita comanda un dispositivo intermedio, per esempio un relè o un contattore, che a sua volta alimenta il carico.

Per esempio:

uscita del controllore → bobina del contattore → contatti di potenza → motore

Il controllore fornisce quindi il comando, mentre il circuito di potenza fornisce l’energia necessaria all’utilizzatore.

Uscite a relè

Nelle uscite a relè il controllore comanda internamente una bobina che apre o chiude uno o più contatti.

Il contatto del relè costituisce una separazione elettrica tra il circuito interno del controllore e il circuito comandato.

Le uscite a relè possono essere utilizzate con differenti tensioni e, entro i limiti indicati dal costruttore, sia con corrente continua sia con corrente alternata.

Essendo dispositivi elettromeccanici, hanno però una velocità di commutazione limitata e una durata legata anche al numero e alle caratteristiche delle manovre effettuate.

Uscite a transistor

Le uscite a transistor utilizzano componenti elettronici e non possiedono contatti meccanici.

Sono normalmente impiegate con carichi in corrente continua e permettono commutazioni più rapide rispetto alle uscite a relè.

Anche in questo caso è necessario rispettare:

  • tensione ammessa;
  • corrente massima;
  • modalità di collegamento;
  • tipo di uscita previsto dal modulo.

Come per i sensori digitali, le uscite a transistor possono essere realizzate secondo configurazioni differenti, tra cui PNP e NPN.

Uscite a triac

Alcuni moduli utilizzano uscite a triac, destinate al comando di carichi in corrente alternata.

Il triac è un dispositivo elettronico di commutazione e, come il transistor, non utilizza contatti meccanici.

Anche queste uscite devono essere utilizzate entro i limiti di tensione, corrente e tipo di carico indicati dal costruttore.

Alimentazione e comune delle uscite

Le uscite di un controllore non generano necessariamente da sole la tensione necessaria al comando del carico.

In molti moduli l’alimentazione delle uscite deve essere fornita esternamente e collegata ai morsetti previsti. Le uscite possono inoltre essere organizzate in gruppi, ciascuno con un proprio morsetto comune.

Il collegamento deve quindi rispettare lo schema del costruttore, tenendo conto sia dell’alimentazione del modulo sia della disposizione dei comuni.

Carichi induttivi

Bobine di relè, contattori ed elettrovalvole sono carichi induttivi.

Quando la corrente che attraversa una bobina viene interrotta, l’energia accumulata nel campo magnetico può generare una sovratensione.

Per evitare che questa sovratensione danneggi l’uscita o produca disturbi nell’impianto, si utilizzano dispositivi di soppressione adatti al tipo di alimentazione e di carico.

La protezione non deve quindi essere scelta in modo generico, ma in funzione del circuito utilizzato.

Corrente residua e carico minimo

Le uscite elettroniche, in particolare quelle a transistor e a triac, non si comportano esattamente come un contatto meccanico aperto.

Anche quando l’uscita è disattivata può essere presente una piccola corrente residua. Normalmente questa corrente non provoca effetti sul carico, ma con dispositivi particolarmente sensibili può essere sufficiente a generare comportamenti indesiderati.

Nel caso di alcune uscite a triac può inoltre essere necessario rispettare un carico minimo affinché la commutazione avvenga correttamente.

Anche questi valori devono quindi essere verificati nelle caratteristiche tecniche del modulo di uscita e del carico collegato.

Stato comandato e stato reale

Il fatto che il controllore abbia posto un’uscita a 1 significa che ha impartito un comando, non necessariamente che il dispositivo comandato abbia realmente eseguito l’azione.

Per esempio:

uscita motore = 1

significa che il controllore ha richiesto l’avviamento del motore.

Il motore potrebbe però non essere partito a causa di un contattore guasto, di una protezione intervenuta, della mancanza di alimentazione o di un altro problema.

Per conoscere lo stato reale della macchina occorre quindi, quando necessario, utilizzare un segnale di ritorno acquisito attraverso un ingresso.

Si distingue così tra:

comando → ciò che il controllore richiede

e

feedback → ciò che è realmente avvenuto

Questa distinzione è fondamentale nella diagnostica e nel controllo delle macchine automatiche.

Comportamento delle uscite in arresto o guasto

Nel progetto di un sistema automatico è necessario considerare anche cosa accade alle uscite quando il controllore non sta eseguendo normalmente il programma.

Per esempio, la CPU può essere portata in STOP, può verificarsi un errore oppure può mancare l’alimentazione.

A seconda del controllore e della configurazione utilizzata, le uscite possono essere disattivate, mantenere il proprio stato oppure assumere uno stato prestabilito.

Questo comportamento deve essere conosciuto e previsto durante la progettazione, soprattutto quando le uscite comandano dispositivi il cui stato può avere conseguenze sul funzionamento o sulla sicurezza della macchina.

10. Uscite analogiche

Un’uscita digitale può assumere soltanto due stati. Un’uscita analogica, invece, genera un segnale elettrico che può assumere valori differenti all’interno di un intervallo definito.

Viene utilizzata quando non basta comandare semplicemente un dispositivo acceso o spento, ma è necessario indicare quanto deve essere comandato.

Per esempio, un’uscita analogica può essere utilizzata per:

  • fornire il riferimento di velocità a un inverter;
  • comandare l’apertura di una valvola proporzionale;
  • impostare la potenza richiesta a un regolatore;
  • fornire un riferimento a un altro dispositivo di controllo.

Tra i segnali più comuni troviamo:

0–10 V

±10 V

0–20 mA

4–20 mA

Il percorso è:

valore elaborato dal controllore → uscita analogica → segnale elettrico → dispositivo di campo

Uscita 0–10 V

Con un’uscita 0–10 V il controllore genera una tensione proporzionale al valore richiesto.

Supponiamo, per esempio, che un inverter utilizzi:

0 V = 0 Hz

10 V = 50 Hz

Un comando di:

5 V

corrisponde quindi, con una relazione lineare, a:

25 Hz

Il programma non deve necessariamente lavorare direttamente in volt. Può utilizzare, per esempio, una richiesta di velocità espressa in percentuale o in hertz; sarà poi il sistema a convertire quel valore nel corrispondente segnale elettrico.

Per esempio:

richiesta 70 % → 7 V → inverter

Uscita ±10 V

In alcune applicazioni viene utilizzato un campo bipolare, per esempio −10 V … +10 V.

In questo caso anche il segno della tensione può avere un significato.

Per esempio, in un comando di velocità:

−10 V = velocità massima in un verso

0 V = arresto

+10 V = velocità massima nel verso opposto

Il significato effettivo dipende comunque dalla configurazione del dispositivo comandato.

Uscita 4–20 mA

Lo stesso principio può essere applicato a un segnale in corrente.

Supponiamo che una valvola proporzionale utilizzi:

4 mA = 0 %

20 mA = 100 %

Una corrente di:

12 mA

corrisponde al 50 % del campo.

Il controllore può quindi stabilire numericamente l’apertura desiderata e il modulo di uscita genera la corrente corrispondente.

Per esempio:

apertura richiesta 50 % → 12 mA → valvola

Anche nelle uscite analogiche il segnale 4–20 mA presenta il vantaggio dello zero vivo: il valore minimo del comando corrisponde a 4 mA e non a corrente nulla.

Conversione digitale-analogica

Il controllore elabora internamente valori digitali, mentre il dispositivo esterno deve ricevere una tensione o una corrente analogica.

È quindi necessaria una conversione opposta rispetto a quella vista per gli ingressi analogici.

Questa operazione viene effettuata da un convertitore digitale-analogico, normalmente indicato con la sigla DAC.

Il controllore fornisce un valore numerico e il convertitore genera il corrispondente segnale elettrico.

Per esempio:

valore numerico → DAC → 6,4 V

oppure:

valore numerico → DAC → 14,2 mA

Anche un’uscita analogica possiede una determinata risoluzione. Il segnale non può quindi assumere un numero infinito di valori, ma soltanto i livelli consentiti dalla risoluzione del modulo.

Scalatura dell’uscita

Come per gli ingressi analogici, anche nelle uscite è necessario mettere in relazione il valore utilizzato dal programma con il campo elettrico dell’uscita.

Supponiamo di voler comandare un inverter da 0 a 50 Hz attraverso un segnale 0–10 V.

La corrispondenza sarà:

0 Hz → 0 V

25 Hz → 5 V

50 Hz → 10 V

La scalatura permette quindi al programma di lavorare direttamente con la grandezza utile, per esempio gli hertz, lasciando al sistema il compito di ricavare il corrispondente valore dell’uscita.

Collegamento e riferimento elettrico

Anche un’uscita analogica deve essere collegata rispettando lo schema previsto dal costruttore.

Nelle uscite in tensione deve essere presente il corretto riferimento elettrico tra il modulo e il dispositivo comandato.

Nelle uscite in corrente deve invece essere realizzato correttamente il circuito attraverso cui circola la corrente del segnale.

Un collegamento errato del comune, del riferimento o del circuito di corrente può produrre un valore errato oppure impedire completamente il funzionamento dell’uscita.

Limiti dell’uscita

Anche un’uscita analogica deve essere utilizzata entro le proprie caratteristiche elettriche.

Per un’uscita in tensione è necessario rispettare, tra gli altri parametri, il carico che può essere collegato.

Per un’uscita in corrente deve essere rispettato il valore massimo di resistenza complessiva del circuito entro il quale il modulo riesce a mantenere la corrente richiesta.

Un collegamento non corretto o un carico incompatibile può quindi impedire all’uscita di generare il valore previsto.

Tempo di aggiornamento

Il valore di un’uscita analogica non viene necessariamente modificato in modo istantaneo.

Il modulo possiede un proprio tempo di conversione e di aggiornamento, cioè il tempo necessario per trasformare il nuovo valore numerico nel corrispondente segnale elettrico.

Nella maggior parte dei comandi relativamente lenti questo tempo non costituisce un problema. Diventa invece importante nelle applicazioni in cui il riferimento deve variare rapidamente o con una frequenza elevata.

Comando analogico e valore reale

Anche nel caso di un’uscita analogica bisogna distinguere il valore comandato dal valore realmente ottenuto nel processo.

Se il controllore comanda:

50 % di apertura della valvola

significa che ha generato il segnale corrispondente alla richiesta del 50 %.

Questo non dimostra, da solo, che la valvola abbia raggiunto realmente quella posizione.

Quando è necessario conoscere il risultato effettivo, si utilizza un segnale di ritorno, per esempio proveniente da un sensore di posizione, da un trasmettitore o direttamente dal dispositivo comandato.

Si ritrova quindi lo stesso principio già visto per le uscite digitali:

comando → azione richiesta

feedback → risultato realmente rilevato

Guasti e diagnostica

Anche il circuito di uscita analogica può essere interessato da anomalie.

A seconda del tipo di modulo, possono essere rilevate condizioni come:

  • interruzione del circuito;
  • cortocircuito;
  • carico non compatibile;
  • impossibilità di raggiungere il valore richiesto;
  • valore fuori dal campo ammesso.

Quando il modulo dispone di funzioni diagnostiche, queste informazioni possono essere utilizzate dal controllore per generare allarmi o adottare una condizione di funzionamento prevista in caso di guasto.

11. Uscite speciali

Non tutti i comandi possono essere realizzati con una semplice uscita digitale ON/OFF oppure con un’uscita analogica.

Alcune applicazioni richiedono segnali che devono essere generati con una determinata frequenza, una precisa durata degli impulsi o una particolare sequenza temporale. Per queste funzioni vengono utilizzate uscite dedicate, normalmente realizzate mediante circuiti hardware specifici del controllore.

Tra le più comuni troviamo:

  • uscite PWM;
  • uscite impulsive veloci;
  • uscite PTO;
  • uscite STEP/DIR per azionamenti e motori passo-passo;
  • uscite dedicate al controllo rapido o sincronizzato del movimento.

PWM

PWM significa Pulse Width Modulation, cioè modulazione della larghezza dell’impulso.

L’uscita non genera una tensione analogica continuamente variabile. Commuta invece rapidamente tra due stati, 0 e 1.

Ciò che viene modificato è il rapporto tra il tempo durante il quale l’uscita rimane attiva e la durata complessiva del ciclo.

Questo rapporto prende il nome di duty cycle.

Per esempio:

0 % → uscita sempre disattivata

25 % → uscita attiva per un quarto del periodo

50 % → uscita attiva per metà del periodo

100 % → uscita sempre attiva

Con un duty cycle del 50 %, quindi, l’uscita non sta generando metà della propria tensione nominale: continua a commutare tra i due livelli elettrici previsti, ma rimane attiva per metà del tempo.

Un segnale PWM può essere utilizzato, per esempio, per:

  • regolare la potenza media fornita a determinati carichi;
  • comandare alcuni azionamenti;
  • regolare la luminosità di sorgenti luminose compatibili;
  • fornire un riferimento a dispositivi progettati per ricevere questo tipo di segnale.

La frequenza del PWM e il duty cycle devono essere compatibili con il dispositivo comandato.

Frequenza e periodo

Un segnale impulsivo è caratterizzato anche dalla propria frequenza, cioè dal numero di cicli prodotti in un secondo.

La frequenza viene espressa in hertz:

1 Hz = 1 ciclo al secondo

100 Hz = 100 cicli al secondo

1 kHz = 1000 cicli al secondo

Il periodo è invece il tempo necessario per completare un ciclo.

Frequenza e periodo sono legati dalla relazione:

T = 1 / f

dove:

  • T è il periodo;
  • f è la frequenza.

Per esempio, un segnale a 100 Hz ha un periodo di:

1 / 100 = 0,01 s = 10 ms

La frequenza stabilisce quindi quanto rapidamente vengono ripetuti gli impulsi, mentre il duty cycle stabilisce per quale parte di ciascun periodo l’uscita rimane attiva.

Uscite impulsive veloci

Una normale uscita digitale viene generalmente comandata dal programma durante il normale funzionamento del controllore.

Quando è necessario generare impulsi molto rapidi o con intervalli temporali precisi, questo metodo può non essere sufficiente.

Si utilizzano allora uscite veloci, nelle quali la generazione degli impulsi viene affidata a circuiti hardware dedicati.

Questo permette di ottenere segnali più regolari e precisi senza dipendere direttamente dal tempo necessario alla CPU per eseguire ciclicamente il programma.

Le uscite a relè non sono adatte a questo tipo di funzionamento, perché utilizzano contatti meccanici e hanno tempi di commutazione e durata incompatibili con frequenze elevate.

Per le uscite veloci vengono normalmente utilizzati dispositivi elettronici, per esempio uscite a transistor.

PTO

PTO significa Pulse Train Output, cioè uscita a treno di impulsi.

Il controllore genera una successione precisa di impulsi destinata, per esempio, a un azionamento.

In molte applicazioni il numero degli impulsi rappresenta lo spostamento richiesto, mentre la loro frequenza determina la velocità con cui deve avvenire il movimento.

In forma semplificata:

numero di impulsi → quantità di movimento

frequenza degli impulsi → velocità di movimento

Se, per esempio, un azionamento è configurato in modo che 1000 impulsi corrispondano a una determinata rotazione, il controllore può ordinare quello spostamento generando esattamente il numero previsto di impulsi.

Il rapporto reale tra impulsi e movimento dipende comunque dalla configurazione dell’azionamento, del motore e della parte meccanica.

Comando STEP/DIR

Una modalità molto utilizzata per comandare motori passo-passo e alcuni azionamenti è l’interfaccia STEP/DIR.

Sono presenti normalmente due segnali principali:

STEP → fornisce gli impulsi di avanzamento;

DIR → stabilisce la direzione del movimento.

Ogni impulso STEP ordina all’azionamento un incremento di posizione secondo la configurazione impostata.

Il segnale DIR determina invece il verso nel quale questi incrementi devono essere eseguiti.

In forma concettuale:

DIR → verso

STEP → quantità e velocità del movimento

Il numero degli impulsi determina infatti lo spostamento complessivo, mentre la frequenza degli impulsi influenza la velocità.

Il controllore può inoltre modificare progressivamente la frequenza per realizzare rampe di accelerazione e decelerazione.

Controllo del movimento

Nelle applicazioni più evolute non è sufficiente generare semplicemente una successione di impulsi.

Può essere necessario controllare:

  • posizione;
  • velocità;
  • accelerazione;
  • decelerazione;
  • arresto;
  • sincronizzazione tra più assi.

In questi casi il controllore può utilizzare funzioni hardware e software dedicate al motion control.

Il programma stabilisce il movimento richiesto, mentre le funzioni dedicate si occupano di generare i segnali con la precisione temporale necessaria.

A seconda del sistema, il comando dell’azionamento può avvenire mediante impulsi oppure attraverso una rete di comunicazione industriale dedicata al controllo del movimento.

Precisione temporale

La caratteristica principale di queste uscite è la necessità di rispettare tempi precisi.

Un impulso generato troppo presto, troppo tardi o con una durata errata può modificare il comportamento del dispositivo comandato.

Per questo la generazione di segnali veloci viene normalmente affidata a funzioni hardware specifiche e non alla semplice accensione e spegnimento ciclico di una normale uscita all’interno del programma.

Si distingue quindi tra:

uscita digitale ordinaria → comando di uno stato

e

uscita veloce o speciale → generazione controllata di impulsi nel tempo

Compatibilità elettrica

Anche quando il segnale è corretto dal punto di vista logico e temporale, deve essere compatibile elettricamente con l’ingresso del dispositivo comandato.

Devono quindi essere verificati, tra gli altri:

  • tensione;
  • corrente;
  • tipo di uscita;
  • frequenza massima;
  • tipo di ingresso dell’azionamento;
  • modalità di collegamento prevista dal costruttore.

Un’uscita capace di generare correttamente un treno di impulsi non è automaticamente compatibile con qualsiasi azionamento.

Riepilogo delle uscite

Le principali famiglie di uscite possono quindi essere distinte in questo modo:

uscite digitali → due stati, 0/1

uscite analogiche → valore variabile entro un campo

uscite speciali → segnali generati con caratteristiche temporali definite

Con questo si completa il quadro generale degli ingressi e delle uscite del controllore.

12. Logica booleana e condizioni

Una volta acquisiti gli ingressi, il controllore deve stabilire quando eseguire una determinata azione.

Per farlo utilizza condizioni logiche che possono assumere soltanto due risultati:

VERO

oppure

FALSO

Questi due risultati possono essere rappresentati anche come:

1 = VERO

0 = FALSO

La logica che utilizza valori di questo tipo prende il nome di logica booleana.

Il nome deriva da George Boole, matematico che sviluppò un sistema algebrico basato su valori logici e sulle operazioni che possono essere eseguite tra essi.

In automazione, la logica booleana permette di combinare gli stati degli ingressi, delle uscite e delle variabili interne per stabilire se una determinata condizione è soddisfatta.

Per esempio:

se il pulsante START è premuto, il consenso è presente e non è attivo alcun allarme, allora può essere richiesto l’avviamento del motore.

La decisione non dipende quindi necessariamente da un solo ingresso, ma può essere il risultato della combinazione di molte condizioni.

Operatore NOT

L’operatore NOT inverte il valore logico di una condizione.

Se la condizione è 0, il risultato diventa 1.

Se la condizione è 1, il risultato diventa 0.

Tabella di verità:

A NOT A

0 1

1 0

Per esempio, supponiamo di avere:

ALLARME = 1 quando è presente un allarme.

La condizione:

NOT ALLARME

sarà vera soltanto quando l’allarme non è presente.

Quindi:

ALLARME = 0 → NOT ALLARME = 1

ALLARME = 1 → NOT ALLARME = 0

In una condizione di avviamento potremmo quindi utilizzare:

START AND NOT ALLARME

Il comando sarà consentito soltanto se START è vero e contemporaneamente ALLARME è falso.

Operatore AND

L’operatore AND produce un risultato vero soltanto quando tutte le condizioni collegate sono vere.

Tabella di verità con due condizioni:

A B A AND B

0 0 0

0 1 0

1 0 0

1 1 1

Per esempio, un motore può essere autorizzato a partire soltanto quando:

  • il pulsante START è premuto;
  • il riparo è chiuso.

La condizione sarà:

START AND RIPARO_CHIUSO

Il risultato sarà vero soltanto quando entrambe le condizioni saranno vere.

Se anche una sola delle due è falsa, il risultato sarà falso.

Con più condizioni il principio non cambia.

Per esempio:

START AND RIPARO_CHIUSO AND PRESSIONE_OK

sarà vero soltanto se tutte e tre le condizioni saranno contemporaneamente vere.

L’operatore AND viene quindi utilizzato quando sono necessari più consensi contemporaneamente.

Operatore OR

L’operatore OR produce un risultato vero quando è vera almeno una delle condizioni considerate.

Tabella di verità:

A B A OR B

0 0 0

0 1 1

1 0 1

1 1 1

Per esempio, supponiamo che un allarme debba attivarsi quando viene rilevata almeno una delle seguenti condizioni:

  • temperatura troppo alta;
  • pressione troppo alta.

La condizione sarà:

TEMPERATURA_ALTA OR PRESSIONE_ALTA

L’allarme sarà quindi attivo se:

  • è alta soltanto la temperatura;
  • è alta soltanto la pressione;
  • sono alte entrambe.

Sarà falso soltanto quando entrambe le condizioni saranno false.

L’operatore OR viene quindi utilizzato quando è sufficiente che si verifichi almeno una tra più condizioni.

Combinazione degli operatori

NOT, AND e OR possono essere utilizzati insieme.

Supponiamo che un motore possa partire quando:

  • viene richiesto START;
  • il riparo è chiuso;
  • non è presente un allarme.

La condizione può essere espressa come:

START AND RIPARO_CHIUSO AND NOT ALLARME

Il risultato sarà vero soltanto se:

START = 1

RIPARO_CHIUSO = 1

ALLARME = 0

Se una qualsiasi di queste condizioni non viene rispettata, il risultato sarà falso.

Le condizioni possono diventare anche più articolate.

Per esempio:

(START_LOCALE OR START_REMOTO) AND RIPARO_CHIUSO AND NOT ALLARME

In questo caso l’avviamento può essere richiesto da due sorgenti diverse:

  • comando locale;
  • comando remoto.

È sufficiente che una delle due richieste sia presente, ma devono comunque essere rispettate anche le altre condizioni.

Uso delle parentesi

Quando vengono combinati più operatori, le parentesi permettono di indicare chiaramente quali condizioni devono essere valutate insieme.

Consideriamo:

(A OR B) AND C

Prima viene valutato:

A OR B

e il risultato viene successivamente combinato con C mediante AND.

Questa espressione non equivale necessariamente a:

A OR (B AND C)

Per esempio, con:

A = 1

B = 0

C = 0

si ottiene:

(1 OR 0) AND 0 = 1 AND 0 = 0

mentre:

1 OR (0 AND 0) = 1 OR 0 = 1

Le parentesi possono quindi cambiare completamente il risultato della logica.

Per questo, quando una condizione contiene più operatori, è utile rendere esplicito il raggruppamento anche quando il linguaggio di programmazione prevede già proprie regole di priorità.

Condizione logica e dispositivo fisico

Una variabile logica non coincide necessariamente con il dispositivo fisico dal quale deriva.

Per esempio, un finecorsa può essere collegato a un ingresso digitale, ma nel programma può essere utilizzata una variabile con un significato più chiaro, come:

PORTA_CHIUSA

Il controllore può quindi leggere fisicamente un ingresso e utilizzare quel valore per determinare una condizione logica.

In forma semplificata:

finecorsa → ingresso digitale → PORTA_CHIUSA

Questo permette di costruire il programma ragionando sul significato della condizione, anziché soltanto sul numero del morsetto utilizzato.

Per esempio:

START AND PORTA_CHIUSA AND PRESSIONE_OK

è più comprensibile di una sequenza costituita soltanto da indirizzi numerici degli ingressi.

Una condizione non è necessariamente un ingresso

Una condizione logica può derivare da:

  • un ingresso digitale;
  • il confronto di un valore analogico;
  • lo stato di un’uscita;
  • una variabile interna;
  • un temporizzatore;
  • un contatore;
  • il risultato di un’altra espressione logica.

Per esempio, da una misura analogica di temperatura si può ricavare:

TEMPERATURA_ALTA = temperatura > 80 °C

Il valore della temperatura è analogico, ma il risultato del confronto è logico:

temperatura = 72 °C → TEMPERATURA_ALTA = 0

temperatura = 85 °C → TEMPERATURA_ALTA = 1

Questo risultato può poi essere utilizzato insieme ad altre condizioni:

TEMPERATURA_ALTA OR PRESSIONE_ALTA

La logica booleana non lavora quindi soltanto direttamente con pulsanti e finecorsa, ma con qualsiasi informazione che possa essere ricondotta a una condizione vera o falsa.

Esempio completo

Supponiamo di voler autorizzare il funzionamento di una pompa soltanto quando:

  • è presente una richiesta di avviamento;
  • il livello minimo è garantito;
  • la pressione non è troppo alta;
  • non è presente un allarme generale.

Possiamo definire:

START = richiesta di avviamento

LIVELLO_OK = livello sufficiente

PRESSIONE_ALTA = pressione oltre il limite

ALLARME = allarme generale presente

La condizione di comando sarà:

START AND LIVELLO_OK AND NOT PRESSIONE_ALTA AND NOT ALLARME

Se:

START = 1

LIVELLO_OK = 1

PRESSIONE_ALTA = 0

ALLARME = 0

allora il risultato sarà:

1 AND 1 AND 1 AND 1 = 1

e la condizione di funzionamento sarà vera.

Se invece interviene l’allarme:

ALLARME = 1

allora:

NOT ALLARME = 0

e l’intera espressione diventa falsa.

La logica booleana permette quindi di trasformare le informazioni disponibili nel sistema in condizioni precise per prendere decisioni automatiche.

13. Memoria e autoritenuta

Finora abbiamo considerato condizioni che dipendono direttamente dallo stato presente degli ingressi o delle variabili.

In molti automatismi, però, è necessario che il controllore ricordi che un evento è avvenuto, anche quando il segnale che lo ha generato non è più presente.

Un pulsante START, per esempio, viene normalmente premuto solo per un breve istante. Se il funzionamento del motore dipendesse direttamente dallo stato del pulsante, il motore rimarrebbe comandato soltanto finché il pulsante resta premuto.

Serve quindi una memoria dello stato.

Il principio è:

evento momentaneo → memorizzazione → stato mantenuto

Condizione istantanea e condizione memorizzata

Una condizione istantanea esiste soltanto finché rimane vera la causa che la produce.

Per esempio:

START = 1 finché il pulsante è premuto.

Quando il pulsante viene rilasciato:

START = 0

Una condizione memorizzata può invece continuare a essere vera anche dopo che il segnale iniziale è tornato a zero.

Per esempio:

START premuto → MARCIA = 1

Dopo il rilascio del pulsante:

START = 0

ma:

MARCIA = 1

Lo stato MARCIA viene mantenuto fino a quando non si verifica una condizione che ne provoca la cancellazione.

Autoritenuta

Una delle applicazioni più semplici della memoria è l’autoritenuta.

Consideriamo due pulsanti:

START

STOP

Quando viene premuto START, viene attivato lo stato di marcia.

Una volta attivato, lo stato stesso contribuisce a mantenere vera la condizione anche dopo il rilascio del pulsante START.

In forma logica semplificata:

(START OR MARCIA) AND CONSENSO_STOP → MARCIA

Il termine START OR MARCIA significa che la condizione può essere mantenuta vera sia dal comando iniziale START sia dallo stato MARCIA già attivo.

Quando viene meno il consenso di STOP, la condizione diventa falsa e la memoria viene interrotta.

Il funzionamento è quindi:

  1. START viene premuto;
  2. MARCIA diventa vera;
  3. START viene rilasciato;
  4. MARCIA rimane vera grazie all’autoritenuta;
  5. viene azionato STOP;
  6. MARCIA torna falsa.

L’autoritenuta permette quindi di trasformare un comando momentaneo in uno stato che permane nel tempo.

SET e RESET

Un altro modo per realizzare una memoria consiste nell’utilizzare due operazioni distinte:

SET → imposta uno stato a 1;

RESET → riporta lo stato a 0.

Per esempio:

START → SET MARCIA

STOP → RESET MARCIA

Premendo START:

MARCIA = 1

e questo valore rimane memorizzato anche quando START torna a 0.

Premendo STOP:

MARCIA = 0

e il valore rimane a zero fino a un nuovo SET.

SET e RESET permettono quindi di separare chiaramente l’evento che attiva uno stato da quello che lo disattiva.

Autoritenuta e SET/RESET

Autoritenuta e SET/RESET possono produrre un comportamento simile, ma non sono la stessa cosa.

Nell’autoritenuta lo stato viene mantenuto attraverso la stessa logica che lo determina.

Nel SET/RESET, invece, viene modificato direttamente uno stato memorizzato.

In forma concettuale:

autoritenuta → la condizione continua a mantenere se stessa

SET/RESET → eventi distinti scrivono e cancellano uno stato memorizzato

La scelta dipende dal tipo di automazione, dal linguaggio utilizzato e dalla chiarezza che si vuole ottenere nel programma.

Priorità tra SET e RESET

È necessario stabilire cosa deve accadere se SET e RESET risultano veri contemporaneamente.

Le possibilità principali sono:

  • priorità al SET;
  • priorità al RESET.

Il comportamento non deve essere lasciato implicito.

Per esempio, in una memoria con priorità al RESET:

SET = 1

RESET = 1

produce:

stato = 0

In una memoria con priorità al SET, nelle stesse condizioni:

stato = 1

La priorità deve quindi essere scelta in funzione del comportamento richiesto e della funzione svolta dalla memoria.

Quando lo stato è legato all’arresto o a una condizione che deve impedire il funzionamento, normalmente si progetta la logica in modo che la condizione di arresto abbia la precedenza sul comando di avviamento.

Memoria di stato

La memoria non viene utilizzata soltanto per mantenere una marcia.

Può servire anche per ricordare:

  • che un ciclo è iniziato;
  • che una determinata fase è stata completata;
  • che si è verificato un evento;
  • che è stato riconosciuto un allarme;
  • quale modalità di funzionamento è stata selezionata;
  • quale stato della sequenza deve essere eseguito.

Per esempio:

CICLO_AVVIATO = 1

può indicare che la macchina ha ricevuto il comando di partenza e si trova all’interno di un ciclo automatico, anche se il pulsante START è stato rilasciato da tempo.

In questo modo il programma non dipende soltanto da ciò che sta accadendo nell’istante presente, ma anche da ciò che è accaduto in precedenza.

Memoria volatile e memoria ritentiva

Non tutte le memorie vengono conservate quando il controllore viene spento o riavviato.

Una memoria volatile perde il proprio valore quando viene meno l’alimentazione o quando il controllore viene inizializzato, secondo il comportamento previsto dal sistema.

Una memoria ritentiva conserva invece il proprio valore anche dopo una perdita di alimentazione o un riavvio, entro le modalità previste dal controllore.

Per esempio, potrebbe essere utile conservare:

  • un conteggio di produzione;
  • un parametro impostato dall’operatore;
  • il numero di ore di funzionamento;
  • un dato necessario alla ripresa del processo.

Non è invece automaticamente corretto rendere ritentivo uno stato come:

MOTORE_IN_MARCIA

perché, dopo un ritorno dell’alimentazione, il semplice ripristino di quel bit potrebbe non corrispondere alle condizioni reali della macchina.

La ritentività deve quindi essere scelta intenzionalmente in funzione del significato della variabile.

Avviamento, STOP e ritorno dell’alimentazione

Quando un controllore passa in STOP, viene riavviato oppure perde e recupera l’alimentazione, il comportamento delle memorie dipende dalla configurazione e dal tipo di variabile utilizzata.

Alcuni stati possono essere azzerati.

Altri possono essere mantenuti.

Altri ancora possono essere inizializzati dal programma a un valore prestabilito.

Per questo, nella progettazione di un automatismo bisogna stabilire esplicitamente:

  • quali stati devono essere persi;
  • quali devono essere conservati;
  • quali devono essere ricostruiti leggendo nuovamente le condizioni reali della macchina.

La presenza di una memoria interna non garantisce infatti che il mondo fisico si trovi ancora nello stesso stato memorizzato prima dell’interruzione.

Memoria e realtà fisica

Supponiamo che il controllore abbia memorizzato:

VALVOLA_APERTA = 1

Dopo una mancanza di alimentazione la valvola potrebbe essersi chiusa meccanicamente.

Se il controllore conserva semplicemente il bit VALVOLA_APERTA = 1, lo stato memorizzato non corrisponde più necessariamente allo stato reale.

Quando questa distinzione è importante, occorre utilizzare un feedback reale, per esempio un finecorsa o un sensore di posizione.

Si deve quindi distinguere tra:

stato memorizzato → ciò che il programma ricorda

e

stato reale → ciò che viene effettivamente rilevato sulla macchina

Uso della memoria nella logica

Una memoria deve rappresentare uno stato che ha realmente bisogno di essere mantenuto nel tempo.

Non dovrebbe essere utilizzata semplicemente per evitare di costruire correttamente una condizione logica.

Ogni stato memorizzato dovrebbe avere almeno:

  • una condizione chiara che lo attiva;
  • una condizione chiara che lo disattiva;
  • un comportamento definito al riavvio;
  • un significato preciso all’interno del processo.

Questo rende il programma più semplice da comprendere e soprattutto permette di sapere sempre perché un determinato stato è rimasto attivo.

Esempio completo

Consideriamo un motore comandato da:

START

STOP

e da un consenso generale:

CONSENSO_OK

Il funzionamento richiesto è:

  • premendo START il motore deve iniziare a funzionare;
  • rilasciando START deve continuare a funzionare;
  • premendo STOP deve arrestarsi;
  • se viene meno CONSENSO_OK deve arrestarsi.

Lo stato memorizzato può essere:

MARCIA

La logica concettuale è:

START → attivazione MARCIA

MARCIA → mantenimento della marcia

STOP oppure perdita CONSENSO_OK → disattivazione MARCIA

Il comando dell’uscita motore potrà quindi dipendere dallo stato MARCIA e dalle ulteriori condizioni richieste dal sistema.

La memoria introduce così un concetto fondamentale dell’automazione:

il comportamento del sistema può dipendere non soltanto dagli ingressi presenti in questo momento, ma anche dagli eventi che si sono verificati in precedenza.

14. Temporizzazioni

In molti automatismi non è sufficiente sapere se una condizione è vera o falsa. È necessario sapere anche per quanto tempo rimane vera, oppure attendere un intervallo prima di eseguire un’azione.

Le temporizzazioni permettono quindi di introdurre il tempo nella logica di controllo.

Per esempio, può essere necessario:

  • avviare un motore alcuni secondi dopo un comando;
  • mantenere una ventola attiva per un certo tempo dopo lo spegnimento;
  • generare un impulso di durata definita;
  • verificare che un’azione venga completata entro un tempo massimo;
  • ritardare una fase di una sequenza.

Il controllore utilizza per queste funzioni dei temporizzatori, o timer.

Un temporizzatore dispone normalmente almeno di:

  • una condizione che lo attiva;
  • un tempo impostato;
  • un tempo trascorso;
  • uno stato che indica se la temporizzazione è terminata.

Il principio generale è:

condizione logica → conteggio del tempo → risultato logico

Tempo impostato e tempo trascorso

Il tempo impostato è la durata che il temporizzatore deve raggiungere.

Per esempio:

tempo impostato = 5 s

Il tempo trascorso indica invece quanto tempo è già passato dall’inizio della temporizzazione.

Durante il funzionamento potremmo quindi avere:

tempo impostato = 5 s

tempo trascorso = 3,2 s

Quando il tempo trascorso raggiunge il valore impostato, il temporizzatore modifica il proprio stato secondo il tipo di funzione utilizzata.

TON — ritardo all’attivazione

Il temporizzatore TON introduce un ritardo tra l’attivazione della condizione di ingresso e l’attivazione della propria uscita logica.

Supponiamo di impostare:

TON = 5 s

Quando la condizione di ingresso passa a 1, il temporizzatore inizia a contare.

Durante i primi 5 secondi:

ingresso = 1

uscita timer = 0

Trascorsi 5 secondi, se la condizione è ancora vera:

uscita timer = 1

La sequenza è quindi:

ingresso attivo → attesa → uscita attiva

Per esempio, possiamo utilizzare un TON per avviare una ventola 5 secondi dopo l’avvio di una macchina.

Se la condizione di ingresso torna a 0 prima che sia trascorso tutto il tempo impostato, un normale TON non ritentivo interrompe la temporizzazione e il tempo accumulato viene azzerato.

Per esempio:

tempo impostato = 5 s

la condizione rimane vera per 3 secondi e poi torna falsa.

Il timer non termina e, alla successiva attivazione, ricomincia da zero.

TOF — ritardo alla disattivazione

Il temporizzatore TOF viene utilizzato quando l’uscita deve rimanere attiva per un certo tempo dopo che la condizione di ingresso è diventata falsa.

Quando l’ingresso è vero, l’uscita del temporizzatore è attiva.

Quando l’ingresso passa da 1 a 0, inizia il conteggio del tempo.

Durante la temporizzazione l’uscita rimane ancora attiva.

Trascorso il tempo impostato, l’uscita si disattiva.

Il comportamento è quindi:

ingresso disattivato → attesa → uscita disattivata

Per esempio, una ventola di raffreddamento potrebbe continuare a funzionare per 30 secondi dopo l’arresto della macchina.

Con:

TOF = 30 s

la richiesta della macchina può tornare a 0, mentre l’uscita della ventola rimane attiva ancora per 30 secondi.

TP — temporizzatore impulsivo

Il temporizzatore TP genera un impulso di durata definita.

Quando viene rilevata la condizione che avvia il timer, la sua uscita diventa attiva per il tempo impostato.

Per esempio:

TP = 2 s

al verificarsi dell’evento:

uscita = 1 per 2 s

poi:

uscita = 0

Il comando iniziale può quindi essere molto breve, mentre l’uscita viene mantenuta attiva per una durata stabilita.

Un TP può essere utilizzato, per esempio, per:

  • attivare un segnalatore per alcuni secondi;
  • comandare un impulso di espulsione;
  • generare un comando di durata costante;
  • mantenere temporaneamente attivo un dispositivo dopo un evento.

Il comportamento preciso in caso di nuovi eventi durante l’impulso dipende dal tipo di temporizzatore e dall’implementazione utilizzata.

Temporizzatori ritentivi e non ritentivi

Un temporizzatore non ritentivo perde il tempo accumulato quando viene meno la condizione che lo abilita.

Per esempio:

tempo impostato = 10 s

il timer raggiunge:

6 s

la condizione diventa falsa.

Il tempo accumulato viene azzerato.

Alla nuova attivazione il conteggio riparte da:

0 s

Un temporizzatore ritentivo, invece, può conservare il tempo già accumulato.

Nello stesso esempio:

tempo raggiunto = 6 s

la temporizzazione viene interrotta.

Alla ripresa, il conteggio può continuare da:

6 s

anziché ripartire da zero.

Per azzerare il tempo accumulato è normalmente necessario un comando specifico di reset.

La ritentività deve essere scelta in funzione della funzione richiesta. Non è una caratteristica da utilizzare automaticamente.

Esempio di avvio ritardato

Supponiamo che un secondo motore debba partire 3 secondi dopo l’avvio del primo.

La condizione può essere:

MOTORE_1_ATTIVO → TON 3 s

Quando il motore 1 viene attivato, il timer inizia a contare.

Dopo 3 secondi:

TON_TERMINATO = 1

e questa condizione può essere utilizzata per comandare il motore 2.

La catena diventa:

motore 1 attivo → temporizzazione 3 s → comando motore 2

Se il motore 1 si arresta prima della fine dei 3 secondi, il comando del motore 2 non viene generato.

Esempio di arresto ritardato

Supponiamo che un aspiratore debba continuare a funzionare per 20 secondi dopo la fine di un processo.

Durante il processo:

PROCESSO_ATTIVO = 1

l’aspiratore è comandato.

Quando:

PROCESSO_ATTIVO = 0

inizia la temporizzazione TOF.

L’aspiratore rimane attivo ancora per:

20 s

e solo successivamente viene disattivato.

Esempio di impulso temporizzato

Supponiamo che una fotocellula rilevi il passaggio di un pezzo e che un segnalatore debba accendersi per un secondo.

L’evento della fotocellula avvia:

TP = 1 s

L’uscita del timer rimane quindi attiva per un secondo, indipendentemente dalla breve durata del segnale iniziale prevista dalla funzione utilizzata.

La catena è:

rilevamento pezzo → TP → segnalatore attivo per 1 s

Timeout

Un temporizzatore può essere utilizzato anche per controllare che un’azione venga completata entro un tempo massimo.

Supponiamo che, dopo il comando di apertura di una valvola, il relativo finecorsa debba essere raggiunto entro 5 secondi.

Quando viene impartito:

COMANDO_APERTURA = 1

parte contemporaneamente un timer:

TON = 5 s

Se il finecorsa viene raggiunto prima della scadenza, il movimento è avvenuto entro il tempo previsto.

Se invece il timer termina e il finecorsa non è ancora attivo:

TIMER_TERMINATO = 1

VALVOLA_APERTA = 0

può essere generata una condizione di anomalia.

Per esempio:

timeout apertura valvola

Il timer non serve quindi soltanto a ritardare un comando: può anche controllare che un processo non impieghi più tempo del previsto.

Temporizzazione e attesa bloccante

In un sistema di automazione è importante distinguere una temporizzazione da una semplice attesa che blocca l’esecuzione del programma.

Durante una temporizzazione correttamente gestita, il controllore continua a:

  • leggere gli ingressi;
  • eseguire la logica;
  • aggiornare le uscite;
  • controllare allarmi;
  • gestire altre funzioni.

Il timer misura il tempo senza impedire al resto del programma di funzionare.

Una logica del tipo:

“attendi 5 secondi senza fare altro”

sarebbe invece inadatta in molte applicazioni, perché durante quell’attesa il sistema potrebbe non reagire correttamente ad altri eventi.

Il principio corretto è quindi:

il tempo viene controllato mentre il programma continua a essere eseguito.

Temporizzazioni nelle sequenze

I timer vengono spesso utilizzati all’interno di sequenze automatiche.

Per esempio:

  1. parte un motore;
  2. trascorrono 2 secondi;
  3. si apre una valvola;
  4. la valvola rimane aperta per 5 secondi;
  5. viene comandata la chiusura;
  6. si attende il relativo feedback.

In questo caso i timer contribuiscono a determinare quando una fase può terminare e quando deve iniziare la successiva.

Il tempo, però, non dovrebbe sostituire un feedback reale quando questo è necessario.

Se una valvola dispone di un finecorsa di apertura, è generalmente più affidabile sapere che la valvola è realmente aperta piuttosto che presumere che lo sia soltanto perché sono trascorsi alcuni secondi.

Comportamento in caso di arresto o mancanza di alimentazione

Anche per i temporizzatori è necessario stabilire cosa deve accadere quando il controllore viene fermato, riavviato o perde alimentazione.

A seconda del tipo di timer e della configurazione utilizzata:

  • il tempo accumulato può essere perso;
  • il timer può ripartire da zero;
  • il valore può essere conservato;
  • il programma può inizializzarlo esplicitamente.

La scelta dipende dalla funzione.

Un ritardo di avviamento, per esempio, normalmente può essere riavviato da zero.

Un conteggio temporale legato alla durata complessiva di un processo potrebbe invece richiedere un comportamento differente.

Anche in questo caso occorre distinguere tra:

tempo necessario alla logica corrente

e

informazione temporale che deve essere conservata nel tempo

Riepilogo

Le principali funzioni temporali possono essere riassunte così:

TON → ritarda l’attivazione

TOF → ritarda la disattivazione

TP → genera un impulso di durata definita

timer ritentivo → conserva il tempo accumulato secondo la logica prevista

timeout → verifica che un evento avvenga entro un tempo massimo

Le temporizzazioni permettono quindi al controllore di prendere decisioni non soltanto in base allo stato delle condizioni, ma anche in base alla loro durata e alla successione temporale degli eventi.

15. Contatori

Un contatore viene utilizzato quando il controllore deve registrare quante volte si verifica un determinato evento.

A differenza di un temporizzatore, che misura il trascorrere del tempo, un contatore modifica il proprio valore ogni volta che riconosce l’evento previsto.

Può essere utilizzato, per esempio, per:

  • contare pezzi prodotti;
  • contare cicli macchina;
  • registrare scarti;
  • contare manovre;
  • verificare quante volte è intervenuto un dispositivo;
  • eseguire un’azione dopo un determinato numero di eventi.

Il principio generale è:

evento → conteggio → valore numerico → eventuale decisione

Evento di conteggio

Supponiamo che una fotocellula rilevi il passaggio dei pezzi su un trasportatore.

Ogni volta che passa un pezzo, il segnale della fotocellula cambia stato.

Il contatore deve incrementare il proprio valore una sola volta per ogni pezzo.

Per esempio:

0 pezzi

passa il primo pezzo:

1 pezzo

passa il secondo:

2 pezzi

passa il terzo:

3 pezzi

Il contatore non deve quindi incrementarsi continuamente per tutto il tempo durante il quale il segnale rimane attivo.

Rilevamento del fronte

Per distinguere un evento dal semplice mantenimento di uno stato si utilizza spesso il rilevamento del fronte.

Un fronte rappresenta il passaggio da uno stato logico all’altro.

Il fronte di salita è il passaggio:

0 → 1

Il fronte di discesa è il passaggio:

1 → 0

Se il conteggio viene effettuato sul fronte di salita, il contatore incrementa il proprio valore soltanto nel momento in cui il segnale passa da 0 a 1.

Supponiamo che una fotocellula rimanga attiva per mezzo secondo durante il passaggio di un pezzo.

Il controllore esegue il proprio programma molte volte durante quel mezzo secondo, ma il fronte:

0 → 1

si verifica una sola volta.

Il pezzo viene quindi contato una sola volta.

Senza il corretto rilevamento dell’evento, uno stesso segnale mantenuto attivo potrebbe essere contato più volte.

Contatore crescente

Un contatore crescente incrementa il proprio valore a ogni evento riconosciuto.

Viene spesso indicato come CTU, da Count Up.

Per esempio:

valore iniziale = 0

dopo un evento:

1

dopo due eventi:

2

dopo dieci eventi:

10

Il valore presente nel contatore viene normalmente indicato come valore attuale.

Valore prefissato

Un contatore può essere associato a un valore prefissato, cioè al numero di eventi che si desidera raggiungere.

Supponiamo di dover riempire una scatola con 20 pezzi.

Il valore prefissato sarà:

20

Durante il ciclo:

valore attuale = 7

significa che sono stati contati sette pezzi.

Quando:

valore attuale = 20

il contatore può attivare una condizione logica che segnala il raggiungimento della quantità richiesta.

Il sistema potrebbe quindi:

  • arrestare il trasportatore;
  • comandare il cambio della scatola;
  • avviare una fase successiva;
  • segnalare che il lotto è completo.

Il contatore non compie necessariamente queste azioni direttamente: mette a disposizione della logica il proprio valore e gli stati associati.

Confronto con il valore prefissato

Non sempre interessa soltanto sapere se il contatore è esattamente uguale al valore impostato.

Il programma può anche verificare condizioni come:

valore attuale < valore prefissato

valore attuale = valore prefissato

valore attuale > valore prefissato

Per esempio, se il sistema deve lavorare fino a 100 cicli:

CONTATORE < 100 → ciclo consentito

Quando:

CONTATORE >= 100

il programma può impedire un nuovo ciclo o richiedere un intervento.

L’uso di un confronto maggiore o uguale evita che un eventuale superamento del valore impedisca il riconoscimento della soglia.

Reset

Dopo aver raggiunto un determinato valore può essere necessario riportare il contatore a zero.

Questa operazione prende normalmente il nome di reset.

Per esempio:

valore attuale = 20

viene completata la scatola.

Dopo il cambio della scatola:

RESET → valore attuale = 0

Il contatore è così pronto per iniziare un nuovo conteggio.

La condizione di reset deve essere definita chiaramente, perché l’azzeramento elimina il valore accumulato.

Contatore decrescente

Un contatore può anche diminuire il proprio valore a ogni evento.

Questa funzione viene spesso indicata come CTD, da Count Down.

Supponiamo di partire da:

10

A ogni evento:

10 → 9 → 8 → 7 → ... → 0

Questo tipo di conteggio può essere utilizzato quando interessa sapere quanti eventi restano prima di raggiungere una determinata condizione.

Per esempio:

pezzi mancanti = 10

dopo tre pezzi:

pezzi mancanti = 7

quando:

pezzi mancanti = 0

la quantità richiesta è stata raggiunta.

Conteggio crescente e decrescente

Alcuni contatori permettono sia di incrementare sia di decrementare lo stesso valore.

Per esempio:

  • un sensore all’ingresso di un’area incrementa il conteggio;
  • un sensore all’uscita lo decrementa.

Se inizialmente:

PRESENTI = 0

entra una persona:

PRESENTI = 1

ne entra un’altra:

PRESENTI = 2

una esce:

PRESENTI = 1

Lo stesso principio può essere applicato a pezzi, pallet o altri elementi, purché gli eventi di ingresso e uscita siano rilevati correttamente.

Contatori ritentivi e non ritentivi

Come per le memorie e i temporizzatori, è necessario stabilire cosa deve accadere al valore del contatore quando il controllore viene arrestato o perde alimentazione.

Un contatore ritentivo può conservare il proprio valore.

Per esempio:

pezzi prodotti = 12 430

Dopo un riavvio può essere necessario continuare da:

12 430

e non da zero.

In altre applicazioni, invece, il conteggio appartiene soltanto al ciclo corrente e deve essere azzerato alla ripartenza.

La scelta dipende dal significato del dato.

Per esempio:

numero totale di cicli macchina

può avere senso come valore ritentivo.

numero di pezzi presenti temporaneamente su un tratto di trasportatore

potrebbe invece dover essere ricostruito o inizializzato in modo diverso dopo un arresto.

Conteggio di produzione

Un’applicazione tipica è il conteggio dei pezzi prodotti.

Una fotocellula rileva ogni prodotto che attraversa una determinata posizione.

La sequenza è:

passaggio del pezzo → fronte del sensore → incremento del contatore

Se il valore prefissato è:

50

al cinquantesimo pezzo può essere generata la condizione:

LOTTO_COMPLETO = 1

Questa condizione può essere utilizzata per terminare il lotto o avviare una nuova fase.

Conteggio dei cicli

Un contatore può registrare anche il numero di cicli eseguiti da una macchina.

L’evento da contare deve essere scelto con attenzione.

Non è sufficiente utilizzare un segnale che potrebbe presentarsi più volte nello stesso ciclo.

È preferibile individuare un evento che rappresenti in modo univoco il completamento del ciclo.

Per esempio:

CICLO_COMPLETATO → incremento contatore cicli

In questo modo:

1 evento = 1 ciclo

Il contatore può poi essere utilizzato per:

  • statistiche di produzione;
  • manutenzione;
  • sostituzione programmata di componenti;
  • controllo del numero di lavorazioni.

Conteggio degli scarti

Lo stesso principio può essere utilizzato per registrare gli scarti.

Ogni volta che il sistema identifica un prodotto non conforme:

SCARTO_RILEVATO → incremento contatore scarti

A fine produzione è quindi possibile conoscere, per esempio:

pezzi prodotti = 1000

scarti = 17

I due valori possono successivamente essere utilizzati per ulteriori elaborazioni.

Conteggio delle manovre

Un contatore può essere utilizzato anche per registrare quante volte un dispositivo è stato azionato.

Per esempio:

  • numero di aperture di una valvola;
  • numero di avviamenti di un motore;
  • numero di manovre di un contattore;
  • numero di cicli di un cilindro.

Questo dato può essere utile quando la manutenzione di un componente dipende dal numero di operazioni effettuate e non soltanto dal tempo di funzionamento.

È importante però scegliere quale evento rappresenta realmente una manovra.

Se si vuole contare un avviamento del motore, per esempio, bisogna contare la transizione che rappresenta l’avvio e non ogni ciclo del programma durante il quale il comando rimane attivo.

Conteggi errati

Un conteggio corretto dipende dalla qualità del segnale utilizzato.

Un pulsante meccanico, per esempio, può produrre rimbalzi dei contatti.

Un singolo azionamento fisico potrebbe quindi generare più transizioni elettriche e provocare più incrementi del contatore.

Anche un sensore disturbato può produrre falsi impulsi.

Prima di utilizzare un segnale per il conteggio può quindi essere necessario:

  • filtrarlo;
  • eliminare i rimbalzi;
  • verificarne la durata;
  • controllare che ogni evento fisico produca un solo evento logico valido.

Il contatore registra ciò che riceve: se il segnale genera tre eventi, il controllatore non può sapere automaticamente che fisicamente avrebbe dovuto essercene uno solo.

Limiti numerici e overflow

Un contatore utilizza una variabile numerica con una dimensione finita.

Esiste quindi un valore massimo, e in alcuni casi anche un valore minimo, che può essere rappresentato.

Se il conteggio continua oltre il limite previsto dal tipo di dato, può verificarsi un overflow.

Il comportamento dipende dal controllore e dal tipo di variabile utilizzata.

Per esempio, un valore può:

  • generare un errore;
  • saturare al massimo;
  • ripartire da un altro valore;
  • produrre un comportamento definito dal sistema.

Per conteggi destinati a crescere molto nel tempo è quindi necessario scegliere un tipo di dato adeguato e prevedere cosa deve accadere quando ci si avvicina al limite.

Contatore software e contatore veloce

Un normale contatore software utilizza gli eventi che il programma riesce ad acquisire durante il normale funzionamento del controllore.

Questo è sufficiente per eventi relativamente lenti, come:

  • passaggio di pezzi;
  • cicli macchina;
  • comandi operatore.

Se invece gli impulsi arrivano a frequenza elevata, il normale ciclo del programma potrebbe non riuscire a rilevarli tutti.

In questi casi si utilizzano gli ingressi veloci e i contatori hardware già introdotti tra gli ingressi speciali.

Il conteggio viene eseguito da circuiti dedicati indipendentemente dal normale ciclo del programma.

Si distingue quindi tra:

contatore software → adatto agli eventi acquisibili dal normale ciclo di controllo

e

contatore hardware veloce → adatto a impulsi rapidi che richiedono acquisizione dedicata

Contatori nelle sequenze

I contatori possono determinare anche il passaggio da una fase all’altra di una sequenza.

Per esempio:

  1. avvio del trasportatore;
  2. conteggio dei pezzi;
  3. raggiungimento di 10 pezzi;
  4. arresto del trasportatore;
  5. avvio della fase di confezionamento;
  6. reset del contatore;
  7. inizio di un nuovo ciclo.

In questo caso il passaggio alla fase successiva non dipende dal tempo trascorso, ma dal numero di eventi rilevati.

Temporizzatori e contatori rispondono quindi a due domande differenti:

temporizzatore → quanto tempo è trascorso?

contatore → quante volte è avvenuto l’evento?

Esempio completo

Supponiamo che una macchina debba riempire contenitori con 12 pezzi.

Una fotocellula rileva ogni pezzo in ingresso.

All’inizio:

CONTATORE = 0

Ogni fronte valido della fotocellula incrementa il valore:

1, 2, 3, ... 12

Il valore prefissato è:

12

Quando:

CONTATORE >= 12

viene generata la condizione:

CONTENITORE_COMPLETO = 1

Il trasportatore dei pezzi viene arrestato e può essere avviata la sostituzione del contenitore.

Quando il nuovo contenitore è in posizione:

RESET CONTATORE

e:

CONTATORE = 0

Il sistema può iniziare un nuovo conteggio.

Il contatore permette quindi al controllore di conservare una memoria numerica degli eventi avvenuti e di utilizzare quel numero per determinare il comportamento successivo dell’automazione.

16. Sequenze automatiche

Molti automatismi non eseguono una sola azione, ma una serie di operazioni che devono avvenire in un ordine preciso.

Una sequenza automatica suddivide il funzionamento della macchina in più fasi, ognuna delle quali rappresenta una determinata condizione del processo.

Per esempio:

  1. attendere il comando di avvio;
  2. avviare un trasportatore;
  3. attendere l’arrivo di un pezzo;
  4. fermare il trasportatore;
  5. azionare un cilindro;
  6. attendere il finecorsa;
  7. riportare il cilindro nella posizione iniziale;
  8. terminare il ciclo.

Il principio fondamentale è:

fase attuale → azioni della fase → condizione di transizione → fase successiva

Il controllore deve quindi sapere in ogni momento in quale fase si trova e quali condizioni devono verificarsi per poter passare alla fase successiva.

Fasi o stati

Ogni parte della sequenza può essere rappresentata mediante una fase o uno stato.

Per esempio:

FASE 0 = attesa

FASE 1 = avanzamento trasportatore

FASE 2 = arresto e posizionamento

FASE 3 = avanzamento cilindro

FASE 4 = ritorno cilindro

FASE 5 = fine ciclo

In ogni momento, in una sequenza semplice, una determinata fase identifica ciò che il sistema deve fare.

La variabile che rappresenta la fase può essere memorizzata come numero, come insieme di bit oppure mediante strutture specifiche messe a disposizione dal controllore.

Il concetto rimane comunque lo stesso: il programma conserva memoria dello stato attuale della sequenza.

Azioni della fase

Ogni fase può determinare una o più azioni.

Per esempio:

FASE 1 = trasportatore acceso

oppure:

FASE 3 = elettrovalvola avanzamento cilindro attiva

Le azioni rimangono normalmente valide finché la sequenza resta nella relativa fase.

Quando si passa alla fase successiva, le azioni vengono aggiornate secondo quanto previsto dal nuovo stato.

Una fase può anche non comandare direttamente alcuna uscita e servire semplicemente per attendere una condizione.

Per esempio:

FASE 0 = attesa del comando START

Transizioni

Il passaggio da una fase alla successiva avviene quando si verifica una determinata condizione di transizione.

Per esempio:

FASE 1 → FASE 2

quando:

FOTOCELLULA_PEZZO = 1

oppure:

FASE 3 → FASE 4

quando:

FINECORSA_AVANTI = 1

Una transizione può dipendere da:

  • un ingresso digitale;
  • una condizione analogica;
  • un temporizzatore;
  • un contatore;
  • una variabile interna;
  • una combinazione di più condizioni logiche.

Per esempio:

FINECORSA_AVANTI AND PRESSIONE_OK

può essere la condizione necessaria per completare una determinata fase.

Ingresso in una fase

Quando una transizione diventa vera, la sequenza abbandona la fase corrente ed entra nella fase successiva.

Questo passaggio può essere rappresentato come:

FASE 2 + condizione verificata → FASE 3

La nuova fase diventa quindi lo stato attivo del sistema.

È importante che una transizione venga valutata nel contesto della fase corretta.

Per esempio, il segnale:

FINECORSA_AVANTI = 1

deve provocare il passaggio alla fase successiva soltanto quando la sequenza si trova nella fase in cui sta effettivamente aspettando quel finecorsa.

Lo stesso ingresso potrebbe infatti essere attivo anche in altri momenti senza dover produrre alcun cambiamento di fase.

Sequenza lineare

La forma più semplice è una sequenza lineare, nella quale ogni fase porta a una sola fase successiva.

Per esempio:

FASE 0 → FASE 1 → FASE 2 → FASE 3 → FASE 4 → FASE 0

Il ciclo procede quindi sempre nello stesso ordine.

Un esempio potrebbe essere:

FASE 0 = attesa

FASE 1 = avanzamento pezzo

FASE 2 = lavorazione

FASE 3 = espulsione

FASE 4 = ritorno

e infine nuovamente:

FASE 0 = attesa

Sequenze con diramazioni

Non tutte le sequenze seguono necessariamente un unico percorso.

Il comportamento può dipendere dal risultato di una verifica.

Per esempio, dopo il controllo di un pezzo:

pezzo conforme → fase di uscita normale

pezzo non conforme → fase di scarto

La sequenza può quindi avere due percorsi differenti.

In forma concettuale:

FASE CONTROLLO

se:

PEZZO_OK = 1

→ FASE USCITA

altrimenti:

→ FASE SCARTO

Dopo aver completato le rispettive operazioni, i due percorsi possono eventualmente ricongiungersi in una fase comune.

Uso dei temporizzatori

Una fase può terminare dopo un determinato intervallo di tempo.

Per esempio:

FASE 2 = riscaldamento

Durante l’ingresso nella fase viene avviato un timer.

Quando:

TEMPO_RISCALDAMENTO_TERMINATO = 1

la sequenza passa alla fase successiva.

Il principio è:

ingresso nella fase → avvio temporizzazione → tempo raggiunto → transizione

Il timer può quindi determinare la durata di una fase.

Uso dei contatori

Anche un contatore può determinare il passaggio da una fase all’altra.

Supponiamo che una fase debba proseguire fino al passaggio di dieci pezzi.

Durante:

FASE RIEMPIMENTO

ogni pezzo incrementa il contatore.

Quando:

CONTATORE >= 10

la transizione diventa vera e la sequenza passa alla fase successiva.

Il passaggio non dipende quindi dal tempo trascorso, ma dal numero di eventi rilevati.

Condizioni multiple

Una fase può terminare soltanto quando sono soddisfatte più condizioni contemporaneamente.

Per esempio:

FINECORSA_RAGGIUNTO AND PRESSIONE_OK AND NOT ALLARME

In questo caso il raggiungimento del finecorsa, da solo, non è sufficiente.

La fase termina soltanto quando tutte le condizioni richieste risultano vere.

Si possono quindi utilizzare all’interno delle transizioni gli stessi operatori logici già introdotti:

  • AND;
  • OR;
  • NOT.

Stato iniziale

Ogni sequenza deve avere uno stato iniziale definito.

Dopo l’avviamento del controllore, un reset o una determinata procedura di inizializzazione, il programma deve sapere da quale fase partire.

Per esempio:

FASE 0 = ATTESA

In questa fase possono essere previste condizioni come:

  • uscite principali disattivate;
  • cilindri nella posizione prevista;
  • nessun ciclo in corso;
  • attesa del comando START.

Non è sufficiente assegnare arbitrariamente una fase iniziale: bisogna anche verificare, quando necessario, che le condizioni fisiche della macchina siano compatibili con quello stato.

Reset della sequenza

Il reset permette di riportare la sequenza in uno stato definito.

Per esempio:

RESET → FASE 0

Il reset può essere richiesto:

  • dall’operatore;
  • dopo un’anomalia;
  • al termine di una procedura;
  • durante l’inizializzazione del sistema.

Il reset logico della sequenza non significa però necessariamente che tutti gli organi meccanici si trovino automaticamente nelle posizioni iniziali.

Se un cilindro è rimasto avanzato, impostare semplicemente:

FASE = 0

non lo riporta fisicamente indietro.

Il programma deve quindi distinguere tra:

reset dello stato logico

e

ripristino della macchina in una condizione fisica nota

Arresto durante una sequenza

Una macchina può essere arrestata mentre si trova in una fase intermedia.

È quindi necessario stabilire cosa deve accadere alla sequenza.

Le possibilità dipendono dal processo.

Per esempio:

  • la fase può essere annullata;
  • la sequenza può rimanere sospesa;
  • può essere richiesto un ritorno controllato a una posizione iniziale;
  • può essere necessario completare una determinata operazione prima dell’arresto;
  • può essere necessario impedire una ripartenza automatica.

Il comportamento deve essere definito per ogni applicazione.

Non è corretto presumere che, dopo un arresto, sia sempre possibile riprendere semplicemente dal punto in cui la sequenza era stata interrotta.

Anomalie e timeout

Una sequenza non deve attendere indefinitamente un evento che potrebbe non verificarsi.

Supponiamo che durante una fase venga comandato l’avanzamento di un cilindro.

La sequenza attende:

FINECORSA_AVANTI = 1

Se il sensore non viene mai raggiunto a causa di un guasto, la macchina potrebbe rimanere bloccata permanentemente nella stessa fase.

Per questo può essere associato un timeout.

Per esempio:

tempo massimo avanzamento = 3 s

Se il finecorsa arriva entro tre secondi:

transizione normale → fase successiva

Se invece il timer termina prima del raggiungimento del finecorsa:

timeout → anomalia

La sequenza può quindi:

  • interrompere il ciclo;
  • disattivare i comandi previsti;
  • memorizzare l’anomalia;
  • richiedere un intervento o un reset.

Il timeout permette di distinguere tra:

“sto ancora aspettando”

e

“l’evento avrebbe già dovuto verificarsi”

Controllo delle condizioni prima del movimento

Una fase non deve necessariamente partire appena viene raggiunta dalla sequenza.

Prima di comandare un movimento possono essere richiesti determinati consensi.

Per esempio:

FASE_AVANZAMENTO AND PRESSIONE_OK AND RIPARO_CHIUSO → comando cilindro

Se una condizione necessaria non è presente, il movimento non viene eseguito.

Questo evita che la struttura della sequenza venga confusa con i consensi necessari al funzionamento degli attuatori.

La fase indica cosa dovrebbe avvenire; le condizioni di consenso stabiliscono se può effettivamente avvenire.

Ripartenza dopo una perdita di alimentazione

Una perdita di alimentazione può interrompere la sequenza in qualsiasi fase.

Al ritorno dell’alimentazione il controllore deve stabilire come comportarsi.

Le possibili strategie comprendono:

  • ripartire dallo stato iniziale;
  • conservare la fase precedente;
  • ricostruire lo stato osservando sensori e finecorsa;
  • richiedere un intervento dell’operatore;
  • eseguire una procedura specifica di ripristino.

La scelta dipende dal tipo di processo.

Conservare semplicemente il numero della fase non garantisce infatti che la macchina si trovi ancora nella stessa condizione fisica.

Per esempio:

FASE MEMORIZZATA = cilindro avanti

non garantisce che il cilindro sia realmente ancora avanzato dopo una perdita di energia pneumatica o elettrica.

La ripartenza deve quindi tenere conto dei feedback reali disponibili.

Sequenza e ciclo di scansione

Il controllore esegue continuamente il proprio programma.

La sequenza non viene quindi normalmente eseguita tutta in una volta dall’inizio alla fine.

A ogni ciclo di scansione il programma:

  1. riconosce la fase attuale;
  2. esegue le azioni previste per quella fase;
  3. verifica le condizioni di transizione;
  4. se necessario, aggiorna lo stato della sequenza;
  5. esegue la nuova fase secondo l’ordine di elaborazione previsto dal programma.

Una fase può quindi rimanere attiva per moltissimi cicli di scansione prima che si verifichi la condizione necessaria al passaggio successivo.

Esempio completo

Consideriamo un piccolo sistema che deve portare un pezzo in posizione, bloccarlo con un cilindro, mantenerlo fermo per due secondi e poi rilasciarlo.

Sono disponibili:

START

FOTOCELLULA_PEZZO

FINECORSA_CILINDRO_AVANTI

FINECORSA_CILINDRO_INDIETRO

e le uscite:

MOTORE_TRASPORTATORE

CILINDRO_AVANTI

CILINDRO_INDIETRO

La sequenza può essere organizzata nel seguente modo.

FASE 0 — Attesa

Tutto il ciclo è fermo.

Si attende:

START = 1

Quando START viene riconosciuto:

FASE 0 → FASE 1

FASE 1 — Avanzamento del pezzo

Viene comandato:

MOTORE_TRASPORTATORE = 1

La sequenza attende:

FOTOCELLULA_PEZZO = 1

Quando il pezzo raggiunge la posizione:

FASE 1 → FASE 2

FASE 2 — Bloccaggio

Il trasportatore viene fermato:

MOTORE_TRASPORTATORE = 0

Viene comandato:

CILINDRO_AVANTI = 1

La sequenza attende:

FINECORSA_CILINDRO_AVANTI = 1

con un timeout massimo previsto per il movimento.

Se il finecorsa viene raggiunto:

FASE 2 → FASE 3

Se scade il timeout:

ANOMALIA = 1

e il ciclo viene interrotto secondo la logica prevista.

FASE 3 — Permanenza

Il cilindro rimane nella posizione di bloccaggio.

Viene eseguita una temporizzazione:

TON = 2 s

Quando il tempo è trascorso:

FASE 3 → FASE 4

FASE 4 — Ritorno del cilindro

Viene comandato:

CILINDRO_INDIETRO = 1

La sequenza attende:

FINECORSA_CILINDRO_INDIETRO = 1

anche in questo caso con un eventuale timeout.

Quando il finecorsa viene raggiunto:

FASE 4 → FASE 5

FASE 5 — Fine ciclo

Il ciclo viene dichiarato completato.

A seconda del funzionamento richiesto, il sistema può:

  • tornare in FASE 0 e attendere un nuovo START;
  • iniziare automaticamente un nuovo ciclo;
  • incrementare un contatore di produzione prima di tornare allo stato iniziale.

La sequenza completa è quindi:

attesa → trasporto → bloccaggio → permanenza → ritorno → fine ciclo

Ogni passaggio avviene soltanto quando viene verificata la relativa condizione di transizione.

Una sequenza automatica permette quindi di organizzare un processo complesso come una successione ordinata di stati, in cui il controllore sa in ogni momento:

dove si trova il ciclo, cosa deve fare e quale condizione deve verificarsi prima di procedere.

17. Interblocchi, consensi e sicurezze di funzionamento

Un automatismo non deve stabilire soltanto quando eseguire un comando, ma anche quando quel comando deve essere impedito.

Prima di attivare un motore, muovere un cilindro o aprire una valvola può essere necessario verificare che siano presenti determinate condizioni.

Queste condizioni vengono normalmente indicate come consensi e interblocchi.

Il principio generale è:

richiesta di comando + condizioni ammesse → comando eseguibile

Se una condizione necessaria manca, il comando non deve essere eseguito.

Consensi

Un consenso è una condizione che deve risultare valida affinché una determinata azione possa essere autorizzata.

Per esempio, per avviare una pompa potrebbe essere necessario avere:

START = 1

LIVELLO_OK = 1

PRESSIONE_OK = 1

PROTEZIONE_MOTORE_OK = 1

La condizione di comando può quindi essere:

START AND LIVELLO_OK AND PRESSIONE_OK AND PROTEZIONE_MOTORE_OK

Se anche uno solo dei consensi viene meno, la condizione complessiva diventa falsa.

Un consenso può derivare da:

  • un ingresso digitale;
  • un valore analogico confrontato con una soglia;
  • lo stato di un altro dispositivo;
  • una variabile interna;
  • una condizione di processo;
  • un segnale proveniente da un altro controllore o dispositivo.

Interblocco

Un interblocco impedisce che vengano eseguite contemporaneamente azioni incompatibili oppure che un comando venga impartito in una condizione non ammessa.

Un esempio semplice è il comando avanti/indietro di un motore.

Se è attivo:

MARCIA_AVANTI

non deve essere possibile attivare contemporaneamente:

MARCIA_INDIETRO

La logica può quindi prevedere:

COMANDO_AVANTI AND NOT MARCIA_INDIETRO → USCITA_AVANTI

e:

COMANDO_INDIETRO AND NOT MARCIA_AVANTI → USCITA_INDIETRO

Le due funzioni si escludono reciprocamente.

Lo stesso principio può essere applicato a:

  • apertura e chiusura di una valvola;
  • salita e discesa;
  • avanzamento e ritorno di un attuatore;
  • riempimento e svuotamento;
  • due movimenti che occupano la stessa zona;
  • due apparecchiature che non possono funzionare contemporaneamente.

Interblocco logico e interblocco elettrico

Un interblocco può essere realizzato nel programma del controllore, ma in alcune applicazioni può essere previsto anche direttamente nel circuito elettrico.

Per esempio, nel comando avanti/indietro di due contattori, un contatto ausiliario del contattore di marcia avanti può impedire elettricamente l’eccitazione del contattore di marcia indietro e viceversa.

Si possono quindi avere:

interblocco logico → realizzato nel programma

interblocco elettrico → realizzato mediante il circuito di comando

Le due soluzioni non sono necessariamente alternative. In alcune applicazioni vengono utilizzate entrambe.

Condizioni permissive e condizioni di arresto

È utile distinguere tra una condizione che permette l’avviamento e una condizione che provoca l’arresto.

Per esempio, una pompa può essere avviata soltanto se:

LIVELLO_OK = 1

Se durante il funzionamento il livello scende sotto il minimo consentito, occorre stabilire se la perdita del consenso deve:

  • impedire soltanto nuovi avviamenti;
  • provocare anche l’arresto immediato della pompa.

Le due logiche non sono equivalenti.

Un consenso di partenza potrebbe essere verificato soltanto al momento dell’avviamento.

Un consenso permanente deve invece continuare a essere valido per tutta la durata del funzionamento.

Per questo bisogna stabilire chiaramente se una condizione è:

consenso all’avviamento

oppure:

consenso al mantenimento del funzionamento

Condizioni incompatibili

Un sistema può trovarsi anche in una situazione in cui due segnali che dovrebbero essere mutuamente esclusivi risultano entrambi attivi.

Per esempio, un cilindro con due finecorsa potrebbe fornire contemporaneamente:

FINECORSA_AVANTI = 1

FINECORSA_INDIETRO = 1

In una configurazione normale questo stato può essere fisicamente impossibile.

La logica può quindi riconoscerlo come condizione incoerente.

Lo stesso vale per casi come:

  • valvola dichiarata contemporaneamente aperta e chiusa;
  • comando avanti e indietro contemporaneamente presenti;
  • sensori che descrivono stati fisicamente incompatibili;
  • segnale di marcia presente insieme a una condizione che dovrebbe aver provocato l’arresto.

L’interblocco può quindi impedire il comando, mentre la diagnostica può segnalare l’incoerenza.

Interblocchi tra fasi della sequenza

Gli interblocchi diventano particolarmente importanti nelle sequenze automatiche.

Supponiamo che un cilindro possa avanzare soltanto quando il trasportatore è fermo.

La sequenza può trovarsi nella fase corretta per comandare il cilindro, ma il movimento deve comunque essere impedito se:

TRASPORTATORE_FERMO = 0

La condizione effettiva diventa:

FASE_AVANZAMENTO AND TRASPORTATORE_FERMO → CILINDRO_AVANTI

La fase indica ciò che il ciclo vuole eseguire.

L’interblocco verifica che l’azione sia consentita.

Questo evita di affidare tutta la protezione del processo alla sola successione delle fasi.

Consensi provenienti dal processo

Non tutti i consensi sono semplicemente stati elettrici.

Possono essere ottenuti anche elaborando grandezze analogiche.

Per esempio:

PRESSIONE = 5,8 bar

Il programma può stabilire:

PRESSIONE_OK = pressione compresa tra 4 e 7 bar

La condizione:

PRESSIONE_OK

diventa quindi un consenso logico ricavato da una misura analogica.

Lo stesso principio può essere utilizzato per:

  • temperatura;
  • livello;
  • portata;
  • velocità;
  • posizione;
  • tensione;
  • corrente.

Isteresi nei consensi analogici

Quando un consenso deriva da una grandezza analogica vicina a una soglia, può verificarsi una continua commutazione tra vero e falso.

Supponiamo di utilizzare:

PRESSIONE_OK = pressione > 4 bar

Se la pressione oscilla attorno a 4 bar:

3,99 → 4,01 → 3,98 → 4,02 bar

il consenso potrebbe cambiare continuamente stato.

Per evitare questo comportamento si può utilizzare una isteresi, cioè due soglie differenti.

Per esempio:

attiva PRESSIONE_OK sopra 4,2 bar

disattiva PRESSIONE_OK sotto 3,8 bar

Tra 3,8 e 4,2 bar viene mantenuto lo stato precedente.

In questo modo piccole oscillazioni della misura non provocano continue commutazioni del comando.

Arresto per anomalia

Una condizione anomala può richiedere la rimozione immediata di uno o più comandi.

Per esempio:

SOVRATEMPERATURA = 1

può determinare:

MOTORE = 0

oppure impedire l’attivazione di una fase successiva.

L’anomalia può inoltre essere memorizzata:

SOVRATEMPERATURA → SET ALLARME

In questo modo il dispositivo può arrestarsi immediatamente, mentre l’informazione dell’evento rimane disponibile anche se successivamente la temperatura ritorna nel campo normale.

Anomalia presente e allarme memorizzato

È utile distinguere tra la condizione che esiste in questo momento e la memoria dell’evento.

Per esempio:

TEMPERATURA_ALTA = 1

indica che la temperatura è attualmente oltre il limite.

Se successivamente torna normale:

TEMPERATURA_ALTA = 0

un allarme memorizzato può invece rimanere:

ALLARME_TEMPERATURA = 1

fino al riconoscimento o al reset previsto.

Si distingue quindi tra:

anomalia presente → stato attuale del processo

e

allarme memorizzato → informazione che l’anomalia si è verificata

Reset di un allarme

Il reset non deve necessariamente cancellare un allarme mentre la causa è ancora presente.

Supponiamo che:

SOVRATEMPERATURA = 1

L’operatore preme RESET.

Se la temperatura è ancora troppo alta, sarebbe normalmente inutile cancellare definitivamente l’allarme.

Una logica possibile è:

RESET AND NOT SOVRATEMPERATURA → cancellazione allarme

In questo modo il reset viene accettato soltanto quando la causa che ha generato l’allarme non è più presente.

Il comportamento effettivo deve comunque essere definito in funzione della macchina e del processo.

Riavvio dopo un’anomalia

La scomparsa di un’anomalia non deve necessariamente provocare il riavvio automatico della macchina.

Per esempio, se un motore viene arrestato perché:

PRESSIONE_OK = 0

e successivamente la pressione torna normale, il programma deve stabilire se:

  • il motore può ripartire automaticamente;
  • deve essere richiesto un nuovo comando START;
  • deve essere eseguito un reset;
  • deve intervenire l’operatore.

La scelta dipende dal processo e dai requisiti dell’impianto.

In molte applicazioni è importante distinguere tra:

condizione nuovamente valida

e

autorizzazione alla ripartenza

Interblocchi e feedback

Un interblocco è più affidabile quando utilizza, dove necessario, lo stato realmente rilevato del dispositivo e non soltanto il comando impartito.

Supponiamo che una valvola B possa aprirsi soltanto quando una valvola A è realmente chiusa.

Utilizzare:

COMANDO_CHIUSURA_A = 1

non garantisce che A sia effettivamente chiusa.

Se è disponibile un finecorsa:

A_CHIUSA = 1

questo fornisce un’informazione sul risultato reale del movimento.

La condizione può quindi diventare:

COMANDO_APERTURA_B AND A_CHIUSA → APERTURA_B

Si ritrova la distinzione già vista tra:

comando → ciò che è stato richiesto

e

feedback → ciò che è stato realmente rilevato

Sicurezza funzionale e normale logica di automazione

Non tutte le condizioni che riguardano la sicurezza delle persone possono essere affidate alla normale logica di un controllore standard.

Funzioni come, per esempio:

  • arresto di emergenza;
  • controllo di ripari mobili;
  • barriere fotoelettriche di sicurezza;
  • prevenzione di movimenti pericolosi;
  • controllo sicuro di determinati azionamenti;

possono richiedere dispositivi, architetture e controllori specificamente progettati e certificati per funzioni di sicurezza.

Un normale ingresso del PLC e una normale istruzione nel programma non diventano una funzione di sicurezza semplicemente perché vengono utilizzati per gestire un pulsante o un sensore legato alla sicurezza.

Bisogna quindi distinguere chiaramente tra:

interblocchi di processo e di funzionamento

e

funzioni di sicurezza destinate alla protezione delle persone

Le seconde devono essere progettate secondo i requisiti applicabili alla macchina e al livello di rischio.

Arresto di emergenza

L’arresto di emergenza non è un normale comando STOP utilizzato per arrestare il ciclo produttivo.

È una funzione destinata a permettere l’intervento in una situazione di emergenza.

Il suo comportamento, l’architettura elettrica, il riarmo e le modalità con cui vengono disattivate le funzioni pericolose non devono essere definiti come semplice logica software ordinaria.

Il comando di emergenza può essere acquisito anche dal sistema di controllo per diagnostica o visualizzazione, ma la funzione di sicurezza deve essere realizzata con l’architettura prevista per tale scopo.

Sicurezza e riarmo

Il semplice ripristino di un dispositivo di sicurezza non deve essere confuso con il comando di riavvio della macchina.

Per esempio, dopo il ripristino di un arresto di emergenza o la richiusura di un riparo, il sistema può tornare in una condizione nella quale il funzionamento è nuovamente consentito.

Il ripristino o il riarmo del dispositivo di sicurezza non deve, di per sé, provocare il riavvio automatico dei movimenti pericolosi.

Si distingue quindi tra:

ripristino della condizione di sicurezza

e

nuovo comando di avviamento

Questa distinzione evita che il semplice ritorno di un consenso provochi movimenti inattesi.

Esempio completo

Supponiamo di avere un motore che può funzionare soltanto quando:

  • viene richiesto START;
  • è disponibile la pressione necessaria;
  • il livello è sufficiente;
  • il sistema non è in allarme;
  • non è attivo il comando del movimento opposto.

Definiamo:

START

PRESSIONE_OK

LIVELLO_OK

ALLARME

MARCIA_INVERSA

La condizione di avviamento può essere:

START AND PRESSIONE_OK AND LIVELLO_OK AND NOT ALLARME AND NOT MARCIA_INVERSA

Una volta avviato, il motore può essere mantenuto in marcia soltanto finché restano presenti i consensi che il progetto considera necessari durante il funzionamento.

Se:

PRESSIONE_OK = 0

la logica può arrestare il motore.

Se la pressione torna successivamente normale:

PRESSIONE_OK = 1

il sistema può richiedere un nuovo START anziché ripartire automaticamente.

L’interblocco con:

MARCIA_INVERSA

impedisce inoltre che le due direzioni vengano comandate contemporaneamente.

Il sistema non si limita quindi a chiedersi:

“devo comandare il motore?”

ma verifica anche:

“tutte le condizioni necessarie permettono realmente di comandarlo?”

Consensi e interblocchi costituiscono così una parte fondamentale della logica di automazione, perché definiscono non soltanto ciò che il sistema deve fare, ma anche le condizioni nelle quali non deve farlo.

18. PLC: struttura e ciclo di funzionamento

Il PLC, Programmable Logic Controller, è un controllore programmabile progettato per gestire macchine e processi automatici.

Riceve informazioni dagli ingressi, esegue il programma memorizzato e aggiorna le uscite secondo la logica prevista.

In forma generale:

ingressi → elaborazione del programma → uscite

Il PLC non è quindi soltanto un insieme di morsetti: contiene una CPU, memoria, circuiti di comunicazione e moduli destinati a interfacciarsi con i segnali provenienti dal campo.

Componenti principali

Un PLC comprende normalmente:

  • alimentazione;
  • CPU;
  • memoria;
  • ingressi;
  • uscite;
  • interfacce di comunicazione.

Nei sistemi modulari questi elementi possono essere realizzati mediante moduli separati.

Nei PLC compatti, invece, CPU, ingressi e uscite possono essere integrati nello stesso apparecchio.

Alimentazione

Il PLC necessita di una propria alimentazione.

A seconda del modello, può essere alimentato direttamente dalla rete oppure mediante una tensione continua, per esempio 24 V c.c.

L’alimentatore fornisce le tensioni necessarie all’elettronica interna e, nei sistemi modulari, può alimentare anche il bus interno attraverso il quale comunicano i vari moduli.

L’alimentazione della CPU non deve essere confusa con quella dei dispositivi di campo.

Sensori, attuatori e moduli di ingresso o uscita possono richiedere alimentazioni separate o distribuzioni specifiche secondo l’architettura dell’impianto.

CPU

La CPU, Central Processing Unit, esegue il programma di automazione.

Il suo compito comprende, tra le altre funzioni:

  • elaborare la logica;
  • gestire variabili;
  • eseguire timer e contatori;
  • controllare le comunicazioni;
  • gestire diagnostica ed errori;
  • coordinare i moduli del sistema.

La CPU esegue queste operazioni continuamente durante il funzionamento del PLC.

Memoria

Il PLC utilizza differenti aree di memoria per conservare:

  • il programma;
  • i dati;
  • gli stati interni;
  • i valori dei timer;
  • i valori dei contatori;
  • i parametri di configurazione;
  • eventuali dati ritentivi.

La struttura esatta della memoria dipende dal controllore utilizzato.

Il programma e i dati non devono quindi essere considerati come un unico insieme indistinto: il PLC dispone di aree e modalità di memorizzazione differenti, con caratteristiche definite dal costruttore.

PLC compatto e PLC modulare

In un PLC compatto CPU, alimentazione e un certo numero di ingressi e uscite sono normalmente integrati nello stesso apparecchio.

Questa soluzione è adatta quando il numero di segnali e le funzioni richieste sono relativamente contenuti.

Un PLC modulare è invece costituito da più elementi collegati tra loro.

Per esempio:

alimentatore → CPU → modulo ingressi digitali → modulo uscite digitali → modulo ingressi analogici → modulo comunicazione

La struttura modulare permette di scegliere e aggiungere i moduli necessari alla specifica applicazione.

Possono quindi essere installati, per esempio:

  • moduli digitali;
  • moduli analogici;
  • moduli per termocoppie;
  • moduli per encoder;
  • moduli di comunicazione;
  • moduli di sicurezza;
  • moduli tecnologici dedicati.

PLC locale e I/O distribuiti

Gli ingressi e le uscite non devono necessariamente trovarsi fisicamente accanto alla CPU.

In impianti estesi possono essere utilizzati moduli di I/O distribuiti, installati vicino ai sensori e agli attuatori e collegati alla CPU attraverso una rete industriale.

La struttura può quindi diventare:

sensori e attuatori → I/O remoto → rete → PLC

Questo permette di ridurre il cablaggio verso il quadro principale e distribuire l’acquisizione dei segnali nei diversi punti della macchina o dell’impianto.

Il ciclo di scansione

Durante il funzionamento normale il PLC esegue continuamente una successione di operazioni.

In forma semplificata, il ciclo principale è:

  1. lettura degli ingressi;
  2. esecuzione del programma;
  3. aggiornamento delle uscite;
  4. ripetizione del ciclo.

Questa successione prende il nome di ciclo di scansione.

Il PLC non esegue quindi il programma una sola volta.

Terminata una scansione, ricomincia immediatamente la successiva.

L’ordine esatto delle operazioni e la gestione delle immagini di processo dipendono dall’architettura e dalla configurazione del controllore.

Lettura degli ingressi

All’inizio della scansione, nella modalità classica di funzionamento, il PLC acquisisce lo stato degli ingressi.

Per esempio:

I1 = 1

I2 = 0

I3 = 1

Questi valori vengono resi disponibili al programma in un’area interna di memoria.

Il programma può quindi lavorare su una rappresentazione dello stato degli ingressi acquisita in quel momento.

Questa rappresentazione viene spesso indicata come immagine di processo degli ingressi.

Immagine di processo

L’immagine di processo permette al programma di utilizzare valori coerenti durante l’elaborazione.

Supponiamo che all’inizio della scansione:

PULSANTE_START = 1

Il programma utilizza normalmente quel valore durante l’esecuzione prevista dal ciclo.

Se il segnale fisico cambia poco dopo, il nuovo stato sarà normalmente acquisito nella scansione successiva, salvo l’utilizzo di funzioni o istruzioni che consentano l’accesso diretto o immediato all’hardware.

Questo evita che diverse parti dello stesso programma lavorino necessariamente su stati acquisiti in istanti differenti.

Esecuzione del programma

Dopo l’acquisizione degli ingressi, la CPU esegue le istruzioni del programma.

Per esempio:

START AND CONSENSO_OK → MARCIA

oppure:

TEMPERATURA > 80 °C → ALLARME_TEMPERATURA

Durante questa fase vengono elaborate:

  • operazioni logiche;
  • confronti;
  • calcoli;
  • timer;
  • contatori;
  • sequenze;
  • variabili interne;
  • condizioni di comando.

Il risultato delle elaborazioni determina i valori che dovranno essere assegnati alle uscite e agli stati interni.

Immagine delle uscite

Durante l’esecuzione del programma, il PLC prepara normalmente anche lo stato delle uscite.

Per esempio:

Q1 = 1

Q2 = 0

Q3 = 1

Questi valori possono essere conservati in una immagine di processo delle uscite.

Terminata l’elaborazione prevista, il PLC trasferisce questi stati ai moduli di uscita.

Il percorso diventa quindi:

ingressi fisici → immagine ingressi → programma → immagine uscite → uscite fisiche

Aggiornamento delle uscite

Quando viene aggiornata l’uscita fisica, il modulo di uscita trasforma il valore logico nel corrispondente segnale elettrico.

Per esempio:

Q1 = 1

può determinare l’attivazione di un’uscita a transistor che alimenta la bobina di un relè.

Il PLC conclude quindi la parte principale della scansione e inizia il ciclo successivo.

Tempo di scansione

Il tempo necessario a completare un ciclo prende il nome di tempo di scansione.

Può dipendere da numerosi fattori, tra cui:

  • velocità della CPU;
  • dimensione del programma;
  • tipo di istruzioni utilizzate;
  • numero di moduli;
  • comunicazioni;
  • funzioni diagnostiche;
  • carico complessivo del sistema.

Per esempio, una scansione potrebbe richiedere alcuni millisecondi.

Se:

tempo di scansione = 5 ms

in condizioni semplificate la CPU completa circa 200 scansioni al secondo.

Il tempo di scansione non è necessariamente sempre identico: può variare in funzione delle operazioni eseguite.

Perché il tempo di scansione è importante

Il PLC può reagire a un evento soltanto dopo che questo è stato acquisito ed elaborato.

Supponiamo che un ingresso cambi stato subito dopo la lettura degli ingressi.

Nella normale elaborazione ciclica quel cambiamento potrebbe essere riconosciuto soltanto alla scansione successiva.

A questo tempo devono inoltre essere aggiunti i tempi propri:

  • del sensore;
  • del modulo di ingresso;
  • dell’elaborazione;
  • del modulo di uscita;
  • dell’attuatore.

Il tempo di risposta complessivo della macchina non coincide quindi semplicemente con il tempo di scansione della CPU.

Impulsi brevi

Se un impulso dura meno del tempo necessario affinché il normale ciclo lo acquisisca, può non essere rilevato.

Per esempio, un impulso potrebbe iniziare e terminare completamente tra due letture ordinarie degli ingressi.

Per segnali veloci si utilizzano quindi, quando necessario:

  • ingressi ad alta velocità;
  • contatori hardware;
  • interrupt o funzioni evento;
  • moduli tecnologici dedicati.

Questo riprende il concetto già visto per gli ingressi speciali.

Scritture multiple della stessa uscita

Durante l’esecuzione del programma una stessa variabile o uscita può, tecnicamente, essere elaborata in più punti.

Per esempio:

all’inizio del programma:

MOTORE = 1

e più avanti:

MOTORE = 0

Se entrambe le istruzioni vengono eseguite nello stesso ciclo, il valore finale dipenderà dall’ordine e dalla logica del programma.

Questo può rendere il comportamento difficile da comprendere.

È quindi importante progettare il programma in modo che sia chiaro quale logica determina realmente lo stato finale di ciascun comando.

Esecuzione ciclica principale

Nei PLC più evoluti il programma non è necessariamente costituito da un solo ciclo.

Possono essere presenti diversi task, cioè gruppi di programma eseguiti secondo modalità differenti.

In molte piattaforme una parte del programma viene eseguita continuamente: terminata un’esecuzione, ne inizia un’altra secondo le modalità previste dal controllore.

Per esempio:

task principale → esecuzione continua

Il tempo tra due esecuzioni dipende dal funzionamento previsto dal controllore e dalla configurazione del task.

Task a intervallo temporale definito

Un task può essere eseguito anche a intervalli temporali definiti.

Per esempio:

ogni 10 ms

oppure:

ogni 100 ms

Questo è utile quando una determinata funzione deve essere elaborata con una periodicità stabilita, indipendentemente dal tempo impiegato dal programma principale entro i limiti previsti dal sistema.

Per esempio:

  • regolazioni;
  • campionamenti;
  • elaborazioni periodiche;
  • aggiornamenti specifici.

Task su evento

Alcuni controllori permettono di eseguire determinate parti di programma in seguito a un evento.

L’evento può essere, per esempio:

  • un cambiamento su un ingresso;
  • il raggiungimento di un valore;
  • un evento proveniente da un modulo;
  • una condizione generata da una comunicazione.

Questa modalità viene utilizzata quando una funzione deve reagire a determinati eventi senza attendere necessariamente il normale ciclo del programma.

Le modalità precise dipendono dall’architettura del PLC utilizzato.

Priorità dei task

Quando sono presenti più task, il controllore può assegnare loro differenti priorità.

Un task a priorità elevata può interrompere temporaneamente l’esecuzione di un task meno prioritario per eseguire una funzione che richiede una risposta più rapida.

Questo significa che, nei sistemi complessi, il tempo di esecuzione non dipende soltanto dalla lunghezza del programma, ma anche dalla gestione delle priorità.

Una progettazione errata può provocare ritardi, variazioni dei tempi o sovraccarico della CPU.

RUN

In stato RUN la CPU esegue normalmente il programma di automazione.

Durante RUN il PLC:

  • acquisisce gli ingressi;
  • esegue la logica;
  • aggiorna le uscite;
  • gestisce comunicazioni e diagnostica secondo la configurazione prevista.

RUN rappresenta quindi lo stato normale di esecuzione del programma.

STOP

In stato STOP la CPU non esegue normalmente il programma ciclico dell’automazione.

Il comportamento delle uscite durante STOP dipende dal controllore e dalla configurazione adottata.

Le uscite possono, per esempio:

  • essere portate a uno stato definito;
  • essere disattivate;
  • assumere un comportamento configurato.

Non bisogna quindi presumere che lo STOP produca sempre lo stesso risultato su qualsiasi PLC.

Il comportamento deve essere verificato nella documentazione e definito durante il progetto.

Passaggio da STOP a RUN

Quando la CPU passa da STOP a RUN può essere necessario eseguire operazioni di inizializzazione.

Per esempio:

  • azzerare determinate variabili;
  • conservare valori ritentivi;
  • verificare lo stato fisico della macchina;
  • inizializzare sequenze;
  • controllare eventuali anomalie;
  • impedire una ripartenza indesiderata.

Il semplice ritorno in RUN non deve essere confuso con il comando di avviamento della macchina.

Il PLC può essere perfettamente in RUN mentre tutte le uscite di movimento restano disattivate in attesa delle corrette condizioni di partenza.

Watchdog

Il PLC deve anche verificare che il proprio programma venga eseguito entro tempi compatibili con il funzionamento previsto.

Per questo viene normalmente utilizzato un watchdog.

Il watchdog controlla che l’esecuzione del programma non superi un limite temporale definito.

Se, per esempio, il programma entra in una condizione anomala e non completa la propria elaborazione entro il tempo previsto, il watchdog può generare un errore e portare la CPU in una condizione controllata.

Il watchdog serve quindi a riconoscere situazioni in cui il programma non sta più procedendo correttamente.

Diagnostica della CPU

Un PLC industriale non si limita a eseguire la logica.

Può controllare e segnalare numerose condizioni interne e di sistema, per esempio:

  • errore di un modulo;
  • perdita di comunicazione;
  • mancanza di alimentazione di una sezione;
  • errore di configurazione;
  • superamento del tempo massimo di ciclo;
  • memoria insufficiente;
  • guasti o anomalie delle periferiche.

Queste informazioni possono essere rese disponibili:

  • nel software di programmazione;
  • attraverso LED di stato;
  • mediante HMI;
  • attraverso sistemi di supervisione;
  • nel programma stesso.

La diagnostica permette quindi di distinguere un problema del processo da un problema del sistema di controllo.

PLC e logica a relè

Prima della diffusione dei PLC molte automazioni venivano realizzate con relè, temporizzatori e contattori cablati fisicamente.

Per modificare una funzione era spesso necessario modificare il cablaggio.

Il PLC mantiene concettualmente molte delle stesse funzioni:

  • ingressi;
  • condizioni;
  • memorie;
  • temporizzazioni;
  • uscite;

ma gran parte della logica viene realizzata mediante software.

Per esempio, una funzione che in logica cablata richiederebbe diversi contatti ausiliari può essere rappresentata nel programma mediante condizioni logiche.

Questo non significa che il PLC elimini i componenti elettromeccanici.

Relè, contattori, protezioni e dispositivi di potenza continuano a essere utilizzati quando necessari.

Il PLC sostituisce principalmente la logica cablata di controllo con una logica programmabile.

Modifica del comportamento

Uno dei principali vantaggi del PLC consiste nella possibilità di modificare il comportamento dell’automazione senza dover necessariamente ricablare l’intero circuito di comando.

Se, per esempio, una sequenza deve diventare:

A → B → C

anziché:

A → C → B

la modifica può riguardare principalmente il programma, purché l’hardware disponibile sia già adeguato alla nuova funzione.

La flessibilità software non elimina comunque la necessità di verificare:

  • compatibilità degli ingressi;
  • compatibilità delle uscite;
  • potenza disponibile;
  • sicurezza;
  • cablaggio;
  • caratteristiche degli attuatori.

Esempio di una scansione

Consideriamo un semplice sistema con:

START

CONSENSO_OK

e:

MOTORE

All’inizio della scansione il PLC legge:

START = 1

CONSENSO_OK = 1

Il programma esegue:

START AND CONSENSO_OK → MOTORE

Il risultato è:

MOTORE = 1

Al termine dell’elaborazione il PLC aggiorna l’uscita fisica.

La bobina del contattore viene comandata e il motore può essere avviato.

Il PLC inizia immediatamente una nuova scansione.

Se nella scansione successiva:

CONSENSO_OK = 0

la logica produce:

MOTORE = 0

e l’uscita viene disattivata secondo i tempi complessivi del sistema.

La macchina viene quindi controllata attraverso una continua successione di:

lettura → elaborazione → aggiornamento → nuova lettura

Quadro generale

A questo punto il funzionamento essenziale di un sistema controllato da PLC può essere rappresentato come:

sensori → ingressi → CPU → programma → uscite → attuatori

A questo percorso si aggiungono:

feedback → nuovi ingressi → nuova elaborazione

Il processo è quindi ciclico.

Il PLC osserva continuamente lo stato della macchina, applica la logica programmata e aggiorna i propri comandi.

È questa esecuzione continua e deterministica che permette di trasformare ingressi, logica e uscite in un sistema automatico.

19. Linguaggi di programmazione del PLC

Il PLC esegue automaticamente le funzioni descritte nei capitoli precedenti, ma per sapere come comportarsi deve contenere un programma.

Nel programma vengono definite, per esempio:

  • le condizioni necessarie per attivare un’uscita;
  • le combinazioni logiche tra più segnali;
  • le memorie;
  • le temporizzazioni;
  • i conteggi;
  • le sequenze;
  • i consensi;
  • gli interblocchi;
  • i calcoli e le elaborazioni dei valori analogici.

La stessa funzione può essere rappresentata in modi diversi a seconda del linguaggio di programmazione utilizzato.

In ambito PLC il riferimento principale è la norma IEC 61131-3. Nell’edizione corrente sono definiti i linguaggi Structured Text (ST), Ladder Diagram (LD) e Function Block Diagram (FBD); la norma definisce inoltre gli elementi Sequential Function Chart (SFC) per strutturare l’organizzazione interna di programmi e blocchi funzionali.

Nel seguito vengono considerati:

  • Ladder Diagram (LD);
  • Function Block Diagram (FBD);
  • Structured Text (ST);
  • Sequential Function Chart (SFC).

Non si tratta semplicemente di modi diversi di rappresentare la stessa cosa. I linguaggi e gli elementi SFC possiedono caratteristiche che li rendono particolarmente adatti a differenti tipi di problema.

Ladder Diagram — LD

Il Ladder Diagram, normalmente abbreviato in LD, è un linguaggio grafico che deriva concettualmente dagli schemi elettrici a relè.

Il programma viene rappresentato mediante linee logiche nelle quali compaiono elementi come:

  • contatti;
  • bobine;
  • timer;
  • contatori;
  • blocchi funzionali;
  • confronti;
  • altre istruzioni.

Una condizione molto semplice come:

START AND CONSENSO_OK → MOTORE

può essere rappresentata in Ladder mediante due contatti in serie che comandano una bobina.

In forma concettuale:

START — CONSENSO_OK — (MOTORE)

I due contatti in serie realizzano la funzione AND: entrambi devono risultare veri perché la bobina venga attivata.

Se invece due condizioni vengono disposte su rami paralleli, si realizza una funzione OR.

Il Ladder permette quindi di rappresentare graficamente molte delle funzioni logiche già studiate.

Contatti Ladder e contatti fisici

Un elemento grafico rappresentato come contatto nel programma Ladder non deve essere confuso automaticamente con un contatto elettromeccanico realmente presente nell’impianto.

Il contatto Ladder rappresenta la verifica di una condizione logica.

Per esempio, un contatto può verificare:

START

ma può anche verificare:

MOTORE_IN_MARCIA

TEMPERATURA_OK

CICLO_ATTIVO

TIMER_TERMINATO

Queste condizioni possono provenire da ingressi fisici oppure essere variabili generate interamente dal programma.

Il simbolo grafico serve quindi a stabilire se una determinata condizione logica deve essere considerata vera o falsa nel punto in cui viene utilizzata.

Contatto normalmente aperto nel Ladder

Un contatto Ladder normalmente aperto verifica direttamente il valore della variabile associata.

In forma concettuale:

variabile = 0 → condizione falsa

variabile = 1 → condizione vera

Se il contatto rappresenta:

START

esso risulta logicamente vero quando:

START = 1

Contatto normalmente chiuso nel Ladder

Un contatto Ladder normalmente chiuso esegue invece la negazione logica della variabile.

Se rappresenta:

ALLARME

si avrà:

ALLARME = 0 → condizione vera

ALLARME = 1 → condizione falsa

Il contatto normalmente chiuso nel programma realizza quindi concettualmente una funzione NOT.

Anche in questo caso non bisogna confondere il simbolo Ladder con il tipo di contatto fisico del dispositivo collegato all’ingresso.

Un pulsante fisico NA o NC e un contatto logico NA o NC nel programma sono concetti distinti.

Serie e parallelo nel Ladder

Due condizioni in serie rappresentano una funzione AND.

Per esempio:

START AND CONSENSO_OK

significa che entrambe devono essere vere.

Due rami paralleli rappresentano invece una funzione OR.

Per esempio:

START_LOCALE OR START_REMOTO

significa che è sufficiente una delle due condizioni.

Combinando serie, paralleli e contatti negati è possibile realizzare condizioni più articolate.

Per esempio:

(START_LOCALE OR START_REMOTO) AND CONSENSO_OK AND NOT ALLARME

Il Ladder traduce quindi in una rappresentazione grafica la logica booleana già vista.

Bobina

La bobina Ladder rappresenta normalmente il risultato della rete logica.

Per esempio:

START AND CONSENSO_OK → MOTORE

La bobina associata a MOTORE assume lo stato determinato dalla logica che la precede.

La bobina può rappresentare:

  • un’uscita fisica;
  • una variabile interna;
  • uno stato;
  • un comando utilizzato da altre parti del programma.

Anche la bobina Ladder non deve quindi essere identificata automaticamente con una bobina elettromeccanica reale.

Function Block Diagram — FBD

Il Function Block Diagram, abbreviato in FBD, è un linguaggio grafico nel quale le funzioni vengono rappresentate mediante blocchi collegati tra loro.

Ogni blocco riceve determinati ingressi, esegue una funzione e produce una o più uscite.

Per esempio, una funzione AND può essere rappresentata come:

START ──┐

AND ── MOTORE

CONSENSO ─┘

Lo stesso principio può essere utilizzato per:

  • operatori logici;
  • timer;
  • contatori;
  • comparatori;
  • calcoli matematici;
  • regolatori;
  • elaborazioni analogiche;
  • blocchi funzionali creati dal programmatore.

Il flusso delle informazioni risulta quindi visibile attraverso i collegamenti tra i blocchi.

Quando è utile FBD

FBD è particolarmente intuitivo quando il processo può essere descritto come una catena di elaborazioni.

Per esempio:

misura → scalatura → confronto → regolazione → comando

Una misura analogica può essere collegata a un blocco di conversione, poi a un confronto e infine alla logica che genera un comando.

Per questo FBD viene utilizzato frequentemente nelle elaborazioni analogiche, nelle regolazioni e nelle funzioni costituite da blocchi collegati tra loro.

Structured Text — ST

Lo Structured Text, abbreviato in ST, è un linguaggio testuale.

La logica viene scritta mediante istruzioni anziché mediante simboli grafici.

Una condizione come:

START AND CONSENSO_OK AND NOT ALLARME

può essere espressa, in forma semplificata, come:

MOTORE := START AND CONSENSO_OK AND NOT ALLARME;

L’operatore:

:=

indica l’assegnazione di un valore a una variabile.

In questo esempio il risultato dell’espressione logica viene assegnato alla variabile MOTORE.

Operazioni in Structured Text

ST permette di esprimere in modo compatto:

  • operazioni logiche;
  • calcoli matematici;
  • confronti;
  • condizioni;
  • selezioni;
  • cicli;
  • manipolazione di dati;
  • algoritmi più articolati.

Per esempio:

IF Temperatura > 80.0 THEN
AllarmeTemperatura := TRUE;
END_IF;

Il significato è:

se la temperatura è maggiore di 80, rendi vero l’allarme temperatura.

Una scelta tra più condizioni può essere espressa attraverso strutture specifiche del linguaggio.

ST risulta quindi particolarmente utile quando la funzione da realizzare contiene molti calcoli, confronti o elaborazioni che diventerebbero poco leggibili in una rappresentazione completamente grafica.

Grafico e testuale

LD e FBD sono linguaggi prevalentemente grafici.

ST è invece testuale.

Non esiste un linguaggio universalmente migliore.

Per esempio:

  • una semplice logica di marcia e arresto può risultare molto chiara in Ladder;
  • una catena di regolazione può essere facilmente leggibile in FBD;
  • un calcolo articolato può essere molto più semplice da scrivere in ST.

La scelta deve favorire soprattutto:

  • chiarezza;
  • leggibilità;
  • manutenzione;
  • correttezza;
  • adeguatezza alla funzione da realizzare.

Sequential Function Chart — SFC

Il Sequential Function Chart, abbreviato in SFC, viene utilizzato per rappresentare processi costituiti da una successione di fasi.

Il concetto è direttamente collegato alle sequenze automatiche già studiate.

Una struttura semplice può essere:

FASE 0

transizione START

FASE 1

transizione PEZZO_PRESENTE

FASE 2

transizione LAVORAZIONE_COMPLETA

FASE 3

Ogni fase può essere associata a determinate azioni.

Le transizioni stabiliscono invece quando è possibile passare da una fase alla successiva.

Fasi e transizioni in SFC

Una fase rappresenta uno stato della sequenza.

Per esempio:

TRASPORTO

BLOCCAGGIO

LAVORAZIONE

SCARICO

Una transizione contiene la condizione necessaria per procedere.

Per esempio:

PEZZO_IN_POSIZIONE

oppure:

FINECORSA_AVANTI AND PRESSIONE_OK

Quando la fase precedente è attiva e la condizione di transizione diventa vera, la sequenza può avanzare secondo le regole previste.

SFC permette quindi di rappresentare graficamente:

stato → condizione → nuovo stato

Diramazioni in SFC

Una sequenza può contenere anche percorsi alternativi.

Per esempio:

CONTROLLO PEZZO

può portare a:

USCITA NORMALE

se:

PEZZO_OK = 1

oppure a:

SCARTO

se:

PEZZO_OK = 0

SFC consente quindi di rappresentare in modo ordinato anche sequenze con:

  • diramazioni;
  • percorsi alternativi;
  • parallelismi;
  • ricongiungimenti.

Lo stesso problema in linguaggi differenti

Consideriamo una condizione semplice:

il motore può funzionare se START è attivo, il consenso è presente e non esiste un allarme.

La logica è:

START AND CONSENSO_OK AND NOT ALLARME → MOTORE

In Ladder viene rappresentata mediante contatti e bobina.

In FBD mediante blocchi logici collegati.

In ST può essere scritta:

MOTORE := START AND CONSENSO_OK AND NOT ALLARME;

Il comportamento richiesto rimane lo stesso.

Cambia il modo con cui il programmatore lo descrive.

Utilizzo di più linguaggi

Un progetto PLC non deve necessariamente essere scritto interamente con un solo linguaggio.

Quando l’ambiente di sviluppo e il controllore lo consentono, differenti parti del programma possono essere realizzate con linguaggi diversi.

Per esempio:

  • logica di comando in Ladder;
  • elaborazioni analogiche in FBD;
  • calcoli in Structured Text;
  • gestione della sequenza in SFC.

L’obiettivo non è utilizzare il maggior numero possibile di linguaggi, ma scegliere per ogni funzione una rappresentazione chiara e appropriata.

Organizzazione del programma

Un programma industriale non viene normalmente costruito come un’unica lunga sequenza di istruzioni.

Le funzioni vengono suddivise in parti organizzate.

Per esempio:

  • gestione ingressi;
  • elaborazione condizioni;
  • gestione motori;
  • gestione valvole;
  • sequenza automatica;
  • allarmi;
  • comunicazioni;
  • diagnostica.

La norma IEC 61131-3 prevede inoltre strutture software che permettono di organizzare il programma e riutilizzare le funzioni.

Tra queste rientrano programmi, funzioni e blocchi funzionali.

Questi elementi verranno approfonditi successivamente.

Simboli e nomi delle variabili

Nel programma è preferibile utilizzare nomi che descrivano il significato delle informazioni.

Per esempio:

Start

Pressione_OK

Valvola_Aperta

Motore_Trasportatore

sono più comprensibili di soli indirizzi hardware come:

I0.0

I0.1

Q0.2

Gli indirizzi fisici continuano a identificare ingressi e uscite reali, ma il programma può associarli a nomi simbolici più significativi.

Per esempio:

I0.0 → Pulsante_Start

I0.1 → Finecorsa_Avanti

Q0.0 → Contattore_Motore

Questo rende più semplice leggere, verificare e modificare il programma.

Dal problema al programma

Prima di scegliere il linguaggio bisogna comunque definire correttamente il comportamento richiesto.

Il programmatore deve sapere:

  • quali sono gli ingressi;
  • quali sono le uscite;
  • quali condizioni devono essere soddisfatte;
  • quali stati devono essere memorizzati;
  • quali tempi devono essere rispettati;
  • quali anomalie devono essere riconosciute;
  • quale sequenza deve essere eseguita.

Solo successivamente queste regole vengono tradotte nel linguaggio scelto.

Il linguaggio non sostituisce quindi la progettazione della logica.

La sequenza corretta è:

problema → definizione della logica → scelta della rappresentazione → programma PLC

I linguaggi di programmazione sono gli strumenti con cui la logica dell’automazione viene trasformata in istruzioni eseguibili dal controllore.

Fonti

IEC 61131-3:2025 — Programmable controllers — Part 3: Programming languages.

IEC 60204-1:2016 + AMD1:2021 — Safety of machinery — Electrical equipment of machines — Part 1: General requirements.

ISO 13849-1:2023 — Safety of machinery — Safety-related parts of control systems — Part 1: General principles for design.

ISO 13850:2015 — Safety of machinery — Emergency stop function — Principles for design.

IEC 62061:2021 — Safety of machinery — Functional safety of safety-related control systems.

Siemens — SIMATIC S7-1200 / S7-1200 G2 System Manual: ciclo di scansione, immagine di processo, dati ritentivi, contatori e uscite veloci.

Schneider Electric — Machine Expert / Standard Function Blocks: TON, TOF, TP, CTU, CTD, fronti, memorie SR/RS e configurazione dei task.

Balluff — Electrical wiring of sensors: collegamenti e logica PNP/NPN.

WIKA — Handbook Electronic Pressure Measurement: segnali 0–10 V e 4–20 mA.

Analog Devices — documentazione applicativa sulla misura con termocoppie e condizionamento del segnale.

NIST CSRC Glossary — definizioni di bit e byte.