Está en la página 1de 15

Construcción de una pirámide

con
un robot Staubli TX60.

Alumna: María del Carmen Salas Casas.


DNI: 54201252 G.
Grupo: 13
Fecha: 02/05/2021
Grado: Doble grado de ingeniería
electrónica industrial e ingeniería eléctrica.
Índice.

1. Objetivo. ................................................................................................. 3

2. Introducción. ......................................................................................... 3

3. Puntos de referencia. ............................................................................ 4

4. Funcionamiento del programa ............................................................ 5

5. ANEXOS. ............................................................................................... 8
1. Objetivo.
El objeto del presente proyecto consiste en realizar una aplicación mediante el programa
VAL3 Studio que permita a un robot Staubli TX60 construir una pirámide, con piezas
rectangulares, cuyo número de pisos sea especificado por el usuario.

2. Introducción.
Pirámide G13 se trata de una aplicación que permite al usuario realizar una pirámide con
el número de pisos que este desee, así como cambiar las dimensiones de la pieza que se
emplean.

Figura 1. Pantalla de usuario del MCP.

En la pantalla de usuario del Manual Control Pendant (MCP) se muestra el título de la


aplicación (Pirámide G13), un apartado que contiene la información de los pisos de la
pirámide donde aparece el número de pisos de la pirámide que en primer lugar se ha
inicializado a 3, el número de pisos que quedan por colocar y el número de pisos
colocados. Contiene también un apartado donde aparecen las características de la pieza,
así como su largo, su alto y su ancho, todo ello en milímetros. Además, incluye un texto
informativo que te indica que selecciones una función de las siguientes que posee la
aplicación:
• Pira: Al pulsar la tecla F1, el robot realiza una pirámide con el número de pisos
que haya indicado el usuario.
• DimPZ: Al pulsar la tecla F2, el usuario podrá modificar las características de las
piezas empleadas para realizar la pirámide.
• NumPZ: Al pulsar la tecla F3, el usuario podrá modificar el número de pisos del
que desea realizar la pirámide.
• EXIT: Al pulsar la tecla F8, el usuario ordena la finalización de la tarea haciendo
que el robot vuelva a la posición de reposo.

3
3. Puntos de referencia.
En el presente apartado, se muestran los puntos que se han tomado inicialmente para
realizar la construcción de la pirámide a través de la aplicación realizada.
En primer lugar, se cogió como referencia un punto pOrigen (ver figura 2) situado en la
esquina de la tabla donde se construye la pirámide para situar la pieza a recoger por el
robot siempre en el mismo lugar.

Figura 2. Lugar de recogida de las piezas.

Se tomó también, el punto de referencia pDestino (ver figura 3) donde se comienza a


construir la pirámide.

Figura 3. Lugar de inicio de la construcción de la pirámide.

4
4. Funcionamiento del programa
En el presente apartado, se muestran una serie de figuras de la pantalla de Usuario del
MCP con lo que se explicará el funcionamiento del programa.
Al presionar la tecla F1 de la pantalla de Usuario del MCP, el robot procede a construir
la pirámide con el número de pisos que se hayan especificado (3 pisos en el presente
caso).

Figura 4. Pantalla de Usuario del MCP. Función F1.

Como se muestra en las imágenes anteriores, el robot va construyendo la pirámide. Se


observa que cuando construye el primer piso, el número de pisos que quedan por colocar
decrementa una unidad y el número de pisos que han sido colocados aumenta una unidad.
Una vez colocados todos los pisos, aparece un texto informativo que indica que la
construcción de la pirámide ha finalizado “Pirámide finalizada.” Y pasados unos
segundos, aparece otro texto informativo que te sugiere que selecciones una función
“Seleccione una función.”

Durante todo el proceso de la construcción de la pirámide aparece por pantalla el texto


“La pirámide se está construyendo.” Y cada vez que el robot recoge una pieza de la
posición Origen, cuando este se está acercando a dicha posición, salta por pantalla el
mensaje “Pulse ‘enter’ si desea continuar.” Impidiendo al robot continuar con su labor
hasta que no se pulse la tecla ‘enter’.

