Lezione 6 di 18

RI Lezione 06

🤖 Robotica Industriale · IV Anno · Lezione 06

Introduzione al linguaggio TP 📝

Struttura del programma · Intestazione · Istruzioni di movimento · Commenti · /END

⏱️ Durata stimata: 60–75 min 📊 Livello: Intermedio (IV anno) 🔧 Strumenti: Simulatore web · Editor TP 📋 Prerequisiti: Lezioni 01–05 (III anno completo)

🎓 Benvenuto nel IV anno. Nelle lezioni 01–05 hai imparato a muovere il robot manualmente e a capire la sua geometria. Da questa lezione in poi impari a programmarlo: a scrivere istruzioni che il controller esegue in autonomia, ciclo dopo ciclo, senza intervento umano. È il cuore della robotica industriale.

🎯 Obiettivi della lezione

  • Capire cos’è il linguaggio TP e come si relaziona al controller R-30iB Mate
  • Riconoscere e scrivere la struttura base di un programma TP: intestazione, corpo, /END
  • Scrivere istruzioni di movimento J complete con tutti i parametri
  • Inserire commenti nel programma per documentare il codice
  • Caricare, eseguire e modificare un programma nell’editor TP del simulatore

📖 1. Teoria

1.1 — Cos’è il linguaggio TP

Il TP (Teach Pendant) language è il linguaggio di programmazione proprietario dei controller FANUC. È un linguaggio testuale lineare — le istruzioni vengono eseguite nell’ordine in cui sono scritte, una per una, a meno che non ci siano salti o chiamate a sottoprogrammi.

È un linguaggio di basso livello robotico: ogni istruzione di movimento corrisponde direttamente a un’azione del robot. Non esiste astrazione — scrivi “vai al punto P[1] con movimento J al 50% di velocità” e il robot lo fa, punto.

✅ Punti di forza
Semplice da leggere, struttura rigida e prevedibile, eseguito direttamente dal controller senza compilazione, standard industriale FANUC.
⚠️ Limiti
Niente strutture dati complesse, niente funzioni matematiche avanzate (per quelle serve KAREL). Pensato per la produzione, non per algoritmi complessi.
🏭 Dove si usa
Programmazione di celle robotizzate nella quasi totalità delle applicazioni industriali: assemblaggio, pick & place, saldatura, verniciatura.

1.2 — Struttura di un programma TP

Ogni programma TP ha una struttura fissa con tre parti: intestazione, corpo e terminatore. Vediamo un programma minimo completo:

Programma TP minimale — struttura annotata
/PROG PRIMO_PROGRAMMA    // ← intestazione: nome del programma
/ATTR
OWNER       = MNEMON;
COMMENT     = “Il mio primo programma”;
PROG_SIZE   = 0;
CREATE      = DATE 25-01-15; TIME 10:00:00;
MODIFIED    = DATE 25-01-15; TIME 10:00:00;
FILE_NAME   = ;
VERSION     = 0;
LINE_COUNT  = 3;
/APPL

/MN                               // ← inizio del corpo principale
  1: J P[1] 100% FINE           // ← istruzione 1
  2: J P[2] 50% CNT50           // ← istruzione 2
  3: J P[1] 100% FINE           // ← istruzione 3
/END                             // ← terminatore obbligatorio
Sezione Delimitatori Contenuto Obbligatorio?
Intestazione /PROG … /APPL Nome, autore, commento, data, numero righe Sì
Corpo /MN … /END Istruzioni numerate: movimenti, I/O, logica, commenti Sì
Terminatore /END Segnala la fine del programma al controller Sì — senza /END il programma non è valido

📌 Nel simulatore l’intestazione /PROG e /ATTR viene gestita automaticamente. Nell’editor TP del simulatore scrivi solo il corpo — le istruzioni numerate — e il simulatore aggiunge intestazione e /END. Nella realtà industriale (e nei file .TP da trasferire via FTP al controller) l’intestazione completa è obbligatoria.

1.3 — L’istruzione di movimento J

L’istruzione di movimento più semplice è il movimento Joint (J). Il controller porta il robot dal punto corrente al punto target muovendo tutti gli assi simultaneamente, ognuno alla propria velocità massima proporzionale, così che tutti arrivino insieme. La traiettoria del TCP è imprevedibile (curva), ma il movimento è fluido ed efficiente.

