Hello,
I created a program in my robot to move it to the coordinates and orientation sent to it through EthernetKRL with the option to define BASE, TOOL and other parameters of the movement. I have also created a script in C# in my PC to send the commands to the robot and I am able to make it move to the specified coordinates and orientation.
The problem I am having is that I cannot define the new TOOL and BASE to use when a movement command is sent, so all movements are made relative to the default $WORLD coordiante system and with the default TCP.
I don't want define each tool and base beforehand in the SmartPAD and just change the $ACT_BASE and $ACT_TOOL numbers because this would take away some of the flexibility of the program, so I'm looking to do it in the KRL program itself. Can anyone help me with this?
Here is my code:
SRC:
&ACCESS RVP
&REL 1
&COMMENT Programa de movimiento a coordenadas por EKI
DEF DynamicProg ( )
;FOLD INI
;FOLD BASISTECH INI
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
BAS (#INITMOV,0 )
;ENDFOLD (BASISTECH INI)
;FOLD USER INI
;Make your modifications here
;ENDFOLD (USER INI)
;ENDFOLD (INI)
;--------------------------INICIALIZACIONES-----------------------------
ENA = FALSE
$FLAG[15] = FALSE ;STATUS
$FLAG[16] = FALSE ;TURN
$FLAG[17] = FALSE ;ENABLE
$FLAG[18] = FALSE ;TCP
$FLAG[19] = FALSE ;BASE
$FLAG[20] = FALSE ;ACCEL
$FLAG[21] = FALSE ;VEL
STANDBY = TRUE
LINEAR = FALSE
GOAL_POS_X = 400.0
GOAL_POS_Y = 0.0
GOAL_POS_Z = 308.0
GOAL_ANG_A = -180.0
GOAL_ANG_B = 87.0
GOAL_ANG_C = -180.0
GOAL_STAT = 6
GOAL_TURN = 26
USER_BASE = $NULLFRAME
USER_TCP = $NULLFRAME
ACTUAL = $NULLFRAME
PTP INICIAL ;MOVIMIENTO A POS INICIAL
RET = EKI_Init("CoordinatesMovement") ;ESTABLECE COMUNICACION
RET = EKI_Open("CoordinatesMovement")
;------------------------------LOOP------------------------------------
LOOP ;COMIENZA LOOP DE LECTURA DE DATOS OBJETIVO Y MOVIMIENTO
STANDBY = TRUE ;BOOLEANO A PC PARA HABILITAR ENVIO DE NUEVOS DATOS
RET = EKI_SetBool("CoordinatesMovement","Robot/Read/Standby",STANDBY) ;ENVIO DE HABILITACION
RET = EKI_Send("CoordinatesMovement","Robot")
WAIT FOR $FLAG[17] ;ESPERA FLAG DE RECEPCION DE DATOS
IF $FLAG[17]==FALSE THEN
EXIT
ENDIF
;---------------------------RECEPCION DE DATOS-----------------------------
RET = EKI_GetReal("CoordinatesMovement","Controller/Write/PosX",GOAL_POS_X) ;LECTURA DE DATOS DE COORDENADAS
RET = EKI_GetReal("CoordinatesMovement","Controller/Write/PosY",GOAL_POS_Y)
RET = EKI_GetReal("CoordinatesMovement","Controller/Write/PosZ",GOAL_POS_Z)
RET = EKI_GetReal("CoordinatesMovement","Controller/Write/AngA",GOAL_ANG_A)
RET = EKI_GetReal("CoordinatesMovement","Controller/Write/AngB",GOAL_ANG_B)
RET = EKI_GetReal("CoordinatesMovement","Controller/Write/AngC",GOAL_ANG_C)
RET = EKI_GetBool("CoordinatesMovement","Controller/Write/Linear",LINEAR)
IF $FLAG[15]==TRUE THEN ;VERIFICA SI SE ESPECIFICO STATUS
RET = EKI_GetInt("CoordinatesMovement","Controller/Write/Status",GOAL_STAT)
ENDIF
IF $FLAG[16]==TRUE THEN ;VERIFICA SI SE ESPECIFICO TURN
RET = EKI_GetInt("CoordinatesMovement","Controller/Write/Turn",GOAL_TURN)
ENDIF
IF $FLAG[18]==TRUE THEN ;VERIFICA SI SE ESPECIFICO TCP
RET = EKI_GetFrame("CoordinatesMovement","Controller/Write/TCP",USER_TCP)
ENDIF
IF $FLAG[19]==TRUE THEN ;VERIFICA SI SE ESPECIFICO BASE
RET = EKI_GetFrame("CoordinatesMovement","Controller/Write/Base",USER_BASE)
ENDIF
IF $FLAG[20]==TRUE THEN ;VERIFICA SI SE ESPECIFICO ACCELERACION
RET = EKI_GetReal("CoordinatesMovement","Controller/Write/Accel",GOAL_ACCEL)
ENDIF
IF $FLAG[21]==TRUE THEN ;VERIFICA SI SE ESPECIFICO VELOCIDAD
RET = EKI_GetReal("CoordinatesMovement","Controller/Write/Vel",GOAL_VEL)
ENDIF
STANDBY = FALSE ;BOOLEANO A PC PARA DESHABILITAR ENVIO DE NUEVOS DATOS
RET = EKI_SetBool("CoordinatesMovement","Robot/Read/Standby",STANDBY) ;DESHABILITO RECEPCION DE DATOS
RET = EKI_Send("CoordinatesMovement","Robot")
;-----------------------------MOVIMIENTO-------------------------------
IF $FLAG[15] AND $FLAG[16] THEN
GOAL.X = GOAL_POS_X
GOAL.Y = GOAL_POS_Y
GOAL.Z = GOAL_POS_Z
GOAL.A = GOAL_ANG_A
GOAL.B = GOAL_ANG_B
GOAL.C = GOAL_ANG_C
GOAL.S = GOAL_STAT
GOAL.T = GOAL_TURN
ELSE
GOAL.X = GOAL_POS_X
GOAL.Y = GOAL_POS_Y
GOAL.Z = GOAL_POS_Z
GOAL.A = GOAL_ANG_A
GOAL.B = GOAL_ANG_B
GOAL.C = GOAL_ANG_C
ENDIF
IF $FLAG[18]==TRUE THEN
$TOOL = USER_TCP
ENDIF
IF $FLAG[19]==TRUE THEN
$BASE = USER_BASE
ENDIF
IF LINEAR==TRUE THEN
LIN GOAL
ELSE
PTP GOAL
ENDIF
;--------------------------ENVIO DE POSICION---------------------------
ACTUAL.X = $POS_ACT.X
ACTUAL.Y = $POS_ACT.Y
ACTUAL.Z = $POS_ACT.Z
ACTUAL.A = $POS_ACT.A
ACTUAL.B = $POS_ACT.B
ACTUAL.C = $POS_ACT.C
;RET = EKI_SetFrame("CoordinatesMovement","Robot/Read/Pos",ACTUAL)
RET = EKI_SetInt("CoordinatesMovement","Robot/Read/Status",$POS_ACT.S)
RET = EKI_SetInt("CoordinatesMovement","Robot/Read/Turn",$POS_ACT.T)
RET = EKI_Send("CoordinatesMovement","Robot")
;---------------------------CIERRE DE LOOP-----------------------------
ENA = FALSE
$FLAG[15] = FALSE ;STATUS
$FLAG[16] = FALSE ;TURN
$FLAG[17] = FALSE ;ENABLE
$FLAG[18] = FALSE ;TCP
$FLAG[19] = FALSE ;BASE
$FLAG[20] = FALSE ;ACCEL
$FLAG[21] = FALSE ;VEL
ENDLOOP
RET = EKI_Close("CoordinatesMovement") ;CIERRA COMUNICACION
RET = EKI_Clear("CoordinatesMovement")
PTP INICIAL ;MOVIMIENTO A POS INICIAL
END
Display More
DAT:
&ACCESS RVP
&REL 1
&COMMENT Programa de movimiento a coordenadas por EKI
DEFDAT DynamicProg PUBLIC
;FOLD EXTERNAL DECLARATIONS;%{PE}%MKUKATPBASIS,%CEXT,%VCOMMON,%P
;FOLD BASISTECH EXT;%{PE}%MKUKATPBASIS,%CEXT,%VEXT,%P
EXT BAS (BAS_COMMAND :IN,REAL :IN )
DECL INT SUCCESS
;ENDFOLD (BASISTECH EXT)
;FOLD USER EXT;%{E}%MKUKATPUSER,%CEXT,%VEXT,%P
;Make here your modifications
;ENDFOLD (USER EXT)
;ENDFOLD (EXTERNAL DECLERATIONS)
DECL EKI_STATUS RET
DECL AXIS INICIAL={A1 0.0, A2 -47.0, A3 110.0, A4 0.0, A5 -60.0, A6 0.0} ;POSICION INICIAL
DECL AXIS TOOL_CHANGE={A1 48.0, A2 -13.4, A3 74.5, A4 0.0, A5 -60.0, A6 0.0} ;POSICION PARA CAMBIO DE HERRAMIENTA
DECL POS GOAL ;ESTRUCTURAS DE POSICIONES OBJETIVO, ACTUAL Y PREVIA
DECL REAL GOAL_POS_X, GOAL_POS_Y, GOAL_POS_Z, GOAL_ANG_A, GOAL_ANG_B, GOAL_ANG_C ;VARIABLES REALES DE POSICIONES Y ANGULOS
DECL INT GOAL_STAT, GOAL_TURN ;VARIABLES ENTERAS DE STATUS Y TURN
DECL BOOL ENA, LINEAR, STANDBY ;VARIABLES BOOLEANAS DE CONTROL DE MOVIMIENTO
DECL FRAME USER_TCP, USER_BASE, ACTUAL ;VARIABLES FRAME DE TCP Y BASE DEFINIDAS POR EL USUARIO
DECL REAL GOAL_ACCEL, GOAL_VEL ;VARIABLES REALES DE ACELERACION Y VELOCIDAD DEL MOVIMIENTO
ENDDAT
Display More
Communication confguration XML:
<ETHERNETKRL>
<CONFIGURATION>
<EXTERNAL>
<IP>172.31.1.2</IP>
<PORT>59152</PORT>
</EXTERNAL>
</CONFIGURATION>
<RECEIVE>
<XML>
<ELEMENT Tag="Controller/Write/PosX" Type="REAL"/>
<ELEMENT Tag="Controller/Write/PosY" Type="REAL"/>
<ELEMENT Tag="Controller/Write/PosZ" Type="REAL"/>
<ELEMENT Tag="Controller/Write/AngA" Type="REAL"/>
<ELEMENT Tag="Controller/Write/AngB" Type="REAL"/>
<ELEMENT Tag="Controller/Write/AngC" Type="REAL"/>
<ELEMENT Tag="Controller/Write/Status" Type="INT" Set_Flag="15"/>
<ELEMENT Tag="Controller/Write/Turn" Type="INT" Set_Flag="16"/>
<ELEMENT Tag="Controller/Write/Enable" Type="BOOL" Set_Flag="17"/>
<ELEMENT Tag="Controller/Write/Linear" Type="BOOL"/>
<ELEMENT Tag="Controller/Write/TCP" Type="FRAME" Set_Flag="18"/>
<ELEMENT Tag="Controller/Write/Base" Type="FRAME" Set_Flag="19"/>
<ELEMENT Tag="Controller/Write/Accel" Type="REAL" Set_Flag="20"/>
<ELEMENT Tag="Controller/Write/Vel" Type="REAL" Set_Flag="21"/>
</XML>
</RECEIVE>
<SEND>
<XML>
<ELEMENT Tag="Robot/Read/Pos" Type="FRAME"/>
<ELEMENT Tag="Robot/Read/Status" Type="INT"/>
<ELEMENT Tag="Robot/Read/Turn" Type="INT"/>
<ELEMENT Tag="Robot/Read/AxisA1" Type="REAL"/>
<ELEMENT Tag="Robot/Read/AxisA2" Type="REAL"/>
<ELEMENT Tag="Robot/Read/AxisA3" Type="REAL"/>
<ELEMENT Tag="Robot/Read/AxisA4" Type="REAL"/>
<ELEMENT Tag="Robot/Read/AxisA5" Type="REAL"/>
<ELEMENT Tag="Robot/Read/AxisA6" Type="REAL"/>
<ELEMENT Tag="Robot/Read/Standby" Type="BOOL"/>
</XML>
</SEND>
</ETHERNETKRL>
Display More
I am using a KR3 R540 robot with the KRC4 compact controller running KSS V8.3.37
Sorry for the long post and thank you!!