5
Al presionar la tecla F2 de la pantalla de Usuario del MCP, la aplicación permite al
usuario cambiar las características de las piezas con las que se va a realizar la pirámide.

Figura 5. Pantalla de Usuario del MCP. Función F2.

En primer lugar, la aplicación pregunta al usuario el largo de la pieza y este podrá


modificar el largo de la pieza o no. Tras pulsar la tecla ‘enter’ la aplicación vuelve a
mostrar un mensaje por pantalla donde pregunta al usuario por el alto de la pieza. Por
último, tras pulsar la tecla ‘enter’ pregunta por el ancho de la pieza. Todas las dimensiones
citadas se presentan en milímetros.

6
Al presionar la tecla F3 de la pantalla de Usuario del MCP, la aplicación permite al
usuario especificar el número de pisos de la pirámide que desea construir.

4
Figura 6. Pantalla de Usuario del MCP. Función F3.

Aparece por pantalla un texto informativo que indica al usuario que introduzca el número
de pisos de la pirámide “Introduzca el nº de pisos de la pirámide.” En el ejemplo de la
figura 6, inicialmente la pirámide se iba a construir de 3 pisos, pero tras seleccionar la
función F3, modificar el número de pisos de la pirámide a 4 y pulsar la tecla ‘enter’ el
número de pisos de la pirámide cambia a 4 y por tanto el número de pisos que quedan por
colocar también se modifica al mismo valor, dejando el número de pisos colocados a cero
ya que todavía no se ha procedido a construir la pirámide.

Aparece, además, las características de la pieza modificadas en la figura 5.

Al presionar la tecla F8 de la pantalla de Usuario del MCP, la aplicación permite al


usuario salir de la aplicación.

Figura 7. Pantalla de Usuario del MCP. Función F8.

Al seleccionar dicha función, el robot vuelve a la posición de reposo y aparece por


pantalla un mensaje de despedida.

7
5. ANEXOS.
En el presente apartado, se muestran las líneas del código, con comentarios explicativos,
que se han escrito para realizar la aplicación.

INFO ()
begin
// Piramide G13
// ------------
// AUTOR
// -----
// María del Carmen Salas Casas.
// DNI: 54201252G.
//
// DESCRIPCION DEL PROGRAMA
// -------------------------
// Construir una pirámide, con piezas rectangulares, cuyo número de pisos sea
especificado por el usuario.
//
// FUNCIONALIDAD
// -------------
// - F1: Monta una pirámide con el número de pisos indicados por el usuario.
// - F2: El usuario modifica las caracteristicas de la pìeza.
// - F3: El usuario introduce el numero de pisos de la piramide.
// - F8: Sale de la aplicacion.
//
// REQUISITOS
// ----------
// - Antes de trasladar debe haber una pieza en la posicon origen y
// debe estar libre la posicion destino.
//
// SITUACION INICIAL
// -----------------
// - El brazo del robot se encontrará en su posición inicial.
// - No debe haber ninguna pieza en la posición de Destino.

// DATOS
// -----
// - Plataforma = 400x300
// - Pieza = 70x22x12
// - Herramienta: Pinza
end

VAR_GLOBAL ()
begin
// BOOL
// - bContinua: autoriza movimientos
// - bFin: indicador de finalizacion
// - bSalir: orden de abandonar la ejecucion de la aplicacion
// - bTraslada: orden de trasladar pieza
//
// JOINT
// - jHome: brazo en la posicion de referencia
//
// MDESC
// - mNomSpeed: descriptor de movimiento a velocidad nominal

