RI Lezione 10
🤖 Robotica Industriale · IV Anno · Lezione 10
I/O Digitali DI / DO ⚡
Ingressi e uscite digitali · Pinza pneumatica · Sensori · Sincronizzazione con PLC · WAIT
🔌 Il programma diventa una cella reale. Nelle lezioni precedenti il robot si muoveva, ma non interagiva con nulla — nessuna pinza, nessun sensore, nessun PLC. Con gli I/O digitali il robot inizia a comunicare con il mondo esterno: apre e chiude la pinza, legge lo stato dei sensori, si sincronizza con il nastro trasportatore. È il passo che trasforma un programma di movimenti in un ciclo produttivo reale.
🎯 Obiettivi della lezione
- Distinguere ingressi digitali (DI) e uscite digitali (DO) e il loro ruolo nel ciclo produttivo
- Scrivere istruzioni DO[ ]=ON/OFF per comandare attuatori (pinza, ventosa, segnale)
- Usare l’istruzione WAIT per attendere la conferma da un sensore o da un DI
- Integrare DI/DO nel programma pick & place della Lezione 09
- Gestire i casi di errore: timeout di attesa e segnali inattesi
📖 1. Teoria
1.1 — Architettura I/O del controller R-30iB Mate
Il controller R-30iB Mate gestisce la comunicazione con il mondo esterno attraverso un sistema di I/O strutturato. Ogni segnale è identificato da un tipo e un numero di indice.
| Sigla | Nome | Direzione | Uso tipico |
|---|---|---|---|
| DI[n] | Digital Input | Esterno → Controller | Sensori, fine corsa, conferme da PLC, pulsanti |
| DO[n] | Digital Output | Controller → Esterno | Pinza, ventosa, valvole, segnali luminosi, PLC |
| RI[n] | Robot Input | Esterno → Controller | Segnali di sistema: start ciclo, pausa, reset |
| RO[n] | Robot Output | Controller → Esterno | Stato robot: in ciclo, in allarme, in home |
| UI[n] | UOP Input | Esterno → Controller | Segnali UOP: IMSTP, HOLD, SFSPD, ENBL… |
| UO[n] | UOP Output | Controller → Esterno | CMDENBL, SYSRDY, PROGRUN, PAUSED… |
Sul R-30iB Mate, gli I/O fisici disponibili di base sono 28 DI e 28 DO (espandibili con moduli aggiuntivi). I numeri di indice vanno da 1 in su. La mappatura tra numero logico (DO[1]) e morsetto fisico sul cabinet dipende dalla configurazione hardware — in laboratorio questa mappatura è già impostata dal tecnico che ha installato il robot.
1.2 — Istruzione DO[ ]=ON/OFF
L’istruzione di scrittura su uscita digitale ha questa sintassi:
Digital Output
(1–28 o più)
ON oppure OFF
L’istruzione DO[ ]=ON/OFF è istantanea e non bloccante: il controller la esegue in pochi millisecondi e passa subito all’istruzione successiva, senza aspettare nessuna conferma. Se hai bisogno di aspettare una conferma (es. sensore che certifica la chiusura della pinza), usi WAIT — vedi sezione 1.4.
| Istruzione | Significato |
|---|---|
| DO[1]=ON | Attiva uscita 1 — es. chiudi pinza pneumatica |
| DO[1]=OFF | Disattiva uscita 1 — es. apri pinza pneumatica |
| DO[2]=ON | Attiva uscita 2 — es. attiva ventosa vacuum |
| DO[5]=ON | Attiva uscita 5 — es. segnale “ciclo completato” al PLC |
| DO[5]=OFF | Resetta segnale al PLC |
📌 Convenzione di laboratorio ER-4iA: per questa lezione usiamo la seguente mappatura standard: DO[1] = chiudi pinza (ON=chiusa, OFF=aperta) · DO[2] = segnale “robot occupato” al PLC · DI[1] = conferma pinza chiusa da sensore reed · DI[2] = pezzo presente nella zona presa (sensore fotoelettrico).
1.3 — Lettura di DI[ ] in condizioni IF
Gli ingressi digitali si leggono principalmente in due modi: in un’istruzione IF (controllo condizionale) o in un’istruzione WAIT (attesa bloccante). La struttura IF sarà approfondita nella Lezione 12 — qui vediamo la forma base:
IF DI[2]=OFF, JMP LBL[20] // se pezzo assente → salta a etichetta 20
Per questa lezione è sufficiente conoscere la sintassi base. La logica di controllo strutturata (IF/ELSE, LBL, JMP) viene sviluppata nella Lezione 12.
1.4 — Istruzione WAIT
WAIT è l’istruzione più usata con gli I/O: sospende l’esecuzione del programma finché una condizione diventa vera. Il controller rimane fermo su quella riga, aspettando, finché il segnale DI cambia stato.
Esiste anche la forma con timeout — fondamentale in produzione per evitare che il robot si blocchi a tempo indeterminato in caso di guasto sensore:
! Se DI[1] non diventa ON entro il timeout → salta a LBL[99] (gestione errore)
1.5 — Temporizzazione: WAIT con tempo fisso
WAIT può anche aspettare semplicemente un tempo fisso in secondi, utile quando non c’è un sensore di conferma ma si vuole dare tempo a un attuatore pneumatico di completare la sua corsa:
WAIT 1.00(sec) ! attendi 1 secondo
⚠️ WAIT tempo fisso: rischio in produzione. Se la pinza impiega normalmente 0,3 secondi ma per un guasto meccanico o mancanza di pressione ne impiega 2, il programma prosegue comunque dopo 0,5 secondi — con la pinza non ancora chiusa. Il pezzo cade. In un impianto serio si usa sempre WAIT DI[n]=ON (con sensore di conferma) anziché un tempo fisso.
1.6 — Pattern completo: DO + WAIT + conferma
Il pattern industriale standard per comandare un attuatore e verificarne la risposta è sempre una sequenza in tre passi: attiva → attendi conferma → procedi.
3: L P[11:PICK ] 150mm/sec FINE ! scendi sul pezzo
4: DO[1]=ON ! chiudi pinza
5: WAIT DI[1]=ON TIMEOUT, LBL[99] ! aspetta conferma chiusura
6: L P[10:APPR_PICK] 150mm/sec FINE ! risalita — solo se pinza confermata chiusa
! … ciclo …
! === DEPOSITO PEZZO ===
9: L P[21:PLACE ] 150mm/sec FINE ! scendi sul deposito
10: DO[1]=OFF ! apri pinza
11: WAIT DI[1]=OFF TIMEOUT, LBL[99] ! aspetta conferma apertura
12: L P[20:APPR_PLAC] 150mm/sec FINE ! risalita
! … fine ciclo …
! === GESTIONE ERRORE TIMEOUT ===
LBL[99]
DO[2]=ON ! segnala anomalia al PLC
! [qui: in un programma reale si aggiungerebbe un PAUSE o ABORT]
✅ Regola d’oro: non muovere mai il robot dopo un’azione su attuatori senza aver verificato che l’attuatore abbia risposto. La riga di WAIT è quella che trasforma un programma di movimenti in un ciclo produttivo sicuro e affidabile.
💻 2. Esempi guidati nel simulatore
Esempio A — DO semplice: osservare l’uscita nel pannello I/O
- Apri il pannello I/O del simulatore. Dovresti vedere una griglia di indicatori per DO[1]…DO[8] (o più).
- Scrivi un programma minimale:
1: DO[1]=ON
2: WAIT 1.00(sec)
3: DO[1]=OFF
4: WAIT 1.00(sec)
5: DO[1]=ON
6: WAIT 0.50(sec)
7: DO[1]=OFF - Esegui con RUN. Osserva il pannello I/O: DO[1] si accende e spegne secondo la sequenza programmata.
- Nota i tempi: WAIT 1.00 produce una pausa visibile di 1 secondo, WAIT 0.50 una pausa dimezzata.
- Prova a cambiare i tempi di WAIT e riesegui. Come cambia il comportamento?
Esempio B — WAIT DI: simulare un sensore di conferma
- Scrivi il programma:
1: DO[1]=ON
2: WAIT DI[1]=ON
3: DO[2]=ON
4: WAIT 2.00(sec)
5: DO[1]=OFF
6: WAIT DI[1]=OFF
7: DO[2]=OFF - Esegui con RUN. Il programma si blocca alla riga 2 in attesa che DI[1] diventi ON.
- Nel pannello I/O, forza manualmente DI[1]=ON (click sull’indicatore o pulsante FORCE nel simulatore). Il programma riprende: DO[2] si accende, aspetta 2 secondi.
- Alla riga 6, il programma aspetta DI[1]=OFF. Forza DI[1]=OFF nel pannello. DO[2] si spegne.
- Questo simula esattamente il comportamento di una pinza con sensore reed: DO[1]=ON comanda la chiusura, DI[1]=ON conferma che le griffe hanno raggiunto il pezzo.
Esempio C — Pick & place completo con I/O
Riprendiamo il programma PICK_PLACE_01 della Lezione 09 e aggiungiamo la gestione completa della pinza e del segnale al PLC.
! PROG: PICK_PLACE_IO
! Pick & place con pinza e sensori
! DO[1]=pinza DI[1]=conf.chiusa DI[2]=pezzo presente
! ============================================
! — INIT: pinza aperta, segnale robot occupato —
1: DO[1]=OFF
2: DO[2]=ON ! robot occupato → PLC
3: J P[1:HOME ] 100% FINE
! — VERIFICA PEZZO PRESENTE —
4: WAIT DI[2]=ON ! aspetta pezzo nel vassoio
! — TRANSITO VERSO PRESA —
5: J P[10:APPR_PICK] 80% CNT100
! — PRESA —
6: L P[11:PICK ] 150mm/sec FINE
7: DO[1]=ON ! chiudi pinza
8: WAIT DI[1]=ON TIMEOUT, LBL[99] ! attendi conferma
9: L P[10:APPR_PICK] 150mm/sec FINE
! — TRANSITO VERSO DEPOSITO —
10: J P[20:APPR_PLAC] 80% CNT100
! — DEPOSITO —
11: L P[21:PLACE ] 150mm/sec FINE
12: DO[1]=OFF ! apri pinza
13: WAIT DI[1]=OFF TIMEOUT, LBL[99] ! attendi conferma apertura
14: L P[20:APPR_PLAC] 150mm/sec FINE
! — FINE CICLO —
15: J P[1:HOME ] 100% FINE
16: DO[2]=OFF ! robot libero → PLC
! — GESTIONE ERRORE —
LBL[99]
17: DO[2]=OFF
18: DO[3]=ON ! segnale allarme al PLC
! [il programma si ferma qui — richiede reset manuale]
Carica questo programma nel simulatore (i punti P[ ] sono già insegnati dalla Lezione 09). Eseguilo con RUN simulando i segnali DI dal pannello I/O: forza DI[2]=ON all’avvio per simulare il pezzo presente, poi DI[1]=ON dopo DO[1]=ON per simulare la conferma di chiusura pinza.
🏋️ 3. Esercizi
🟢 Esercizio 1 — Sequenza semaforo (Facile)
Scrivi un programma TP che simula un semaforo a 3 colori usando DO[1] (rosso), DO[2] (giallo), DO[3] (verde). La sequenza deve essere: verde 3 secondi → giallo 1 secondo → rosso 3 secondi → giallo 1 secondo → ricomincia (una sola volta — il loop arriva in Lezione 13).
Ogni colore deve essere esclusivo: quando si accende un colore, gli altri due devono essere spenti. Aggiungi commenti per ogni fase. Esegui nel simulatore e verifica i tempi nel pannello I/O.
🔵 Esercizio 2 — Integra I/O nel tuo pick & place (Medio)
Prendi il programma pick & place che hai sviluppato nell’Esercizio 2 della Lezione 09 (cella con presa a Y=–80 e deposito a Y=80) e aggiungi la gestione completa degli I/O seguendo lo schema dell’Esempio C:
— DO[1]: pinza (ON=chiusa, OFF=aperta)
— DI[1]: conferma pinza chiusa
— DI[2]: pezzo presente nella zona presa
— DO[2]: segnale robot occupato
— DO[3]: segnale allarme in LBL[99]
Aggiungi la riga WAIT DI[2]=ON all’inizio (verifica pezzo) e le sequenze DO+WAIT per presa e deposito. Esegui nel simulatore forzando i DI dal pannello I/O.
🟠 Esercizio 3 — Analisi rischi WAIT senza timeout (Medio)
Considera questo frammento di programma in produzione (1000 cicli/turno, robot in AUTO):
7: DO[1]=ON
8: WAIT DI[1]=ON
9: L P[10:APPR_PICK] 150mm/sec FINE
a) Il sensore DI[1] (reed della pinza) si guasta alle 14:37 del turno di notte. Descrivi esattamente cosa succede al programma e all’impianto.
b) Quanto tempo passa prima che un operatore si accorga del problema (stima ragionata)?
c) Riscrivi il frammento con WAIT + TIMEOUT e LBL[99] che: (1) segnala l’allarme su DO[3], (2) porta il robot in home, (3) apre la pinza per sicurezza.
d) Qual è il valore di timeout che sceglieresti per una pinza pneumatica che normalmente chiude in 0,3 secondi? Motiva la scelta.
🟣 Esercizio 4 — Cella con doppia ventosa e logica di selezione (Difficile)
Una cella ha due utensili alternativi sullo stesso robot: una ventosa (DO[1]) per pezzi piatti e una pinza (DO[2]) per pezzi cilindrici. Un sensore DI[3] discrimina il tipo di pezzo: DI[3]=ON → pezzo piatto (ventosa), DI[3]=OFF → pezzo cilindrico (pinza).
I sensori di conferma sono: DI[1]=ventosa in vacuum (pezzo agganciato), DI[2]=pinza chiusa.
Progetta il programma TP per la fase di presa che:
— Legge DI[3] e attiva l’utensile corretto
— Attende la conferma appropriata (DI[1] o DI[2] a seconda dell’utensile)
— Gestisce i timeout separatamente per i due casi con messaggi/segnali distinti (DO[4]=allarme ventosa, DO[5]=allarme pinza)
Usa IF/JMP che hai visto in 1.3 — la logica completa arriva in Lezione 12, ma già ora puoi abbozzarla.
❓ 4. Quiz di verifica
1. Qual è la differenza fondamentale tra DO[ ]=ON e WAIT DI[ ]=ON?
Mostra risposta
DO[ ]=ON è un’istruzione di scrittura: il controller imposta il segnale di uscita e passa immediatamente all’istruzione successiva — non aspetta nessuna risposta. WAIT DI[ ]=ON è un’istruzione di attesa bloccante: il controller sospende l’esecuzione del programma finché l’ingresso digitale specificato raggiunge lo stato ON. In un ciclo pick & place: DO[1]=ON comanda l’elettrovalvola della pinza (istantaneo), WAIT DI[1]=ON aspetta che il sensore reed confermi che le griffe abbiano effettivamente afferrato il pezzo (bloccante fino alla conferma).
2. Perché si raccomanda WAIT DI[1]=ON TIMEOUT invece del semplice WAIT DI[1]=ON in produzione?
Mostra risposta
Perché WAIT senza timeout blocca il programma indefinitamente se il segnale non arriva mai. In produzione i sensori si guastano, le connessioni si allentano, la pressione pneumatica può mancare. Con WAIT … TIMEOUT il controller aspetta per un tempo configurabile; se scade, esegue un salto a un’etichetta di gestione errore dove si possono mettere in sicurezza il robot (torna in home), segnalare l’anomalia al PLC (DO di allarme) e richiedere intervento umano. Senza timeout, un guasto sensore ferma la produzione silenziosamente finché qualcuno non se ne accorge fisicamente.
3. Un programma contiene DO[1]=ON seguito immediatamente da L P[10] 150mm/sec FINE senza WAIT. Cosa può andare storto?
Mostra risposta
Il controller esegue DO[1]=ON (comanda la chiusura della pinza) e immediatamente avvia il movimento L verso P[10]. Se la pinza impiega 300 ms a chiudersi ma il robot inizia a salire subito, nei primi 300 ms la pinza è ancora aperta (o parzialmente chiusa): il pezzo potrebbe cadere durante la risalita, oppure le griffe potrebbero afferrare il pezzo in modo non centrato causando danni al pezzo o all’utensile. La riga WAIT DI[1]=ON garantisce che il robot non si muova finché le griffe non hanno effettivamente serrato il pezzo.
4. Qual è la differenza tra DI/DO e RI/RO nel controller FANUC?
Mostra risposta
DI/DO (Digital Input/Output) sono segnali di processo liberamente programmabili dall’utente: si usano nel codice TP per comandare attuatori (pinze, valvole, luci) e leggere sensori di processo (reed, fotoelettrici, fine corsa). RI/RO (Robot Input/Output) sono segnali di sistema con funzioni predefinite dal controller: RO indicano lo stato del robot (in movimento, in allarme, programma in esecuzione) e RI ricevono comandi di sistema (start ciclo esterno, reset allarme). In pratica: un programmatore usa DI/DO per la logica dell’applicazione, mentre RI/RO vengono configurati dall’integratore per il dialogo con la supervisione di impianto.
5. Perché nella riga di inizializzazione (riga 1 del programma PICK_PLACE_IO) si mette DO[1]=OFF invece di lasciare invariato lo stato della pinza?
Mostra risposta
Perché lo stato iniziale degli I/O dipende da cosa è successo nell’esecuzione precedente — se il programma era stato interrotto durante la fase di presa, DO[1] potrebbe essere rimasto ON (pinza chiusa) anche se non c’è nessun pezzo nella pinza. Partire con DO[1]=OFF garantisce uno stato iniziale noto e sicuro: la pinza è aperta, il robot può muoversi verso la zona presa senza rischio di portare un pezzo fantasma. Questa pratica di “inizializzazione esplicita degli I/O” all’inizio del programma è uno standard di sicurezza industriale.📚 Riepilogo della lezione
- DO[n]=ON/OFF: scrittura istantanea su uscita — non bloccante, eseguita in pochi ms
- WAIT DI[n]=ON/OFF: attesa bloccante su ingresso — il programma si ferma finché la condizione è vera
- WAIT n(sec): pausa temporizzata — comodo per test, rischioso in produzione senza backup sensoriale
- Pattern professionale: DO → WAIT conferma → movimento — mai muoversi senza aver verificato lo stato dell’attuatore
- WAIT + TIMEOUT, LBL[n] è obbligatorio in produzione: gestisce guasti sensore senza bloccare l’impianto indefinitamente
- Inizializzare sempre gli I/O all’inizio del programma per garantire uno stato iniziale noto
Prossima lezione →
Lezione 11 — Registri R[ ]
Variabili numeriche intere e reali nel programma TP.
Contatori, calcoli, offset dinamici e uso nei movimenti.
© Prof. D. Bertolino · Robotica Industriale FANUC ER-4iA · Lezione 10 di 18