Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Marcello Bonfè
Dipartimento di Ingegneria
Universita’ di Ferrara
Novembre 2001
Capitolo 1
1.1 Introduzione
Lo Standard IEC 61131-3 definisce gli elementi basilari la programmazione di sistemi di controllo
basati su Controllori Logici Programmabili (PLC), quali linguaggi, tipi di dato, unità organizzative
del software.
I dispositivi di controllo commerciali, d’altra parte, hanno molto spesso caratteristiche peculiari
fortemente legate alla Casa Costruttrice, come:
2
i quali sono normalmente azionati da motori elettrici la cui velocità viene regolata meccanicamente
in funzione del carico del nastro. Per tali motori è quindi sufficiente la chiusura del contatto di
alimentazione tramite un segnale logico in uscita dal PLC. Tale segnale sarà disabilitato in fun-
zione dell’arresto della macchina, sia esso dovuto al termine “normale” della produzione o ad una
condizione di emergenza.
Ipotizzando di avere dichiarato le seguenti variabili:
VAR
Avvio_Macchina: BOOL AT %I0.0;
Stop_Macchina: BOOL AT %I0.1;
Emergency: BOOL AT %M0.0;
Motore_Nastro: BOOL AT %Q0.0;
END_VAR
uno schema di programma classico per l’avvio del motore del nastro trasportatore è rappresentato
dal seguente segmento di codice LD, che realizza la cosiddetta “bobina con autoritenuta”:
Ricordando che la scansione del programma da parte del PLC avviene in modo ciclico, e che
il valore delle variabili di memoria e di uscita viene mantenuto tra due cicli di elaborazione suc-
cessivi, la valutazione del segmento permette l’inserimento del motore del nastro quando il segnale
Avvio Macchina è vero anche per un solo ciclo di elaborazione, mantre per tutti i cicli successivi
verrà mantenuto grazie al passaggio di “corrente virtuale” nel contatto condizionato dal valore del-
l’uscita Motore Nastro (autoritenuta). Tale bobina sarà eccitata fintanto che non si ha un valore
vero nè dall’ingresso Stop Macchina, nè dalla condizione di allarme Emergency, variabile di memoria
interna del PLC modificata in altri segmenti di programma in funzione di eventuali condizioni di
malfunzionamento generale della macchina.
Naturalmente, questo semplice segmento può essere modificato in maniera molto intuitiva per
considerare altre condizioni necessarie all’avviamento o sufficienti per lo spegnimento, rispettivamente
inserite nel ramo a monte della diramazione di autoritenuta o a valle di essa.
Come si può notare, tale schema risulta perfettamente compatibile con la creazione di un circuito
elettromeccanico reale, in quanto non utilizza nessun tipo di istruzione diversa da operazioni pura-
mente logico-combinatorie. Inoltre, anche la sua implementazione con il linguaggio Instruction List
(IL) risulta di facile lettura:
LD Avvio_Macchina
OR Motore_Nastro
ANDN Emergency
ANDN Stop_Macchina
ST Motore_Nastro
Un’altra situazione molto comune nell’utilizzo di un attuatore semplice come un motore elet-
trico direttemente connesso all’alimentazione, è quella nella quale il motore può essere alimentato
in modalità perfettamente simmetrica, in maniera tale che si possa selezionarne anche la direzione
3
di marcia. In questo caso, una semplice soluzione consiste nel controllare l’abilitazione dei coman-
di di rotazione oraria o anti-oraria con segmenti analoghi al precedente, ma nei quali sia inseri-
to un “interblocco” che impedisca un’attivazione contemporanea dei due segnali (condizione che
provocherebbe un cortocircuito sui terminali del motore).
VAR
...
Rotaz_Sx:BOOL AT %M0.1
Rotaz_Dx:BOOL AT %M0.2
Marcia_Nastro_Sx:BOOL AT %Q0.1
Marcia_Nastro_Dx:BOOL AT %Q0.2
END_VAR
Marcia_Nastro_Sx Marcia_Nastro_Dx |
>Continua>-------------|/|------------------( )------+
Come si può notare, l’interblocco è rappresentato dal valore dell’uscita di comando della rotazione
simmetrica a quella attivata dalla bobina in esame. In tal modo, è effettivamente impossibile abilitare
contemporaneamente entrambe le uscite, anche se per un errore del programma vi fosse un ciclo di
esecuzione nel quale le variabili booleane Rotaz Dx e Rotaz Sx fossero contemporaneamente vere.
L’equivalente in IL dei due segmenti precedenti è:
LD( Avvio_Macchina
AND Rotaz_Dx
)
OR Marcia_Nastro_Sx
ANDN Emergency
ANDN Stop_Macchina
ANDN Marcia_Nastro_Dx
ST Marcia_Nastro_Sx
4
(* Avviamento macchina e condizioni per la rotazione anti-oraria *)
LD( Avvio_Macchina
AND Rotaz_Sx
)
OR Marcia_Nastro_Dx
ANDN Emergency
ANDN Stop_Macchina
ANDN Marcia_Nastro_Sx
ST Marcia_Nastro_Dx
VAR
Sens1:BOOL AT %I0.0
Sens2:BOOL AT %I0.1
Sens3:BOOL AT %I0.2
MAN1:BOOL AT %I0.3 (* E’ possibile anche una segnalazione manuale
di incendio *)
CL_Alarm:BOOL AT %I0.4 (* Reset manuale della condizione di allarme*)
Alarm:BOOL AT %Q0.0
Pre_alarm:BOOL AT %Q0.1
END_VAR
5
Figura 1.1: Sistema di controllo anti-incendio
| Sens1 Pre_alarm
+-----| |------+-------------------------( )----|
| |
| Sens1 |
+-----| |------+
| |
| Sens1 |
+-----| |------+
|
| CL_Alarm Alarm
+-----|P|-----------------------------(R)----|
|
6
Come si può notare, in questo esempio si è fatto uso di istruzioni LD leggermente evolute rispetto
alle semplici repliche di contatti e bobine elettromeccaniche, come le bobine ritentive (---(S)-- e
---(R)--) e il contatto rilevatore di fronti di salita (---|P|---).
Per quanto riguarda una implementazione in IL dei segmenti precedenti, occorre notare che la
rilevazione del fronte di salita non è prevista come istruzione nativa del linguaggio, ma è necessario
utilizzare un’istanza del Function Block Standard di tipo R TRIG (Rising edge Trigger), un
blocco avente un unico ingresso booleano, CLK ed un unica uscita booleana Q che assume valore
vero in corrispondenza di un fronte di salita dell’ingresso.
Come per ogni Function Block, occorre che l’uso di tale trigger sia dichiarato espressamente tra
le variabili di programma. Pertanto il codice IL diventa:
VAR
Sens1:BOOL AT %I0.0
Sens2:BOOL AT %I0.1
Sens3:BOOL AT %I0.2
MAN1:BOOL AT %I0.3 (* E’ possibile anche una segnalazione manuale
di incendio *)
CL_Alarm:BOOL AT %I0.4 (* Reset manuale della condizione di allarme*)
Alarm:BOOL AT %Q0.0
Pre_alarm:BOOL AT %Q0.1
Fronte_Reset:R_TRIG;
END_VAR
LD Sens1
OR Sens2
OR Sens3
ST Pre_alarm
LD( Sens1
AND Sens2
)
OR( Sens1
AND Sens3
)
OR( Sens2
AND Sens3
)
OR MAN1
S Alarm
LD CL_alarm
CLK Fronte_Reset
LD Fronte_Reset.Q
R Alarm
Si noti come sia possibile per il Function Block Standard R TRIG utilizzare l’ ingresso del bloc-
co come un operatore del linguaggio. Infatti, la riga di codice CLK Reset trigger corrisponde in
7
modo implicito alla chiamata dell’FB ed all’assegnazione al suo ingresso del valore dell’accumulatore.
Tale meccanismo di estensione del linguaggio può essere utilizzato solamente per alcuni dei Function
Blocks Standard (si veda per una panoramica completa la descrizione del linguaggio IL). L’uscita
del FB deve poi essere riferita esplicitamente e caricata nell’accumulatore: se ha valore vero, impone
il reset della variabile Alarm.
La realizzazione in FBD e ST viene lasciata come esercitazione allo studente (si noti che in FBD
occorrerebbe istanziare esplicitamente anche i Function Block di tipo SR, set/reset, utilizzati).
Comando
0
-Eps Set_Point + Eps Temperatura
Dato che tale tipo di controllo è molto comune nella pratica e che esso può essere necessario per
molteplici attuatori nello stesso sistema automatizzato, risulta molto efficiente incapsulare la fun-
zionalità in un Function Block riutilizzabile, che abbia come ingressi il valore misurato, il riferimento
di temperatura ed , e come uscita il comando booleano di accensione della serpentina.
La realizzazione del controllo con isteresi in linguaggio ST è la seguente:
FUNCTION_BLOCK Isteresi
VAR_INPUT
Temperatura:REAL;
Set_Point:REAL;
Eps:REAL;
END_VAR
8
VAR_OUTPUT
Comando:BOOL;
END_VAR
IF Comando THEN
IF Temperatura > (Set_Point + Eps) THEN Comando := FALSE;
END_IF;
ELSIF Temperatura < (Set_Point - Eps) THEN Comando := TRUE;
END_IF;
END_FUNCTION_BLOCK
Si noti che fintanto che il valore di comando è vero, viene testato solamente il superamento del
valore di temperatura più alto consentito, resettando eventualmente il comando, il viceversa se tale
valore è falso.
Per una realizzazione in IL del Function Block, occorre utilizzare delle operazioni di salto con-
dizionato, come è intuibile per il fatto di aver utilizzato un costrutto di selezione nel linguaggio di
alto livello ST. Il codice del FB diventa quindi:
LD Comando
JMPCN Caso_Spento (* Salto eseguito solo se Comando = FALSE *)
Caso_Spento:
LD Temperatura
LT( Set_Point
SUB Eps
)
S Comando
Fine:
END_FUNCTION_BLOCK
Per realizzare la funzionalità con un linguaggio grafico, sia LD che FBD occorre invece utilizzare i
blocchi di istruzione di confronto, addizione e sottrazione, definiti nella IEC 61131-3 come Functions
Standard (non Function Blocks, pertanto non occorre la loro dichiarazione). Ad esempio, i segmenti
LD che permettono di realizzare il ciclo di isteresi potrebbero essere:
9
| +------------+
| Comando | GT | Comando |
+-------------| |----------------+ EN +-----(R)-----+
| | | |
| Temperatura -----+ |
| | |
| +-------+ | |
| ADD | +---+ |
Set_Point ---+ | | | |
| +---+ +------------+
Eps ---+ |
| |
+-------+
| +------------+
| Comando | LT | Comando |
+-------------|/|----------------+ EN +-----(S)-----+
| | | |
| Temperatura -----+ |
| | |
| +-------+ | |
| SUB | +---+ |
Set_Point ---+ | | | |
| +---+ +------------+
Eps ---+ |
| |
+-------+
Si noti come le operazioni di confronto siano abilitate o disabilitate (pertanto eseguite o meno) in
relazione al valore di Comando, e come l’uscita di tali blocchi permetta di settare o resettare tale valore.
Si supponga ora di avere la necessità di monitorare dal punto di vista statistico e diagnostico
una batteria di sensori di temperatura analogici, allo scopo di rilevarne il valore massimo, minimo e
il valore medio. Per realizzare tale operazione, si può pensare di collezionare il valore acquisito dai
sensori in un vettore di numeri reali e di eseguire quindi un ciclo di istruzioni con le operazioni di
somma e confronto necessarie:
VAR
Temperature:ARRAY[1..32] OF REAL;
Max, Min, Media: REAL;
END_VAR
VAR_TEMP
Somma:REAL;
Count:INT;
END_VAR
Max := 0;
Min := 0;
Somma := 0;
FOR Count := 1 TO 32 DO
10
Somma := Temperature[Count] + Somma;
END_FOR
La realizzazione di tale funzionalità con il linguaggio IL, richiede ancora l’utilizzo di istruzioni di
salto condizionato. Tuttavia, al contrario dell’esempio precedente, che realizzava un costrutto tipo IF
.. THEN, in questo caso occorre realizzare un costrutto iterativo, pertanto è necessario introdurre
anche salti “all’indietro”, per i quali cioè la label che indica il punto di arrivo del salto si trova in
una posizione precedente a quella dell’istruzione di salto:
(* Variabili ... *)
LD 1
ST Count
Ciclo:
LD Somma
ADD Temperature[Count]
ST Somma
LD Temperature[Count]
GT Max
JMPCN Nonmassimo (* Salto condizionato dal risultato del
confronto *)
LD Temperature[Count]
ST Max
Nonmassimo:
LD Temperature[Count]
LT Min
JMPCN Nonminimo (* Salto condizionato dal risultato del
confronto *)
LD Temperature[Count]
ST Min
Nonminimo:
LD Count
ADD 1
ST Count
GT 32
JMPCN Ciclo (* Se Count <= 32 riparte dalla label iniziale Ciclo *)
LD Somma (* altrimenti esegue queste ultime istruzioni fuori dal
ciclo *)
DIV 32
ST Media
11
La realizzazione in LD è soggetta a problematiche analoghe relative all’utilizzo di istruzioni di
salto, condizionate dall’uscita logica di blocchi come quelli utilizzati nell’esempio del ciclo di controllo
con isteresi. In tal caso, occorrerà inserire come elemento terminale del segmento LD contentente le
istruzioni di confronto l’elemento grafica che indica il salto:
|
+---- (* Elementi grafici di confronto ... *) -->>Nonmassimo
|
...
Nonmassimo:
...
La descrizione completa del codice LD e FBD (molto simile) è lasciata come esercizio allo studente.
Agitatore
Riempimento
Livello Alto
Livello
basso
Scarico
Il livello della vasca può essere determinato in base a due sensori logici che rilevano la presenza
di un galleggiante in posizioni opportune, Livello Basso e Livello Alto; ciascuna valvola viene
12
comandata con un unico segnale logici, se vero la valvola si apre, se falso si chiude; il motore
dell’agitatore viene comandato con un segnale on/off. Il comando richiesto viene codificato con
un numero intero: 1 per il riempimento del serbatoio, 2 per mantenere stabile il livello, 3 per la
miscelazione, 4 per lo svuotamento.
In questo caso, un metodo efficace per definire il programma di controllo può essere basato su
meccanismi di selezione in grado di discriminare diversi casi possibili, come ad esempio il costrutto
CASE .. OF nel linguaggio ST. Per migliorare ulteriormente la leggibilità del codice, prima di
effettuare il test sul comando richiesto, viene determinato lo stato del serbatoio, memorizzandolo in
un variabile che può assumere i soli valori Pieno, Non Pieno, Vuoto:
VAR
Comando:INT AT %IB0;
Livello_Alto:BOOL AT %I1.0;
Livello_Basso:BOOL AT %I1.1;
Apri/Chiudi_Valvola_Riempimento:BOOL AT %Q0.0;
Apri/Chiudi_Valvola_Scarico:BOOL AT %Q0.1;
Motore_Agitatore:BOOL AT %Q0.2;
1: (* Riempimento *)
Apri/Chiudi_Valvola_Scarico := FALSE;
Motore_Agitatore := FALSE;
IF Stato_Serbatoio <> Pieno THEN
Apri/Chiudi_Valvola_Riempimento := TRUE;
ELSE Apri/Chiudi_Valvola_Riempimento := FALSE;
END_IF;
2: (* Mantenimento *)
Apri/Chiudi_Valvola_Scarico := FALSE;
Apri/Chiudi_Valvola_Riempimento := FALSE;
Motore_Agitatore := FALSE;
3: (* Miscelazione *)
Apri/Chiudi_Valvola_Scarico := FALSE;
Apri/Chiudi_Valvola_Riempimento := FALSE;
IF Stato_Serbatoio = Pieno THEN Motore_Agitatore := TRUE;
13
ELSE Motore_Agitatore := FALSE;
END_IF;
4: (* Svuotamento *)
Apri/Chiudi_Valvola_Riempimento := FALSE;
Motore_Agitatore := FALSE;
IF Stato_Serbatoio <> Vuota THEN
Apri/Chiudi_Valvola_Scarico := TRUE;
ELSE Apri/Chiudi_Valvola_Scarico := FALSE;
END_IF;
END_CASE
La traduzione del costrutto di selezione multipla in un linguaggio differente dal ST, richiederebbe
una notevole quantità di salti condizionati dal risultato di operazioni di confronto, per verificare ogni
caso possibile del valore della variabile intera. Tuttavia, nell’esempio in esame, si può notare come le
istruzioni eseguite nei vari casi non richiedono altro che di abilitare o meno certe uscite booleane. In
particolare, il comando di apertura della valvola di scarico va abilitato solamente nel caso 4, quello
della valvola di riempimento nel caso 1 e cosı̀ via. Pertanto, una soluzione più efficiente potrebbe
essere quella di memorizzare in variabili booleane interne del controllore il risultato dei confronti
sulla variabile intera Comando, condizionando poi con queste il valore dell’uscita logica interessata.
Ad esempio, una realizzazione delle funzionalità richiesta con il linguaggio LD potrebbe essere:
VAR
...
Comando1, Comando2, Comando3, Comando4:BOOL; (* Variabili interne *)
...
END_VAR
| +------+ Comando1 |
+------------+EN +-------( )----+
| | | |
| Comando --+ EQ |
| |
1 --+ |
+------+
14
| Comando1 Comando2 Comando3 +------+ Comando4 |
+-----|/|-------|/|--------|/|---------+EN +-------( )----+
| | | |
| Comando --+ EQ |
| |
4 --+ |
+------+
Si noti la semplificazione sulla controllo dello stato del serbatoio, limitata alla valutazione dei
contatti di livello basso o alto, e l’inibizione delle operazioni di confronto successive a quella che dia
un eventuale risultato positivo (che permette una riduzione del tempo di esecuzione del programma).
FUNCTION_BLOCK Valvola_Timeout
VAR_INPUT
Richiesta_Apertura:BOOL;
Richiesta_Chiusura:BOOL;
FineCorsa_Aperta:BOOL;
FineCorsa_Chiusa:BOOL;
Reset_Errore:BOOL;
Tempo_Limite:TIME;
END_VAR
15
VAR_OUTPUT
Comando_Apertura:BOOL;
Comando_Chiusura:BOOL;
Errore:BOOL;
END_VAR
VAR
Timer_Controllo:TON;
END_VAR
16
| Reset_Errore Errore |
+--------|P|----------------------------------(R)----+
| |
END_FUNCTION_BLOCK
Per realizzare in modo analogo l’algoritmo del Function Block in linguaggio IL, occorre considerare
nuovamente la necessità di rilevare fronti di salita di segnali, introducendo tre instanze del Function
Block Standard R TRIG, per le richieste di apertura e chiusura e per il reset dell’errore. Si noti inoltre
l’utilizzo dell’istruzione CAL nella chiamata del blocco temporizzatore:
FUNCTION_BLOCK Valvola_Timeout
VAR_INPUT
...
VAR_OUTPUT
...
VAR
...
Fronte_Reset_Err:R_TRIG;
END_VAR
LD Richiesta_Apertura
ANDN Comando_Chiusura
S Comando_Apertura
LD Comando_Apertura
AND FineCorsa_Aperta
OR Errore
R Comando_Apertura
LD Richiesta_Chiusura
ANDN Comando_Apertura
S Comando_Chiusura
LD Comando_Chiusura
AND FineCorsa_Chiusa
OR Errore
R Comando_Chiusura
LD Comando_Apertura
ANDN FineCorsa_Aperta
OR( Comando_Chiusura
ANDN FineCorsa_Chiusa
)
ST Timer_Controllo.IN
LD Tempo_Limite
17
ST Timer_Controllo.PT
CAL Timer_Controllo
LD Timer_Controllo.Q
S Errore
LD Reset_Errore
CLK Fronte_Reset_Err
LD Fronte_Reset_Err.Q
R Errore
END_FUNCTION_BLOCK
Un altro esempio di uso di temporizzatori, non impiegati per scopi diagnostici, ma per controllare
l’evoluzione stessa del ciclo operativo, è rappresentato dal tempratore ad induzione analizzato nel
seguito.
Spruzzatore
FC Pistone Alto
Spira +
Pezzo xxxxxxxxxxxxxx
xxxxxxxxxxxxxx
xxxxxxxxxxxxxx FC Pistone Basso
xxxxxxxxxxxxxx
Il processo di tempra ad induzione richiede che un pezzo metallico sia posto in prossimità di un
circuito elettrico induttore, ottenendo cosı̀ il riscaldamento ad elevatissima temperatura del pezzo,
il quale viene poi raffreddato velocemente per mezzo di uno spruzzo di acqua. Nel sistema in esame,
schematizzato in Figura 1.4, il pezzo viene avvicinato alla spira sollevandolo con uno spintore pneu-
matico attivato con un singolo comando logico (1 = alza, 0 abbassa). Le fasi di riscaldamento e di
raffreddamento del ciclo di lavoro devono avere una durata prestabilita, verificata tramite opportuni
temporizzatori. La realizzazione del programma di controllo in linguaggio LD è la seguente:
VAR
Start_Ciclo:BOOL AT %I0.0;
Emergenza:BOOL AT %I0.1
Pezzo_Presente:BOOL AT %I0.3;
FC_Pistone_Alto:BOOL AT %I0.4;
FC_Pistone_Basso:BOOL AT %I0.5;
Salita_Pistone:BOOL AT %Q0.0;
Riscaldamento_Pezzo:BOOL AT %Q0.1;
Spruzzo_Acqua:BOOL AT %Q0.2;
18
Timer_Risc, Timer_Raff:TON;
END_VAR
| Timer_Raffr.Q Salita_Pistone |
+------| |----------+----------(R)-------+
| | |
| Emergenza |
+------| |----------+
Timer_Risc
| Salita_Pistone FC_Pistone_Alto +------------+
+-------| |-------------| |----------+ IN Q+-
| | TON |
| 20s ----+ PT ET+-
+------------+
Timer_Raffr
| Timer_Risc +------------+
+------| |--------------------------+ IN Q+--
| | TON |
10s ----+ PT ET+--
+------------+
La realizzazione dei due esempi negli altri linguaggi non presentati è lasciata come esercizio allo
19
studente.
xxxxxxxxx
xxxxxxxxx xxxxxxxxx
xxxxxxxxx xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx xxxxxxxxx
xxxxxxxxx xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx xxxxxxxxx
xxxxxxxxx xxxxxxxxx
xxxxxxxxx
xxxxxxxxx xxxxxxxxx xxxxxxxxx xxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxxxx
xxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxx
xxxxxxxxx
xxxxxxxx
xxxxxxxxx xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxx
Nastro1
Nastro2
VAR
Start_Linea:BOOL AT %I0.0;
Stop_Linea:BOOL AT %I0.1;
Passaggio_Prodotto:BOOL AT %I0.2;
FinePasso_Nastro2:BOOL AT %I0.3;
Motore_Nastro1:BOOL AT %Q0.0;
Motore_Nastro2:BOOL AT %Q0.1;
END_VAR
20
(* Verifica delle condizioni di produzione con autoritenuta *)
Conteggio_Prod
+--------------+
| Produzione Passaggio_Prodotto | CTU |
+------| |-------------| |-------------->CU |
| | Q+--
| 5 ---+PV |
| Attiva_Passo | |
+-------| |-----------------------------+R CV+--
| | |
| +--------------+
Anche in questo caso, l’implementazione della funzionalità con gli altri linguaggi IEC 61131-3
può essere svolta come esercizio dallo studente.
21
Capitolo 2
2.1 Introduzione
Tra gli elementi comuni dello Standard IEC 61131-3 si trova anche la descrizione sintattica del
formalismo chiamato Sequential Function Chart, il quale riveste un ruolo molto importante tra i
concetti introdotti nel documento IEC. Infatti, tale formalismo rappresenta prima di tutto un metodo
di modellazione del funzionamento richiesto al sistema automatizzato, in grado di fornire una specifica
formale per la realizzazione del software di controllo esente da possibili errori di interpretazione.
In seconda analisi, esso rappresenta anche un metodo per organizzare il software scomponendo le
istruzioni da eseguire in base alle sequenze operative che il sistema controllato deve compiere. Infine,
essendo sempre più numerosi gli Ambienti di Programmazione commerciali che supportano questo
formalismo come un vero e proprio linguaggio di programmazione, esso rappresenta anche un modo
per realizzare il programma di controllo in grado di rispecchiare fedelmente il risultato della fase
iniziale di analisi, descrizione e modellazione del progetto.
Negli esempi che seguono, vedremo infatti come un diagramma SFC sia in grado di fornire una
descrizione dettagliata e non ambigua delle specifiche di funzionamento di un automatismo, dal punto
di vista del progettista del sistema di controllo logico.
22
FC_OutNastro2
Mov_Nastro2
FC_InNastro2
FC_Nastro1
Rot_Oraria
Mov_Nastro1 Rot_AntiOr
VAR
FC_Nastro1:BOOL;
FC_InNastro2:BOOL;
FC_OutNastro2:BOOL;
Fine_Rot_AntiOr:BOOL; (* sensore che rileva il posizionamento in
asse con il nastro 2 da parte della
piattaforma *)
Fine_Rot_Oraria:BOOL; (* sensore che rileva il posizionamento in
asse con il nastro 1 da parte della
piattaforma *)
Mov_Nastro1:BOOL;
Mov_Nastro2:BOOL;
Mov_NastroPiatt:BOOL;
Rot_Oraria:BOOL;
Rot_AntiOr:BOOL;
END_VAR
23
S10 Mov_Nastro1 S30
FC_Nastro1 S11.X
S11 S31 Mov_NastroPiatt
S31.X NOT FC_Nastro1
S12 Mov_Nastro1 S32 Rot_AntiOr
NOT FC_Nastro1 Fine_Rot_AntiOr
S33
S21.X
S20 S34 Mov_NastroPiatt
S33.X FC_InNastro2
S21 Mov_Nastro2 S35 Rot_Oraria
FC_OutNastro2 Fine_Rot_Oraria
S22
NOT FC_OutNastro2
24
2.3 Piattaforma rotante con selezione direzione.
Si consideri il sistema rappresentato in Figura 2.2, composto da un nastro trasportatore, una
piattaforma rotante, due stazioni di foratura ed un nastro di scarico.
Il dispositivo di controllo deve essere in grado di gestire la selezione della stazione di foratura
con la quale lavorare il pezzo, in base alle dimensioni del pezzo stesso. A tale scopo, sul nastro di
ingresso è posizionata una fotocellula che permette di rilevare la lunghezza del prodotto in base al
tempo che esso impiega a transitare completamente oltre la fotocellula stessa. Se tale tempo risulta
essere inferiore a 500 ms il pezzo dovrà essere lavorato dalla stazione di foratura destra, altrimenti
da quella di sinistra. Il nastro prosegue la movimentazione del pezzo, solamente se la piattaforma è
in uno stato ideneo (cioè un pezzo precedentemente ricevuto è stato espulso), ed è possibile valutare
le dimensioni di un nuovo pezzo dopo che quello in esame è stato trasferito completamente sulla
piattaforma (segnale FC Piattaforma attivo). Si suppone che i pezzi sul nastro di ingresso siano
sufficientemente distanziati.
Per posizionare opportunamente la piattaforma, occorre azionare il motore di rotazione con uno
dei comandi ROT DX o ROT SX, fino al rilevamento di un fronte di salita del sensore di prossimità
FC Rotazione, che rileva una delle quattro tacche metalliche montate sulla piattaforma, in modo
che essa effettui un quarto di giro. Terminata la lavorazione, una nuova rotazione di un quarto di giro
nella stessa direzione permetterà di spingere il pezzo sul nastro di scarico, azionando per almeno 800
ms il segnale di avanzamento dell’espulsore Espulsione (lo spintore ritorna in posizione di riposo
per effetto di una molla se il segnale di comando non è attivato).
ROT_DX
NASTRO A NASTRO B
FC_Rotazione
Stazione di Foratura destra
Trascurando per semplicità il controllo delle stazioni di lavorazione e del nastro di scarico, un
diagramma SFC modulare per il controllo indipendente dei due moduli considerati (nastro A e
piattaforma) è il seguente:
VAR
FC_Nastro:BOOL;
FC_Piattaforma:BOOL;
FC_Rotazione:BOOL;
Termine_Foratura_DX:BOOL; (* Segnale dal sottosistema di foratura
della stazione di destra che indica il
completamento della lavorazione *)
25
Termine_Foratura_SX:BOOL; (* Segnale dalla stazione di sinistra *)
Mov_NastroA:BOOL;
ROT_DX:BOOL;
ROT_SX:BOOL;
Espulsione:BOOL;
END_VAR
S10 Mov_NastroA
FC_Nastro
S11
S14 Mov_NastroA
FC_Piattaforma
Figura 2.3: SFC del nastro trasportatore con selezione dimensione prodotto
Si noti, nella soluzione proposta, come il fronte di salita da parte del segnale FC Rotazione sia
rilevato dall’evoluzione di due passi consecutivi condizionata da un segnale prima falso e poi vero
da parte di tale sensore. Una soluzione alternativa poteva essere rappresentata dall’utilizzo di un
Function Block R TRIG, chiamato in una azione del passo opportuno, la cui uscita Q fosse la condizione
di transizione del passo stesso. Si noti inoltre, come sia possibile che il SFC di controllo del nastro
rilevi la dimensione di un pezzo e si ponga in attesa, mentre il SFC di controllo della piattaforma sta
ancora elaborando un pezzo precedente. Al termine delle operazioni su quest’ultimo, il nastro sarà
riattivato e verrà selezionata la corretta sequenza di lavorazione del pezzo.
26
S20
S12.X S13.X
S21 S27
FC_Piattaforma FC_Piattaforma
S22 ROT_SX S28 ROT_DX
NOT FC_Rotazione NOT FC_Rotazione
S23 ROT_SX S29 ROT_DX
FC_Rotazione FC_Rotazione
S24 S30
Termine_Foratura_SX Termine_Foratura_DX
S25 ROT_SX S31 ROT_DX
NOT FC_Rotazione NOT FC_Rotazione
S26 ROT_SX S32 ROT_DX
FC_Rotazione FC_Rotazione
S33 Espulsione
S33.T > 800 ms
27
Uno schema SFC in grado di descrivere il funzionamento del dispositivo di controllo potrebbe
essere il seguente (si noti che l’importo inserito viene mantenuto in una variabile intera):
VAR
END_VAR
28
S20
Passaggio_Moneta
S21 Attiva_Controllo
29
Moneta_01 Moneta_02 Moneta_05 Non_Valida
S22 P Importo := S23 P Importo := P Importo := Espulsione_Ultima
Importo + 1 Importo + 2 S24 Importo + 5 S25
PreCassa_Ultima PreCassa_Ultima PreCassa_Ultima S25.T > 300ms
S22.T > 300 ms AND S23.T > 300 ms AND S24.T > 300 ms AND
(S10 OR S11) (S10 OR S11) (S10 OR S11)
S11 Display(Importo)
30
Richiesta_A Richiesta_B Richiesta_C Richiesta_Annulla
S12 S13 S14 S15 Espulsione_PreCassa
S15.T > 1s
Importo Importo >=6 Importo Importo>= 8 Importo < 10 Importo>=10
<6 <8 Espulsione_C
S16 Espulsione_A S17 Espulsione_B S11 S18
Acquisizione_PreCassa S11 Acquisizione_PreCassa Acquisizione_PreCassa
S16.T > 2s S17.T > 2s S18.T > 2s
Altezza_Max
Altezza_Scarico
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Altezza_Carico
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Il carrello è supposto essere inizialmente nella posizione orizzontale indicata dal sensore di fine
corsa FC Sx e con il magnete completamente sollevato. Pertanto, occorre innanzitutto, alla richiesta
di inizio del ciclo, prelevare un pezzo abbassando il magnete ad Altezza Carico ed in seguito atti-
vandone l’alimentazione. Si supponga che un tempo di attesa di 2 secondi dall’istante di attivazione
del magnete sia sufficiente per garantire la presa di un pezzo.
Per trasferire il pezzo, occorre effettuare il movimento di sollevamento e spostamento orizzontale
verso destra, in modo simultaneo per ottimizzare il tempo di ciclo, avendo cura di impedire che il
carrello possa proseguire oltre la posizione indicata dal sensore Pos Sicura se l’elettromagnete non
ha raggiunto la posizione Altezza Max, al fine di evitare possibili collisioni del pezzo con il piano
rialzato.
Terminato il movimento orizzontale, il ciclo può terminare abbassando il magnete ad Altezza Scarico,
disattivandone l’alimentazione, e riportando il carrello nella posizione iniziale con l’elettromagnete
completamente sollevato. Anche per il rilascio del pezzo, si richiede un tempo di attesa di 2 secondi,
prima di effettuare ulteriori movimenti.
Tale sequenza operativa può essere descritta con il seguente diagramma SFC:
VAR
(* Input del controllore *)
Altezza_Max:BOOL;
Altezza_Carico:BOOL;
Altezza_Scarico:BOOL;
FC_Dx:BOOL;
FC_Dx:BOOL;
Pos_Sicura:BOOL;
31
Attiva_Magnete:BOOL;
S10
Start_Ciclo
S11 Abbassa_Magnete
Altezza_Carico
S12 S Attiva_Magnete
S12.T > 2 s
Motore_Carrello
S13 Solleva_Magnete S14 Dir_Carrello_Dx
Altezza_Max Pos_Sicura
S15 S16
True
Motore_Carrello
S17 Dir_Carrello_Dx
FC_Dx
S18 Abbassa_Magnete
Altezza_Scarico
S19 R Attiva_Magnete
S19.T > 2 s
Motore_Carrello
S20 Solleva_Magnete S21 Dir_Carrello_Sx
Altezza_Max FC_Sx
S22 S23
True
32
2.6 Impilatore prodotti con spintore
Si consideri il sistema automatizzato indicato schematicamente in Figura 2.8 preposto allo stoccaggio
di prodotti in un deposito.
BARRA_ALTA
BARRA_BASSA SOLLEVA_BARRA
ABBASSA_BARRA
MOV_BARRA_DX
MOV_BARRA_SX
FC_DX
FC_SX GRIGLIA_LIBERA GRIGLIA_PIENA
aaaa
aaa
aaa
aaa aaa aaa aaa aaa MOTORE_GRIGLIA a a GRIGLIA_IN_FASE
VAR
FC_Prodotto:BOOL;
Griglia_In_Linea:BOOL;
Griglia_Piena:BOOL;
Barra_Alta:BOOL;
Barra_Bassa:BOOL;
FC_Sx:BOOL;
33
Griglia_Libera:BOOL;
FC_Dx:BOOL;
Motore_Nastro:BOOL;
Motore_Griglia:BOOL;
Mov_Barra_Sx:BOOL;
Mov_Barra_Dx:BOOL;
Solleva_Barra:BOOL;
Abbassa_Barra:BOOL;
END_VAR
S1 S Motore_Nastro
FC_Prodotto
S2 Motore_Griglia
NOT Griglia_In_Linea
S3 Motore_Griglia
Griglia_In_Linea Griglia_In_Linea
AND NOT Griglia_Piena AND Griglia_Piena
S4 R Motore_Nastro
S12.X
Figura 2.9: Diagramma SFC per il controllo del modulo impilatore con nastro
34
S10
S4.X
S11 Mov_Barra_Dx
Griglia_Libera
S12 Mov_Barra_Dx
FC_Dx
True
S17 Mov_Barra_Sx
FC_Sx
S18 Abbassa_Barra
Barra_Bassa
35
2.7 Carrelli ferroviari con binario condiviso
Si consideri il sistema di trasporto rappresentato schematicamente in Figura 2.11, costituito da due
differenti carrelli su rotaia automatizzati A e B, ciascuno dei quali deve trasferire del materiale dalla
propria stazione di carico alla stazione di scarico. I carrelli vengono attivati dal relativo pulsante di
inizio ciclo e percorrono un tratto di binario separato fino ad una determinata posizione di controllo,
oltre la quale possono proseguire solamente se il tratto di binario centrale non è attualmente occupato
dall’altro carrello. Se il carrello è abilitato a proseguire, terminerà il proprio ciclo arrivando alla
postazione di scarico, attendendo due minuti o la pressione di un pulsante di “recupero carrello”
ed attivandosi per il rientro. Anche durante il rientro, occorre verificare prima di proseguire oltre
la posizione di controllo, se il tratto di binario condiviso non sia occupato dall’altro carrello. La
presenza dei carrelli nelle posizioni di carico, scarico e di controllo viene rilevata da sensori logici
opportunamente collocati.
Zona condivisa
Per evitare collisioni sul tratto di binario condiviso, una possibile soluzione è rappresentata dal-
l’introduzione nel diagramma di un passo che rappresenta la condizione del binario centrale: se il
passo è attivo, significa che il carrello che arrivi per primo alla posizione di controllo è abilitato a
proseguire, se invece è disattivo significa che il binario è occupato. La gestione dell’attivazione e
disattivazione di questo passo richiede una connessione tramite divergenze e convergenze parallele
con i diagrammi sequenziali di ciascuno dei due carrelli, ottenendo quindi il diagramma SFC globale
descritto nel seguito. Si noti che il passo S100 rappresenta appunto lo stato del tratto di binario
condiviso. Tale passo deve essere attivo affinchè l’SFC del carrello A (a sinistra) o del carrello B (a
destra) possano evolvere oltre i passi S13, S17, S23 o S27, secondo le regole delle convergenze simul-
tanee. L’evoluzione del diagramma porta alla disattivazione del passo S100 e, a seconda dei casi, di
uno dei passi precedentemente nominati, ed all’attivazione di uno fra i passi S14, S18, S24 o S28.
Questi passi rappresentano una situazione nella quale uno dei due carrelli sta transitando, durante
il movimento di andata o di ritorno, sul binario condiviso, situazione che termina al passaggio del
carrello per la posizione di controllo opportuna. Si noti inoltre che in caso di arrivo contemporaneo
dei due carrelli in una posizione di controllo per l’avanzamento sul binario centrale, viene data la
precedenza sempre al carrello A.
VAR
Start_A:BOOL;
Start_B:BOOL;
Recupero_A:BOOL;
Recupero_B:BOOL;
Scarico_A_OK:BOOL;
Scarico_B_OK:BOOL;
36
Pos_A_Carico:BOOL;
Pos_B_Carico:BOOL;
Pos_A_Controllo_Andata:BOOL;
Pos_B_Controllo_Andata:BOOL;
Pos_A_Controllo_Rientro:BOOL;
Pos_B_Controllo_Rientro:BOOL;
Pos_A_Scarico:BOOL;
Pos_B_Scarico:BOOL;
Motore_A_Avanti:BOOL;
Motore_A_Indietro:BOOL;
Motore_B_Avanti:BOOL;
Motore_B_Indietro:BOOL;
END_VAR
S10 S20
Start_A Start_B
S11 Motore_A_Avanti S21 Motore_B_Avanti
Pos_A_Controllo_Andata Pos_B_Controllo_Andata
S12 S22
37
2.8 Sincronizzazione robot mobili con postazione comune
Si consideri la cella robotizzata rappresentata schematicamente in Figura 2.12, costituita da due
semplici robot A e B preposti rispettivamente al carico ed allo scarico di prodotti da una piattaforma
di saldatura. Quest’ultima è costituita da una tavola rotante con due postazioni per il collocamento
dei prodotti, una idonea al ricevimento o al prelievo di prodotti da parte dei robot, l’altra idonea
alle operazioni di saldatura da parte di un terzo robot non considerato.
Presenza__Rob_Sx
Motore_A_Avanti
Motore_A_Indietro Motore_B_Avanti
Motore_B_Indietro
Presenza_Rob_Centro
Solleva_Pinza_A
Abbassa_Pinza_A
Chiudi_Pinza_A
Pinza_A_Alta
Pinza_A_Bassa
Presenza_Rob_Dx
Pres_Pezzo_Carico
Pres_Pezzo_Scarico
Tavola_In_Fase
VAR
38
(* Input del controllore *)
Pinza_A_Alta:BOOL;
Pinza_A_Bassa:BOOL;
Pinza_B_Alta:BOOL;
Pinza_B_Bassa:BOOL;
Pres_Pezzo_Carico:BOOL;
Pres_Pezzo_Scarico:BOOL;
Tavola_In_Fase:BOOL;
Presenza_Rob_Sx:BOOL;
Presenza_Rob_Centro:BOOL;
Presenza_Rob_Dx:BOOL;
END_VAR
39
S10 S20
Pres_Pezzo_Scarico AND
Pres_Pezzo_Carico Tavola_In_Fase
S11 Abbassa_Pinza_A S21 Abbassa_Pinza_B
Pinza_A_Bassa Pinza_B_Bassa
S12 S
Chiudi_Pinza_A S22 SChiudi_Pinza_B
Solleva_Pinza_A Solleva_Pinza_B
Pinza_A_Alta Pinza_B_Alta
S13 Pos_Rob_Dx
True
S14 Motore_A_Avanti S24 Abbassa_Pinza_B
Pos_Rob_Centro Pinza_B_Bassa
S15 Abbassa_Pinza_A S25 R Chiudi_Pinza_B
Solleva_Pinza_B
Pinza_A_Bassa
Pinza_B_Alta
S16 R Chiudi_Pinza_A
Solleva_Pinza_A S26
Pinza_A_Alta
S17 Motore_A_Indietro
Pos_Rob_Sx S13
True
S27 Motore_B_Indietro
Pos_Rob_Centro
40
2.9 Movimentazione e capovolgimento prodotti
Si consideri il sistema di movimentazione magazzino raffigurato schematicamente in Figura 2.13, il
cui compito è quello di scomporre pile costituite da due prodotti, capovolgere i singoli prodotti, e
conseguentemente ricomporre la pila in modo tale che il prodotto precedentemente in cima si ritrovi
al di sotto e viceversa.
Pinza_B_Stop_Rot Pinza_B_Alta
NB: + Chiudi_Pinza_A(B,C) Rot_Pinza_B Pinza_B_Bassa
Solleva_Pinza_A
Solleva_Pinza_B Solleva_Pinza_C
Pinza_A_alta Abbassa_Pinza_A
Abbassa_Pinza_B Abbassa_Pinza_C Pinza_C_alta
Pinza_A_media Pinza_C_media
Pinza_A_bassa Pinza_C_bassa
Per realizzare tale procedura, vengono adoperati tre nastri trasportatori e tre semplici robot in
grado di afferrare gli oggetti su ciascuno di questi nastri e sollevarli. Il primo robot (A), pertanto,
è incaricato della scomposizione della pila, sollevando dapprima il prodotto in cima, attendendo la
traslazione dell’altro prodotto dal nastro A al nastro B, e quindi riposizionando il prodotto affer-
rato sul nastro. L’ultimo robot (C) ha invece il compito di ricomporre la pila, sollevando il primo
prodotto (già capovolto) che arriva sul nastro C, attendendo l’arrivo del secondo prodotto e quindi
riposizionando il prodotto afferrato in precedenza, sulla cima della pila. Il robot B al centro, infine,
ha il compito di sollevare ogni prodotto che si trovi sul nastro sottostante, capovolgerlo agendo sul
motore di rotazione della pinza e riposizionare il prodotto sul nastro.
Come si può notare dal disegno schematico dell’impianto, il movimento verticale dei robot A e
C può essere arrestato in tre posizioni, che permettono il prelievo o il posizionamento di un oggetto
che poggia sul nastro, che poggia su un altro prodotto, oppure il completo sollevamento della pinza
(che afferri o meno il prodotto). Il robot B ha invece solamente due possibili posizioni (alta e idonea
per la rotazione; bassa e idonea al prelievo o posizionamento prodotto). Il segnale di comando della
chiusura della pinza va mantenuto abilitato per tutta la durata della presa di un oggetto, avendo cura
di attendere almeno 500 ms dall’attivazione o dalla disattivazione di tale segnale prima di iniziare
qualunque movimento.
Trascurando per semplicità la sequenza di movimentazione dei nastri, regolata in base a sensori
di peso o di presenza, che permettono di rilevare la quantità di prodotti che gravano sul nastro, e
applicando una modularizzazione funzionale dell’impianto, è possibile definire il ciclo operativo di
ciascun robot con un diagramma SFC indipendente, come descritto nel seguito, nel quale si suppone
che i robot siano inizialmente in posizione alta e non vi siano prodotti sui nastri:
VAR
41
Pinza_A_Media:BOOL;
Pinza_A_Bassa:BOOL;
Pinza_B_Alta:BOOL;
Pinza_B_Bassa:BOOL;
Pinza_B_Stop_Rot:BOOL;
Pinza_C_Alta:BOOL;
Pinza_C_Media:BOOL;
Pinza_C_Bassa:BOOL;
Solleva_Pinza_B:BOOL;
Abbassa_Pinza_B:BOOL;
Rot_Pinza_B:BOOL;
Solleva_Pinza_C:BOOL;
Abbassa_Pinza_C:BOOL;
Nastro_A_Pronto:BOOL;
Nastro_B_Pronto:BOOL;
Nastro_C_Pronto:BOOL;
END_VAR
42
S10 S20 S30
Nastro_A_Pronto Nastro_B_Pronto Nastro_C_Pronto
S11 Abbassa_Pinza_A S21 Abbassa_Pinza_B S31 Abbassa_Pinza_C
Pinza_A_Media Pinza_B_Bassa Pinza_C_Bassa
S12 S Chiudi_Pinza_A S22 S Chiudi_Pinza_B S32 S Chiudi_Pinza_C
S12.T > 500 ms S22.T > 500 ms S22.T > 500 ms
S13 Solleva_Pinza_A S23 Solleva_Pinza_B S33 Solleva_Pinza_C
Pinza_A_Alta Pinza_B_Alta Pinza_C_Alta
S14 S24 Rot_Pinza_B S34
Nastro_A_Pronto Pinza_B_Stop_Rot Nastro_C_Pronto
S15 Abbassa_Pinza_A S25 Abbassa_Pinza_B S35 Abbassa_Pinza_C
Pinza_A_Bassa Pinza_B_Bassa Pinza_C_Media
S16 R Chiudi_Pinza_A S26 R Chiudi_Pinza_B S36 R Chiudi_Pinza_C
S16.T > 500 ms S26.T > 500 ms S36.T > 500 ms
S17 Solleva_Pinza_A S27 Solleva_Pinza_B S37 Solleva_Pinza_C
Pinza_A_Alta Pinza_B_Alta Pinza_C_Alta
VAR
....
Robot_A: Robot_FB;
Robot_C: Robot_FB;
END_VAR
43
S10
Nastro_Pronto
S11 Abbassa_Pinza
Posizione_Abbassamento_1
S12 S Chiudi_Pinza
S12.T > 500 ms
S13 Solleva_Pinza
Pinza_Alta
S14
Nastro_Pronto
S15 Abbassa_Pinza
Posizione_Abbassamento_2
S16 R Chiudi_Pinza
S16.T > 500 ms
S17 Solleva_Pinza
Pinza_Alta
Robot_A
Robot_FB
Nastro_A_Pronto Nastro_Pronto
Pinza_A_Media Posizione_Abbassamento_1
Pinza_A_Bassa Posizione_Abbassamento_2
Pinza_A_Alta Pinza_Alta
Abbassa_Pinza Abbassa_Pinza_A
Chiudi_Pinza Chiudi_Pinza_A
Solleva_Pinza Solleva_Pinza_A
Robot_C
Robot_FB
Nastro_C_Pronto Nastro_Pronto
Pinza_C_Bassa Posizione_Abbassamento_1
Pinza_C_Media Posizione_Abbassamento_2
Pinza_C_Alta Pinza_Alta
Abbassa_Pinza Abbassa_Pinza_C
Chiudi_Pinza Chiudi_Pinza_C
Solleva_Pinza Solleva_Pinza_C
44