8
// - mVelAprox: descriptor de movimiento a velocidad de aproximacion
//
// NUM
// - nAlto: valor del alto de la pieza a emplear para construir la pirámide
// - nAncho: valor del ancho de la pieza a emplear para construir la pirámide
// - nLargo: valor del largo a emplear para construir la pirámide
// - nCV: valor actual del contador de maniobras realizadas
// - nCV1: valor actual del contador de maniobras realizadas 1
// - nPV: valor de preselecion (inicial) del contador de maniobras
// - nPisos: valor actual del contador de pisos de la pirámide
// - nPisosQ: valor actual del número de pisos que han sido construidos
//
// POINT
// - pDestino: posicion de destino del movimiento
// - pDestino1: posicion de destino del movimiento 1 que se empleará para
recuperar la posición de destino inicial tras construir la pirámide
// - pOrigen: Posicion de origen del movimiento
//
// STRING
// - sMensaje: Mensaje que se muestra por pantalla
//
// TOOL
// - tPinza: Herramienta empleada por el robot para trasladar las piezas de
una posición a otra (Pinza).
//
// TRSF
// - trAprox: Transformación de aproximación posición pick/place.
end

Initializ ()
begin
// Inicialización de las variables globales.

// Se inicializan las variables binarias


bContinua=false
bFin=false
bSalir=false
bTraslada=false

// Se inicializan las variables numericas


nCV=0
nCV1=0
nPisosQ=0
nPV=nPisos

//Se inicializan las caracteristicas de la pieza.


nLargo=70
nAncho=22
nAlto=12

// Cadenas de caracteres
sMensaje=""
sMensaje1=""
sMensaje2=""
end

Start ()
begin

9
//Se llama a al programa Initializ para que inicialice las variables
globales
call Initializ()

// Crea las tareas de la aplicacion


taskCreate "interface",100,userInterface()
taskCreate "robot",50,robotMotion()
end

Stop ()
begin

//Titulo del modo STOP.


title("Modo STOP")

//Lo que sale por pantalla.


gotoxy(18,5)
put("STOP")

//Vuelve a la posición de reposo.


movej(jHome,tPinza,mNomSpeed)

waitEndMove()
end

NumPiezas ()
begin

//Permite introducir al usuario el número de pisos de la pirámide.


gotoxy(0,11)
sMensaje="Introduzca el nº de pisos de la pirámide"
//El mensaje sale por pantalla
put(sMensaje)
//El usuario introduce el número de pisos
gotoxy(33,3)
get(nPisos)
nPV=nPisos
//Borra el mensaje de la pantalla.

gotoxy(0,11)
sMensaje=""
end

DimensionesPiez ()
begin

//Se pide el Largo de las piezas


gotoxy(0,11)
sMensaje=" Largo de las piezas (mm): "
//El mensaje sale por pantalla
put(sMensaje)
//El usuario introduce el Largo de la pieza
get(nLargo)

10
//Se pide el Alto de las piezas
gotoxy(0,11)
sMensaje=" Alto de las piezas (mm): "
//El mensaje sale por pantalla
put(sMensaje)
//El usuario introduce el Alto de la pieza
get(nAlto)

//Se pide el ancho de las piezas


gotoxy(0,11)
sMensaje=" Ancho de las piezas (mm): "
//El mensaje sale por pantalla
put(sMensaje)
//El usuario introduce el Ancho de las pieza
get(nAncho)

gotoxy(0,11)
sMensaje=""

end

robotMotion ()
begin

// Control de los movimientos del brazo.


// Se desplaza a la posicion de reposo
pReposo=appro(pOrigen,trAprox)
movej(pReposo,tPinza,mNomSpeed)
// Abrir pinza
waitEndMove()
tPinza.gripper=true
delay(tPinza.otime)

// Bucle principal de la tarea.


// No saldrá del bucle hasta que se de la orden bSalir por medio del
userinterface (F8 en el presente caso).
while !bSalir
//Se comprueba si se ha recibido la orden para realizar la tarea.
if bTraslada
//Se inicializa pDestino1 igual que pDestino para que cuando realice una
pirámide
//pDestino vuelva a ser el pDestino tomado inicialmente.
pDestino1=pDestino

//Se realiza un bucle que mientras el número de pisos no sea igual a


cero, se esté ejecutando.
while (nPisos!=0)
sMensaje2="La pirámide se está construyendo."
gotoxy(4,11)
put(sMensaje2)

