KUKA Robot Language(KRL)中WAIT FOR语句的奇怪错误
A strange error about the WAIT FOR statement in KUKA Robot Language(KRL)
当程序到达“WAIT FOR”(server.src,第 11 行)时,机器人停止。并且必须按下“开始”按钮才能继续 运行。
当程序到达“WAIT FOR”时,我需要做什么来防止机器人停止?
而我使用的是EthernetKRL包,源文件如下:
connect.xml:
<ETHERNETKRL>
<CONFIGURATION>
<EXTERNAL>
<IP>172.31.55.5</IP>
<PORT>60000</PORT>
<TYPE>Client</TYPE>
</EXTERNAL>
<INTERNAL>
<ENVIRONMENT>Program</ENVIRONMENT>
<BUFFERING Mode="FIFO" Limit="10"/>
<BUFFSIZE Limit="16384"/>
<IP>172.31.55.6</IP>
<PORT>54601</PORT>
<PROTOCOL>TCP</PROTOCOL>
<MESSAGES Logging="error" Display="disabled"/>
</INTERNAL>
</CONFIGURATION>
<RECEIVE>
<XML>
<ELEMENT Tag="Robot/Pos/X" Type="REAL" />
<ELEMENT Tag="Robot/Pos/Y" Type="REAL" />
<ELEMENT Tag="Robot/Pos/Z" Type="REAL" />
<ELEMENT Tag="Robot/Pos/A" Type="REAL" />
<ELEMENT Tag="Robot/Pos/B" Type="REAL" />
<ELEMENT Tag="Robot/Pos/C" Type="REAL" />
<ELEMENT Tag="Robot/ready" Type="BOOL" />
<ELEMENT Tag="Robot/chuck" Type="BOOL" />
<ELEMENT Tag="Robot/readRobotStatus" Type="BOOL" Set_Out="14"/>
<ELEMENT Tag="Robot/onlySetIO" Type="BOOL" Set_Out="15"/>
<ELEMENT Tag="Robot" Set_Flag="14" />
</XML>
</RECEIVE>
<SEND>
<XML>
<ELEMENT Tag="Robot/Pos/X" />
<ELEMENT Tag="Robot/Pos/Y" />
<ELEMENT Tag="Robot/Pos/Z" />
<ELEMENT Tag="Robot/Pos/A" />
<ELEMENT Tag="Robot/Pos/B" />
<ELEMENT Tag="Robot/Pos/C" />
<ELEMENT Tag="Robot/ready" />
<ELEMENT Tag="Robot/chuck" />
<ELEMENT Tag="Robot/readRobotStatus" />
<ELEMENT Tag="Robot/onlySetIO" />
</XML>
</SEND>
</ETHERNETKRL>
server.src:
&ACCESS RVP
&REL 3
&PARAM DISKPATH = KRC:\R1\Program
DEF SERVER()
RET=EKI_Init("CONNECT")
RET=EKI_Open("CONNECT")
LOOP
WAIT FOR $OUT[14]==TRUE
$OUT[14]=FALSE
$TOOL = tool_data[4]
$LOAD = load_data[4]
$BASE = base_data[4]
RET=EKI_GetBool("CONNECT","Robot/readRobotStatus",READROBOTSTATUS)
IF READROBOTSTATUS==TRUE THEN
RET=EKI_SetReal("CONNECT","Robot/Pos/X",$POS_ACT.X)
RET=EKI_SetReal("CONNECT","Robot/Pos/Y",$POS_ACT.Y)
RET=EKI_SetReal("CONNECT","Robot/Pos/Z",$POS_ACT.Z)
RET=EKI_SetReal("CONNECT","Robot/Pos/A",$POS_ACT.A)
RET=EKI_SetReal("CONNECT","Robot/Pos/B",$POS_ACT.B)
RET=EKI_SetReal("CONNECT","Robot/Pos/C",$POS_ACT.C)
RET=EKI_SetBool("CONNECT","Robot/chuck",$OUT[2])
RET=EKI_SetBool("CONNECT","Robot/ready",$OUT[1])
RET=EKI_Send("CONNECT","Robot")
ELSE
RET=EKI_GetBool("CONNECT","Robot/onlySetIO",ONLYSETIO)
IF ONLYSETIO==TRUE THEN
RET=EKI_GetBool("CONNECT","Robot/chuck",$OUT[2])
RET=EKI_Send("CONNECT","Robot")
ELSE
RET=EKI_GetReal("CONNECT","Robot/Pos/X",POS_FR.X)
RET=EKI_GetReal("CONNECT","Robot/Pos/Y",POS_FR.Y)
RET=EKI_GetReal("CONNECT","Robot/Pos/Z",POS_FR.Z)
RET=EKI_GetReal("CONNECT","Robot/Pos/A",POS_FR.A)
RET=EKI_GetReal("CONNECT","Robot/Pos/B",POS_FR.B)
RET=EKI_GetReal("CONNECT","Robot/Pos/C",POS_FR.C)
LIN POS_FR
RET=EKI_Send("CONNECT","Robot")
ENDIF
ENDIF
ENDLOOP
RET=EKI_Close("CONNECT")
RET=EKI_Clear("CONNECT")
END
server.dat:
&ACCESS RVP
&REL 3
&PARAM DISKPATH = KRC:\R1\Program
DEFDAT server PUBLIC
DECL EKI_STATUS RET
DECL BOOL READROBOTSTATUS=TRUE
DECL BOOL ONLYSETIO=FALSE
;DECL REAL POS_X=100
;DECL REAL POS_Y=100
;DECL REAL POS_Z=100
;DECL REAL POS_A=100
;DECL REAL POS_B=100
;DECL REAL POS_C=100
DECL FRAME POS_FR={X 100.000,Y 100.000,Z 50.0000,A 0.0,B 50.0000,C 30.0000}
DECL BASIS_SUGG_T LAST_BASIS={POINT1[] "P0",POINT2[] "P0",CP_PARAMS[] "CPDAT0",PTP_PARAMS[] "PDAT0",CONT[] " ",CP_VEL[] "2.0",PTP_VEL[] " 100",SYNC_PARAMS[] "SYNCDAT",SPL_NAME[] "S0",A_PARAMS[] "ADAT0"}
DECL INT cnt
ENDDAT
我的目的是用电脑做客户端,我要机器人做服务器。当电脑向机器人发送数据时,$OUT[14]=TRUE,然后机器人将return数据发送给电脑。
如果有人能帮助我,我将不胜感激。
我认为这个问题与 运行 模式的 'On Path' 要求有关。
为了让机器人真正进入自动模式,机器人必须 'On Path'。您之前可能已经看到过 运行 程序在消息横幅中弹出一条通知,其中提到 'On Path'。 'On Path' 表示机器人在编程路径上,而不是“漂浮在 space 中”。例如,可以在机器人处于某个随机慢跑姿势时启动程序,并且机器人程序希望机器人在让自动模式接管之前移动到编程姿势。
我建议你的程序做的第一件事就是把机器人搬回家。如果您不希望机器人移动到程序开头的定义位置,您可以使用以下代码欺骗系统:
BAS(#INITMOV, 0) ;Initialize default motion parameters like acceleration and speed.
PTP $AXIS_ACT ;Move the robot to its current position.
$AXIS_ACT
是一个全局 E6AXIS 变量,用于保存机器人的当前位置,因此通过在程序开始时告诉机器人到 PTP 那里,它实际上是命令机器人移动到它已经所在的位置,从而将机器人 'On Path'。一旦它 运行 是那条线,你再按一次 Go,然后它应该是全自动的,不会再停下来。
我会尝试一下,看看是否有效。
当程序到达“WAIT FOR”(server.src,第 11 行)时,机器人停止。并且必须按下“开始”按钮才能继续 运行。 当程序到达“WAIT FOR”时,我需要做什么来防止机器人停止? 而我使用的是EthernetKRL包,源文件如下:
connect.xml:
<ETHERNETKRL>
<CONFIGURATION>
<EXTERNAL>
<IP>172.31.55.5</IP>
<PORT>60000</PORT>
<TYPE>Client</TYPE>
</EXTERNAL>
<INTERNAL>
<ENVIRONMENT>Program</ENVIRONMENT>
<BUFFERING Mode="FIFO" Limit="10"/>
<BUFFSIZE Limit="16384"/>
<IP>172.31.55.6</IP>
<PORT>54601</PORT>
<PROTOCOL>TCP</PROTOCOL>
<MESSAGES Logging="error" Display="disabled"/>
</INTERNAL>
</CONFIGURATION>
<RECEIVE>
<XML>
<ELEMENT Tag="Robot/Pos/X" Type="REAL" />
<ELEMENT Tag="Robot/Pos/Y" Type="REAL" />
<ELEMENT Tag="Robot/Pos/Z" Type="REAL" />
<ELEMENT Tag="Robot/Pos/A" Type="REAL" />
<ELEMENT Tag="Robot/Pos/B" Type="REAL" />
<ELEMENT Tag="Robot/Pos/C" Type="REAL" />
<ELEMENT Tag="Robot/ready" Type="BOOL" />
<ELEMENT Tag="Robot/chuck" Type="BOOL" />
<ELEMENT Tag="Robot/readRobotStatus" Type="BOOL" Set_Out="14"/>
<ELEMENT Tag="Robot/onlySetIO" Type="BOOL" Set_Out="15"/>
<ELEMENT Tag="Robot" Set_Flag="14" />
</XML>
</RECEIVE>
<SEND>
<XML>
<ELEMENT Tag="Robot/Pos/X" />
<ELEMENT Tag="Robot/Pos/Y" />
<ELEMENT Tag="Robot/Pos/Z" />
<ELEMENT Tag="Robot/Pos/A" />
<ELEMENT Tag="Robot/Pos/B" />
<ELEMENT Tag="Robot/Pos/C" />
<ELEMENT Tag="Robot/ready" />
<ELEMENT Tag="Robot/chuck" />
<ELEMENT Tag="Robot/readRobotStatus" />
<ELEMENT Tag="Robot/onlySetIO" />
</XML>
</SEND>
</ETHERNETKRL>
server.src:
&ACCESS RVP
&REL 3
&PARAM DISKPATH = KRC:\R1\Program
DEF SERVER()
RET=EKI_Init("CONNECT")
RET=EKI_Open("CONNECT")
LOOP
WAIT FOR $OUT[14]==TRUE
$OUT[14]=FALSE
$TOOL = tool_data[4]
$LOAD = load_data[4]
$BASE = base_data[4]
RET=EKI_GetBool("CONNECT","Robot/readRobotStatus",READROBOTSTATUS)
IF READROBOTSTATUS==TRUE THEN
RET=EKI_SetReal("CONNECT","Robot/Pos/X",$POS_ACT.X)
RET=EKI_SetReal("CONNECT","Robot/Pos/Y",$POS_ACT.Y)
RET=EKI_SetReal("CONNECT","Robot/Pos/Z",$POS_ACT.Z)
RET=EKI_SetReal("CONNECT","Robot/Pos/A",$POS_ACT.A)
RET=EKI_SetReal("CONNECT","Robot/Pos/B",$POS_ACT.B)
RET=EKI_SetReal("CONNECT","Robot/Pos/C",$POS_ACT.C)
RET=EKI_SetBool("CONNECT","Robot/chuck",$OUT[2])
RET=EKI_SetBool("CONNECT","Robot/ready",$OUT[1])
RET=EKI_Send("CONNECT","Robot")
ELSE
RET=EKI_GetBool("CONNECT","Robot/onlySetIO",ONLYSETIO)
IF ONLYSETIO==TRUE THEN
RET=EKI_GetBool("CONNECT","Robot/chuck",$OUT[2])
RET=EKI_Send("CONNECT","Robot")
ELSE
RET=EKI_GetReal("CONNECT","Robot/Pos/X",POS_FR.X)
RET=EKI_GetReal("CONNECT","Robot/Pos/Y",POS_FR.Y)
RET=EKI_GetReal("CONNECT","Robot/Pos/Z",POS_FR.Z)
RET=EKI_GetReal("CONNECT","Robot/Pos/A",POS_FR.A)
RET=EKI_GetReal("CONNECT","Robot/Pos/B",POS_FR.B)
RET=EKI_GetReal("CONNECT","Robot/Pos/C",POS_FR.C)
LIN POS_FR
RET=EKI_Send("CONNECT","Robot")
ENDIF
ENDIF
ENDLOOP
RET=EKI_Close("CONNECT")
RET=EKI_Clear("CONNECT")
END
server.dat:
&ACCESS RVP
&REL 3
&PARAM DISKPATH = KRC:\R1\Program
DEFDAT server PUBLIC
DECL EKI_STATUS RET
DECL BOOL READROBOTSTATUS=TRUE
DECL BOOL ONLYSETIO=FALSE
;DECL REAL POS_X=100
;DECL REAL POS_Y=100
;DECL REAL POS_Z=100
;DECL REAL POS_A=100
;DECL REAL POS_B=100
;DECL REAL POS_C=100
DECL FRAME POS_FR={X 100.000,Y 100.000,Z 50.0000,A 0.0,B 50.0000,C 30.0000}
DECL BASIS_SUGG_T LAST_BASIS={POINT1[] "P0",POINT2[] "P0",CP_PARAMS[] "CPDAT0",PTP_PARAMS[] "PDAT0",CONT[] " ",CP_VEL[] "2.0",PTP_VEL[] " 100",SYNC_PARAMS[] "SYNCDAT",SPL_NAME[] "S0",A_PARAMS[] "ADAT0"}
DECL INT cnt
ENDDAT
我的目的是用电脑做客户端,我要机器人做服务器。当电脑向机器人发送数据时,$OUT[14]=TRUE,然后机器人将return数据发送给电脑。 如果有人能帮助我,我将不胜感激。
我认为这个问题与 运行 模式的 'On Path' 要求有关。
为了让机器人真正进入自动模式,机器人必须 'On Path'。您之前可能已经看到过 运行 程序在消息横幅中弹出一条通知,其中提到 'On Path'。 'On Path' 表示机器人在编程路径上,而不是“漂浮在 space 中”。例如,可以在机器人处于某个随机慢跑姿势时启动程序,并且机器人程序希望机器人在让自动模式接管之前移动到编程姿势。
我建议你的程序做的第一件事就是把机器人搬回家。如果您不希望机器人移动到程序开头的定义位置,您可以使用以下代码欺骗系统:
BAS(#INITMOV, 0) ;Initialize default motion parameters like acceleration and speed.
PTP $AXIS_ACT ;Move the robot to its current position.
$AXIS_ACT
是一个全局 E6AXIS 变量,用于保存机器人的当前位置,因此通过在程序开始时告诉机器人到 PTP 那里,它实际上是命令机器人移动到它已经所在的位置,从而将机器人 'On Path'。一旦它 运行 是那条线,你再按一次 Go,然后它应该是全自动的,不会再停下来。
我会尝试一下,看看是否有效。