Lezione 10 di 18

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

⏱️ Durata stimata: 60–75 min 📊 Livello: Intermedio (IV anno) 🔧 Strumenti: Simulatore web · Editor TP · Pannello I/O 📋 Prerequisiti: Lezioni 06–09

🔌 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…
In questa lezione ci concentriamo su DI e DO — i segnali di processo che il programmatore usa direttamente nel codice TP.

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:

DO[1] = ON
Tipo segnale
Digital Output
Indice
(1–28 o più)
Stato
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.

Esempi di istruzioni DO
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[1]=ON, JMP LBL[10]  // se pinza chiusa → salta a etichetta 10
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.

WAIT DI[1]=ON
Attendi finché…
…questo ingresso…
…vale ON (o OFF)

Esiste anche la forma con timeout — fondamentale in produzione per evitare che il robot si blocchi a tempo indeterminato in caso di guasto sensore:

WAIT DI[1]=ON TIMEOUT, LBL[99]
! Se DI[1] non diventa ON entro il timeout → salta a LBL[99] (gestione errore)
Confronto WAIT con e senza timeout
WAIT DI[1]=ON
Il programma si blocca qui finché DI[1] non diventa ON. Se il sensore è guasto e non arriva mai il segnale, il robot rimane fermo indefinitamente — richiede intervento umano.
✅ Usa in simulazione e per test · ⚠️ Evita in produzione senza timeout
WAIT DI[1]=ON TIMEOUT, LBL[99]
Il programma aspetta DI[1]=ON per un tempo configurabile (tipicamente 2–5 secondi). Se scade il timeout senza il segnale, salta a LBL[99] dove si gestisce l’anomalia.
✅ Metodo corretto in produzione · gestisce guasti sensore

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 0.50(sec)  ! attendi 0,5 secondi — tempo di corsa pinza pneumatica
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.

! === PRESA PEZZO — pattern professionale ===

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

  1. Apri il pannello I/O del simulatore. Dovresti vedere una griglia di indicatori per DO[1]…DO[8] (o più).
  2. 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
  3. Esegui con RUN. Osserva il pannello I/O: DO[1] si accende e spegne secondo la sequenza programmata.
  4. Nota i tempi: WAIT 1.00 produce una pausa visibile di 1 secondo, WAIT 0.50 una pausa dimezzata.
  5. Prova a cambiare i tempi di WAIT e riesegui. Come cambia il comportamento?

Esempio B — WAIT DI: simulare un sensore di conferma

  1. 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
  2. Esegui con RUN. Il programma si blocca alla riga 2 in attesa che DI[1] diventi ON.
  3. 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.
  4. Alla riga 6, il programma aspetta DI[1]=OFF. Forza DI[1]=OFF nel pannello. DO[2] si spegne.
  5. 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):

6: L P[11:PICK] 150mm/sec FINE
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

Cosa hai imparato oggi:
  • 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