//Si el piso a construir es par:


if (nPisosQ%2==0)

//Una vez ha terminado de colocar las piezas del piso


correspondiente aumenta el Largo+Largo/2
//de la pieza a la coordenada X
pDestino.trsf.x=pDestino.trsf.x-((nLargo/2)+nLargo)
//Se realiza un bucle que se esté ejecutando hasta que coloquen las
piezas del piso correspondiente.

11
for nCV=0 to nPisos-1
// Espera la orden de continuar
sMensaje="Pulse 'enter' si desea continuar."
wait(bContinua)
bContinua=false
sMensaje=""
// Orden de coger una de las piezas de la posición de Origen
// Se aproxima a la posicion origen
pAprox=appro(pOrigen,trAprox)
movej(pAprox,tPinza,mNomSpeed)
movel(pOrigen,tPinza,mVelAprox)
// Cierra la pinza
waitEndMove()
tPinza.gripper=false
delay(tPinza.ctime)
// Se aleja de la posicion origen.
movel(pAprox,tPinza,mVelAprox)
// Orden de Colocar una de las piezas de la posición de Destino
// Se aproxima a la posicion destino
pAprox=appro(pDestino,trAprox)
movej(pAprox,tPinza,mNomSpeed)
movel(pDestino,tPinza,mVelAprox)
pDestino.trsf.x=pDestino.trsf.x-(nLargo)
waitEndMove()
// Abrir pinza
tPinza.gripper=true
delay(tPinza.otime)
// Se aleja de la posicion destino
movel(pAprox,tPinza,mVelAprox)

// Regresa a la posicion de reposo


movej(pReposo,tPinza,mNomSpeed)
waitEndMove()
endFor
//Una vez ha terminado de colocar las piezas del piso
correspondiente aumenta el Alto de la pieza a la coordenada Z
pDestino.trsf.z=pDestino.trsf.z+(nAlto)
//Decrementa una unidad el número de pisos que quedan por colocar.
nPisos=nPisos-1
//Incrementa una unidad el número de pisos colocados.
nPisosQ=nPisosQ+1

//Si el piso a construir es impar:


else
//Una vez ha terminado de colocar las piezas del piso
correspondiente aumenta el Largo+Largo/2 de la pieza a la coordenada X
pDestino.trsf.x=pDestino.trsf.x+((nLargo/2)+nLargo)

//Se realiza un bucle que se esté ejecutando hasta que coloque las
piezas del piso correspondiente.
for nCV1=0 to nPisos-1

// Espera la orden de continuar.


sMensaje="Pulse 'enter' si desea continuar."
wait(bContinua)
bContinua=false
sMensaje=""

// Orden de coger una de las piezas de la posición de Origen


// Se aproxima a la posición indicada.
pAprox=appro(pOrigen,trAprox)
movej(pAprox,tPinza,mNomSpeed)
movel(pOrigen,tPinza,mVelAprox)
// Cierra la pinza.
waitEndMove()

12
tPinza.gripper=false
delay(tPinza.ctime)
// Se aleja de la posicion indicada.
movel(pAprox,tPinza,mVelAprox)

// Orden de colocar una de las piezas en la posición de Destino


// Se aproxima a la posicion indicada.
pAprox=appro(pDestino,trAprox)
movej(pAprox,tPinza,mNomSpeed)
movel(pDestino,tPinza,mVelAprox)
pDestino.trsf.x=pDestino.trsf.x+(nLargo)
waitEndMove()
// Abrir pinza.
tPinza.gripper=true
delay(tPinza.otime)
// Se aleja de la posicion destino.
movel(pAprox,tPinza,mVelAprox)

// Regresa a la posicion de reposo.


movej(pReposo,tPinza,mNomSpeed)
waitEndMove()
endFor
//Una vez ha terminado de colocar las piezas del piso
correspondiente de aumenta el Alto de la pieza a la coordenada Z
pDestino.trsf.z=pDestino.trsf.z+(nAlto)
//Decrementa una unidad el número de pisos que quedan por colocar.
nPisos=nPisos-1
//Incrementa una unidad el número de pisos colocados.
nPisosQ=nPisosQ+1