J  P[1]  100%  FINE
Tipo di
movimento
Posizione
target
Velocità
(% override)
Terminazione
del movimento

Analizziamo ogni campo:

🔸 Tipo di movimento: J
Joint move. Tutti gli assi si muovono in coordinato. Traiettoria TCP non deterministica (curva). È il tipo più veloce e usato per movimenti di transito tra zone di lavoro.
🔸 Posizione target: P[n]
Registro di posizione. P[1], P[2], … P[999]. Ogni P[ ] contiene X, Y, Z, W, P, R e la stringa di configurazione. I valori vengono inseriti con il teach (jog + registrazione) o modificati manualmente nell’editor di posizione.
🔸 Velocità: n%
Per il movimento J la velocità è espressa in percentuale della velocità massima degli assi (1%–100%). Non è in mm/s — è relativa alla velocità massima dei motori. Il valore effettivo in mm/s del TCP dipende dalla configurazione. Valori tipici: 100% per movimenti di transito veloci, 30–50% per avvicinamenti.
🔸 Terminazione: FINE oppure CNTn
FINE: il robot si ferma completamente nel punto target prima di eseguire l’istruzione successiva. Usato quando serve precisione (presa, deposito, teach).
CNT0–CNT100: Continuous — il robot inizia a deviare verso il punto successivo prima di arrivare al target. CNT0 ≈ FINE, CNT100 = raggio massimo di arrotondamento. Usato per movimenti fluidi senza fermate inutili.
Esempi di istruzioni J valide
Istruzione Significato
J P[1] 100% FINE Vai a P[1] alla massima velocità, fermati completamente
J P[2] 50% FINE Vai a P[2] al 50% della velocità massima, fermati
J P[3] 30% CNT50 Vai verso P[3] al 30%, inizia a virare verso il punto successivo a metà del percorso
J P[HOME] 100% FINE Vai alla posizione di home (P[HOME] è un nome simbolico opzionale)

1.4 — Commenti nel programma TP

I commenti sono righe di testo non eseguite dal controller, usate per documentare il programma. In TP si inseriscono con il prefisso ! (punto esclamativo):

! Questo è un commento — non viene eseguito
1: J P[1] 100% FINE
! — PRESA PEZZO —
2: J P[2] 50% FINE   ! commento inline
3: J P[3] 50% FINE

✅ Buona pratica: commenta sempre l’inizio di ogni fase del ciclo (presa, transito, deposito, ritorno) e ogni istruzione non ovvia. Un programma ben commentato si capisce e si modifica in pochi minuti; uno non commentato richiede ore per essere decodificato anche da chi l’ha scritto.

1.5 — Numerazione delle righe e RENUM

Ogni istruzione nel corpo del programma ha un numero di riga progressivo (1:, 2:, 3:…). I numeri di riga non hanno significato semantico — il programma esegue nell’ordine fisico delle righe, non nell’ordine dei numeri. Servono come riferimento per i salti (JMP LBL) e per la navigazione sull’editor.

Quando inserisci o elimini righe, i numeri si disallineano. Il comando RENUM (renumber) rinumera tutte le righe in sequenza pulita a partire da 1. Nel simulatore è disponibile come pulsante nell’editor TP.


💻 2. Esempi guidati nel simulatore

Esempio A — Primo programma: 3 punti in sequenza

Scriviamo e eseguiamo il primo programma TP. Segui i passaggi nell’ordine esatto.

Fase 1 — Insegna i 3 punti con il jog
  1. Apri il simulatore. Porta il robot in home: J1=0°, J2=–10°, J3=20°, J4=0°, J5=–90°, J6=0°.
    Questo sarà P[1] (home). Nella sezione Teach, premi TEACH J per registrare P[1].
  2. Con jog JOINT porta il robot a: J1=0°, J2=–45°, J3=80°, J4=0°, J5=–90°, J6=0°.
    Questo sarà P[2] (punto di lavoro A). Premi TEACH J per registrare P[2].
  3. Con jog JOINT porta il robot a: J1=60°, J2=–45°, J3=80°, J4=0°, J5=–90°, J6=0°.
    Questo sarà P[3] (punto di lavoro B). Premi TEACH J per registrare P[3].
