Guía: Ajuste Rápido del TCP en Robots ABB para Dosificación y Mantenimiento

- Paradas prolongadas y fin de semana: Curado o endurecimiento del producto en la punta de la boquilla.
- Intervenciones de mantenimiento: Cambios frecuentes de boquilla o limpieza manual.
- Pequeños impactos: Colisiones menores durante el ajuste o limpieza de la celda.
1. El Desafío del Método Tradicional vs. Referenciado KM0
- Complejidad operativa: Requiere abordar la punta fija desde múltiples orientaciones extremas, un proceso lento y propenso a errores humanos si lo ejecuta un preparador u operario.
- Alteración inadvertida de la orientación: Al recalcular los cuaterniones de rotación en cada calibración de 4/6 puntos, se introducen pequeñas variaciones angulares que modifican el ataque de la boquilla sobre la pieza.
La Filosofía KM0 (Punto de Referencia Estático)

Fase 1: El Referenciado Inicial (Labor del Integrador)
Todo se inicia con fijar un punto de referencia estático en la célula. Este punto debe ser independiente a cualquier zona móvil (cinta transportadora, mesas de apoyo, etc.). Lo ideal es utilizar una punta afilada metálica dispuesta en un pilar fijo.
Esta punta fija se debe referenciar con la punta de referencia maestra dispuesta en el robot. Para ello, ejecutamos una trayectoria de servicio que definirá nuestro "Kilómetro Cero" (KM0): Trayectoria de servicio / Referenciado / Definición de referencia KM0 Boquilla DS1 (Ej. Rutina Zm_DefWobj1pt_DS1).
Fase 2: Verificación y Corrección (Labor del Operario)
A continuación, entra en juego la rutina de verificación y corrección del TCP. Esta rutina confronta la boquilla de dosificado actual (tras un golpe o cambio) con la punta KM0 definida en el procedimiento anterior.
Esta es la rutina que puede y debe utilizar el operador o preparador cada vez que toque o cambie la boquilla de dosificado. Se ejecuta a través de: Trayectoria de servicio / Referenciado / Definición de referencia Herramienta Boquilla DS1 (Ej. Rutina Zm_DefTool_DS1). Este referenciado calcula automáticamente el desfase y ajusta la posición X, Y, Z de la boquilla del robot.
2. Implementación en Código RAPID (ABB)
Declaración de Datos de Programa (PRG_MTV)
TASK PERS wobjdata wDS1:=[FALSE,TRUE,"",[[780.347012139,-667.881109167,909.012965338],[-0.000000391,1,-0.000000648,0.000000232]],[[0,0,0],[1,0,0,0]]];
!_____________________________ MENU DE REFERENCIAS___________________
VAR TrajMaint RepOut1ptDS1:=[4,"Zm_DefTool_DS1","outil Dosificado DS1","Tool.png","T_ROB1"];
!_____________________PUNTOS DE REFERENCIAS 1PT_____________________________
VAR TrajMaint RepObj1ptDS1:=[9,"Zm_DefWobj1pt_DS1","KM0 Dosificado DS1","Wobj.png","T_ROB1"];
Rutina 1: Definición de la Referencia KM0 (Zm_DefWobj1pt_DS1)
!===========================================
! Trayectoria de Referencia en 1 punto (KM0)
! OUTIL = outil tPreh1
!===========================================
PROC Zm_DefWobj1pt_DS1()
! Puntos de aproximación y posición teórica
CONST robtarget p_App:=[[780.351,-667.875,1300],[0,1,0,0],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget pX1:=[[778.85,-692.91,908.40],[3.91413E-07,1,-6.47709E-07,2.32013E-07],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
! Mensajes en pantalla de la FlexPendant
Aff_Traj "Définition repere piece wPreh_KM0";
AntiReboucle;
! Movimiento a punto seguro (Rebouclage)
MoveJ p_reb_prg,V_moyen,Z_arret,Tool_defaut;
! Movimiento de aproximación
MoveJ p_App,V_moyen,Z_moyen,tPreh1\WObj:=wobj0;
MoveL RelTool(pX1,0,0,-50),V_moyen,Z_moyen,tPreh1\WObj:=wobj0;
! Movimiento al punto KM0
MoveL pX1,V_moyen,Z_arret,tPreh1\WObj:=wobj0;
UIMsgWrite "DEFINITION KMO DOSIFICADO PUNTO X1","Verifica el punto pX1, despues modifica posición si es necesario"\Icon:=iconInfo;
Stop\NoRegain;
! Calcula el Wobj con un solo punto de referencia
CalcFrame1pt wDS1.uframe,pX1;
! Retorno seguro
UIMsgBox\Header:="RETORNO A REBOUCLAGE","Salida del robot a rebouclage" \Buttons:=btnOK\Icon:=iconWarning;
MoveL RelTool(pX1,0,0,-50),V_moyen,Z_moyen,tPreh1\WObj:=wobj0;
MoveJ p_App,V_moyen,Z_moyen,tPreh1\WObj:=wobj0;
MoveJ p_reb_prg,V_moyen,Z_arret,Tool_defaut;
ENDPROC
Rutina 2: Verificación y Corrección Dinámica del TCP (Zm_DefTool_DS1)
!===========================================
! Trayectoria para definir TCP Dosificación
!===========================================
PROC Zm_DefTool_DS1()
CONST robtarget p_App_deftool:=[[0.00,0.00,-350],[1,3.84604E-07,-2.27916E-07,-6.85458E-07],[-1,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget p_deftool1:=[[0.00,0.00,0.00],[1,1.23414E-14,-1.35525E-13,1.19209E-07],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
VAR tooldata temp_tool:= [TRUE,[[426.634,-54.4656,435.419],[0.707107,0,0,0.707107]],[31.6,[160.7,272.7,-67.5],[1,0,0,0],6.786,0.627,0.099]];
VAR robtarget temp_pos:=[[53.0358,47.2656,25.1058],[1,-1.25078E-06,7.2529E-07,1.84568E-06],[-1,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
VAR btnres respuesta;
Aff_Traj "Definición Altura Dosificado";
AntiReboucle;
MoveJ p_reb_prg,V_moyen,Z_arret,Tool_defaut;
MoveL p_App_deftool,V_moyen,Z_large,tPreh1\WObj:=wDS1;
MoveL Offs(p_deftool1,0,0,-50),v50,Z_arret,tPreh1\WObj:=wDS1;
UIMsgWrite "Define la posición","Despues ejecuta el programa"\Icon:=iconInfo;
Stop\NoRegain;
UIMsgBox\Header:="GUARDAR POSICIÓN DE DOSIFICADO?","Pulsa SI para guardar la posición actual." \Buttons:=btnYesNo \Icon:=iconWarning \Result:=respuesta;
IF respuesta=resYes THEN
! Obtener la posición de tool0 con respecto al WObj KM0 (wDS1)
temp_pos := CRobT(\Tool:=tool0 \WObj:=wDS1);
! Transformación de coordenadas al marco de la herramienta
temp_tool.tframe.trans.x:= tool0.tframe.trans.x + temp_pos.trans.y;
temp_tool.tframe.trans.y:= tool0.tframe.trans.y - temp_pos.trans.x;
temp_tool.tframe.trans.z:= tool0.tframe.trans.z - temp_pos.trans.z;
! Asignación del nuevo TCP corregido
tPreh1:=temp_tool;
ENDIF
! Salida y retorno a punto seguro
UIMsgBox\Header:="RETORNO A REBOUCLAGE","Salida del robot a rebouclage" \Buttons:=btnOK\Icon:=iconWarning;
MoveL Offs(p_deftool1,0,0,-50),v50,Z_arret,tPreh1\WObj:=wDS1;
MoveL p_App_deftool,V_Moyen,Z_arret,tPreh1\WObj:=wDS1;
MoveJ p_reb_prg,V_moyen,Z_arret,Tool_defaut;
ENDPROC
3. Ventajas Clave de este Método en Entornos de Producción
- Geometría conocida: La orientacion y morfología básica del útil no varían, solo cambia la posición tridimensional de la punta (X, Y, Z).
- Sencillez de ejecución: El robot aborda la referencia siempre con orientación constante y perpendicular.
- Mantenimiento de la orientación: Al no retocar el cuaternión [q_1, q_2, q_3, q_4], se elimina la posibilidad de desorientar la herramienta por imprecisión al mover el joystick.
- Agilidad: El ajuste requiere menos de 2 minutos y permite reanudar el dosificado por el cordón exacto sin necesidad de retocar los puntos de la trayectoria programada.
Recuerda!!, este tipo de procedimientos se pueden desarrollar para aquellas herramientas definidas previamente por los procedimientos 4/6 puntos, ajustando el cálculo de reajuste de las coordenadas de las herramienta a la morfología real.
4. Ajuste de Altura de Dosificado mediante Offset en el oframe
Implementación del Offset en RAPID
VAR num OffsDJT22:= 0;
VAR num OffsDJT28:= 0;
PROC T_COLLE_CED_DJT22()
! Cálculo para aumentar o disminuir cota de altura de dosificado
wST1.oframe.trans.Z:= OffsDJT22;
...
ENDPROC
PROC T_COLLE_CED_DJT28()
! Cálculo para aumentar o disminuir cota de altura de dosificado
wST2.oframe.trans.Z:= OffsDJT28;
...
ENDPROC
Instrucciones para el Operario (Ajuste desde FlexPendant)
- Ir a Menú FlexPendant -> Datos de programa -> Tipo: num.
- Filtrar por el prefijo Offs.
- Seleccionar la variable deseada (ej. OffsDJT22) y pulsar Editar -> Cambiar Valor.
- Introducir el nuevo valor numérico en milímetros mediante el teclado en pantalla y confirmar con OK.
Comportamiento según la orientación del Objeto de Trabajo:
- Si el eje Z del Objeto de Trabajo apunta HACIA ARRIBA:
- Un valor positivo (+Z): Aleja la boquilla de la pieza.
- Un valor negativo (-Z): Aproxima la boquilla a la pieza.
- Si el eje Z del Objeto de Trabajo apunta HACIA ABAJO:
- Un valor positivo (+Z): Aproxima la boquilla a la pieza.
- Un valor negativo (-Z): Aleja la boquilla de la pieza.
5. Desglose Técnico: Estructura de wobjdata (uframe vs oframe)
Campos de la Estructura wobjdata:
| Parámetro | Tipo de Dato | Descripción |
| robhold | bool | Define si el robot sostiene el objeto: TRUE: El robot sostiene el objeto de trabajo, es decir, se está utilizando una herramienta estacionaria. FALSE: El robot no está sosteniendo el objeto de trabajo, es decir, el robot está sosteniendo la herramienta. |
| ufprog | bool | TRUE: Sistema de coordenadas de usuario fijo. FALSE: Sistema móvil (coordinado con ejes externos o MultiMove). |
| ufmec | string | Nombre de la unidad mecánica externa coordinada (ej. "ORBIT_A"). Válido si ufprog es FALSE. |
| uframe | pose | User Frame: Define la posición [x, y, z] y rotación [q_1, q_2, q_3, q_4] de la estación/mesa física respecto al origen MUNDO del robot. |
| oframe | pose | Object Frame: Define la posición [x, y, z] y rotación [q_1, q_2, q_3, q_4] de la pieza específica respecto al uframe. |
¿Por qué modificar el oframe y NO el uframe?
- User Frame (uframe): Representa el soporte físico permanente (la mesa, bancada o riel). Se calibra mediante 3 puntos en la puesta en marcha inicial y rara vez debe modificarse, salvo que se desplace físicamente la estructura en la planta.
- Object Frame (oframe): Representa el sistema de coordenadas propio de la pieza. Está diseñado específicamente para correcciones dinámicas, desviaciones de fabricación, ajustes por visión artificial o correcciones finas de cota como el offset de dosificado.

Conclusión
- ¿Has implementado alguna vez un método para realizar la calibración del TCP de la herramienta?
- ¿Cómo ha sido la experiencia?
Deja tu comentario abajo contando tus trucos o dudas al referenciar herramientas. ¡No olvides suscribirte a OneDoor para no perderte las próximas guías técnicas sobre robótica industrial y automatización!