endIf
endWhile
bTraslada=false
//Se recupera la posición de Destino inicial.
pDestino=pDestino1
//El número de pisos colocados vuelve a cero tras terminar de construir
la pirámide.
nPisosQ=0

sMensaje2=" "
put(sMensaje2)
//Mensaje de que la pirámide ha finalizado
sMensaje1=" Pirámide finalizada. "
//El mensaje sale por pantalla
put(sMensaje1)

//Da paso al siguiente mensaje.


delay(7)
//Mensaje
sMensaje1="Seleccione una función. "
//El mensaje sale por pantalla
put(sMensaje1)

endIf
// Da paso a la siguiente tarea
delay(0)
endWhile

// Regresa a la posicion de referencia tras haber salido del bucle al dar la


orden bSalir
movej(jHome,tPinza,mNomSpeed)
// Cerrar pinza
waitEndMove()
tPinza.gripper=false
delay(tPinza.ctime)

13
// Finalizacion de la tarea
bFin=true
end

userInterface ()
begin
//CONTROLAR LA PANTALLA DEL MANDO MANUAL(MCP)

// Establece el titulo
title("Pirámide G13")

// Establece la pagina de usuario en la pantalla


userPage()

// Bucle principal de la tarea


while !bFin

// Borra la pantalla
cls()

// Sale por pantalla la información del número de pisos.


gotoxy(0,1)
put("INFORMACION DE LOS PISOS DE LA PIRAMIDE:")
gotoxy(0,2)
put("Número de pisos de la pirámide: = "+toString("4",nPV))
gotoxy(0,3)
put("Número de pisos por colocar: = "+toString("4",nPisos))
gotoxy(0,4)
put("Número de pisos colocados = "+toString("4",nPisosQ))

//Se pone por pantalla el mensaje de la variable sMensaje


gotoxy(4,10)
put(sMensaje)

//Se pone por pantalla el mensaje de la variable sMensaje1


gotoxy(8,11)
put(sMensaje1)

//Se pone por pantalla el mensaje de la variable sMensaje2


gotoxy(4,11)
put(sMensaje2)

// Muestra las etiquetas encima de las teclas de acuerdo a su funcion.


gotoxy(0,13)
put("Pira")

gotoxy(5,13)
put("DimPZ")

gotoxy(11,13)
put("NumPZ")

gotoxy(35,13)
put("EXIT")

//Se muestran por las dimensiones de la pieza.,


//Las piezas tienen unas medidas por defecto, estas variaran si el usuario
introduce otras caracteristicas de la pieza.
gotoxy(0,6)
put("CARACTERISTICAS DE LAS PIEZAS: ")
gotoxy(0,7)
put("Largo de las piezas(mm): ")
put(nLargo)
gotoxy(0,8)

14
put("Alto de las piezas(mm): ")
put(nAlto)
gotoxy(0,9)
put("Ancho de las piezas(mm): ")
put(nAncho)

// Procesa la tecla pulsada por el usuario.


nTecla=getKey()
switch nTecla
// Tecla Enter
case 270
bContinua=true
break
// F1 permite que el brazo robot construya la piramide.
case 271
bTraslada=true
break
//F2 permite que el usuario modifique las dimensiones de las piezas.
case 272
call DimensionesPiez()
break
// F3 permite que el usuario indique el numero de pisos de la piramide.
case 273
call NumPiezas()
break
// F8 hace que el robot vuelva a su posicion de reposo.
case 278
bSalir=true
break
endSwitch
// Da paso a la siguiente tarea
delay(0)
endWhile
// Borra lo que hay en pantalla.
cls()
// Mensaje de despedida
gotoxy(14,7)
put("Eso es todo.")
gotoxy(9,8)
put("Que tenga un buen día.")
gotoxy(5,12)
put("María del Carmen Salas Casas.")
end

15

También podría gustarte