Fase 2 — Scrivi il programma nell’editor TP
! Programma di test — 3 punti
1: J P[1] 100% FINE   ! home
2: J P[2] 50% FINE    ! punto A
3: J P[3] 50% FINE    ! punto B
4: J P[1] 100% FINE   ! ritorno home
Fase 3 — Esegui il programma
  1. Premi RUN nell’editor TP. Osserva il robot eseguire le 4 istruzioni in sequenza.
  2. La riga corrente viene evidenziata durante l’esecuzione.
  3. Premi STEP per eseguire un’istruzione alla volta — utile per il debug.
  4. Premi STOP per interrompere l’esecuzione in qualsiasi momento.

Esempio B — FINE vs CNT: vedere la differenza

Programma con FINE (fermate complete)
1: J P[1] 100% FINE
2: J P[2] 50% FINE
3: J P[3] 50% FINE
4: J P[1] 100% FINE
Stesso programma con CNT (movimento continuo)
1: J P[1] 100% FINE
2: J P[2] 50% CNT100
3: J P[3] 50% CNT100
4: J P[1] 100% FINE
  1. Esegui la versione con FINE. Osserva le pause complete in P[2] e P[3].
  2. Esegui la versione con CNT100. Osserva che il robot non si ferma in P[2] e P[3] — curva dolcemente tra i punti.
  3. Prova CNT50: il robot si avvicina di più ai punti intermedi rispetto a CNT100.
  4. Prova CNT0: quasi identico a FINE.
✅ Quando usare CNT: movimenti di transito dove il punto intermedio non va raggiunto con precisione (P[2] sopra il pezzo, non sulla superficie). Quando usare FINE: presa, deposito, qualsiasi punto che richiede l’arresto completo del robot.

🏋️ 3. Esercizi

🟢 Esercizio 1 — Analisi di un programma (Facile)

Leggi il seguente programma TP e rispondi alle domande:

! Ciclo pick and place base
1: J P[1] 100% FINE
2: J P[2] 30% FINE
3: J P[3] 30% FINE
4: J P[2] 50% CNT100
5: J P[4] 30% FINE
6: J P[5] 30% FINE
7: J P[4] 50% CNT100
8: J P[1] 100% FINE

a) Quante istruzioni di movimento contiene il programma?
b) In quali punti il robot si ferma completamente? In quali no?
c) P[2] e P[4] appaiono due volte ciascuno. Qual è probabilmente il loro ruolo nel ciclo?
d) Aggiungi 4 commenti ! al programma per documentare le fasi del ciclo.

🔵 Esercizio 2 — Scrivi e testa un programma (Medio)

Progetta e scrivi un programma TP che porta il robot a visitare 5 punti in sequenza, tornando sempre a home alla fine. Requisiti:

— P[1] = home (J1=0°, J2=–10°, J3=20°, J4=0°, J5=–90°, J6=0°)
— P[2], P[3], P[4], P[5] = 4 posizioni a tua scelta nello spazio di lavoro (insegnale col jog)
— Usa FINE per P[1] e P[5], CNT50 per P[2], P[3], P[4]
— Velocità: 100% per i movimenti verso/da home, 40% per i movimenti tra P[2]–P[5]
— Aggiungi almeno 3 commenti significativi

Esegui il programma, osserva il comportamento e verifica che la velocità e le fermate siano quelle attese.

🟠 Esercizio 3 — Debug di un programma errato (Medio)

Il seguente programma contiene 4 errori. Trovali e correggili prima di caricarlo nel simulatore:

1: J P[1] 150% FINE
2: J P[2] 50% CNT200
3: J P[0] 30% FINE
4: J P[3] 30%
5: J P[1] 100% FINE

Per ogni errore trovato: indica la riga, descrivi il problema e scrivi la versione corretta.

🟣 Esercizio 4 — Ottimizzazione velocità (Difficile)

Prendi il programma dell’Esercizio 2 (5 punti). Eseguilo 3 volte con configurazioni diverse e stima visivamente (o misura col timer) la durata del ciclo completo:

Versione A: tutti i movimenti a 30%, tutti FINE
Versione B: movimenti di transito a 100%, avvicinamenti a 30%, FINE sui punti target, CNT100 sui punti di transito
Versione C: configurazione a tua scelta ottimizzata per massima velocità mantenendo FINE sui punti di presa/deposito

Scrivi: qual è il tempo stimato di ogni versione? Quale criterio hai usato per la Versione C? In una cella reale con 1000 pezzi/turno, quanto risparmio di tempo porta la Versione B rispetto alla A?


❓ 4. Quiz di verifica

1. Qual è la differenza tra velocità J espressa in % e velocità L espressa in mm/s?

Mostra risposta

Per il movimento J la velocità in % si riferisce alla velocità massima degli assi articolari — il valore effettivo del TCP in mm/s dipende dalla configurazione del robot e dalla distanza dal punto target. Per il movimento L (che vedremo nella Lezione 07) la velocità si esprime direttamente in mm/s perché il TCP deve mantenere quella velocità costante lungo la traiettoria rettilinea — il controller calcola automaticamente le velocità articolari necessarie.


2. Cosa succede se un programma TP non termina con /END?

Mostra risposta

Il controller non considera il programma valido e rifiuta di eseguirlo. /END è il segnale che indica al parser del controller la fine del programma. Senza di esso, il controller non sa dove termina il programma e potrebbe interpretare dati successivi in memoria come istruzioni, con risultati imprevedibili. Sul simulatore questo è gestito automaticamente, ma su un controller reale o in un file .TP da trasferire, /END è obbligatorio.


3. Qual è la differenza pratica tra CNT0, CNT50 e CNT100?

Mostra risposta

CNT0 è quasi identico a FINE: il robot si avvicina quasi completamente al punto prima di iniziare a deviare. CNT50 inizia a deviare verso il punto successivo quando si trova a metà strada dal punto target. CNT100 inizia a deviare il prima possibile, generando il raggio di arrotondamento massimo — il robot passa più lontano dal punto target ma mantiene la velocità più alta. In pratica: CNT100 per transiti veloci lontani da ostacoli, CNT0 per punti che richiedono precisione ma non un arresto completo.


4. P[0] esiste nel controller FANUC? Cosa succede se lo usi in un programma?

Mostra risposta

No, P[0] non esiste. I registri di posizione FANUC vanno da P[1] a P[999] (o più, a seconda della memoria del controller). Usare P[0] causa un errore di sintassi che il controller segnala al momento del caricamento o dell’esecuzione del programma. Questo è uno degli errori dell’Esercizio 3.


5. Perché nei movimenti di avvicinamento a un pezzo si usa una velocità bassa (es. 30%) invece che 100%?

Mostra risposta

Per due motivi: (1) Sicurezza — se la posizione del pezzo è leggermente diversa da quella insegnata (tolleranze di posizionamento del convogliatore, pezzi non perfettamente allineati), una velocità bassa dà tempo al sensore o all’operatore di rilevare il problema prima della collisione. (2) Precisione — a velocità elevate le inerzie del robot possono causare sovraelongazioni (overshoot) che fanno sforare la posizione target anche con FINE. A 30% l’effetto è trascurabile. I movimenti di transito lontano da ostacoli possono stare a 100% senza problemi.


📚 Riepilogo della lezione

Cosa hai imparato oggi:
  • Il programma TP è composto da intestazione (/PROG…/APPL), corpo (/MN…/END) e terminatore obbligatorio (/END)
  • L’istruzione J P[n] velocità% terminazione ha 4 campi: tipo, target, velocità, terminazione
  • FINE = arresto completo nel punto · CNT0–100 = arrotondamento continuo con raggio crescente
  • I commenti si inseriscono con ! — documentare il codice è una pratica professionale obbligatoria
  • P[n] va da 1 a 999, la velocità J va da 1% a 100%, CNT va da 0 a 100
  • RENUM rinumera le righe dopo inserimenti o cancellazioni

Prossima lezione →

Lezione 07 — Movimenti J, L, C
Differenze cinematiche tra Joint, Linear e Circular.
Velocità in mm/s, applicazioni pratiche e scelta del tipo corretto.

© Prof. D. Bertolino · Robotica Industriale FANUC ER-4iA · Lezione 06 di 18