Странная ошибка оператора WAIT FOR в языке роботов KUKA (KRL)
Когда программа достигает «ПОДОЖДИТЕ» (server.src, строка 11), робот останавливается. И для продолжения работы необходимо нажать кнопку «СТАРТ». Что мне нужно сделать, чтобы робот не остановился, когда программа дойдет до «ПОДОЖДИТЕ»? И я использую пакет 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, а затем робот возвращает данные компьютеру. Если кто может мне помочь, буду очень признателен.
1 ответ
Я считаю, что эта проблема связана с требованием «В пути» для режима запуска.
Чтобы робот действительно перешел в автоматический режим, он должен находиться «на пути». Возможно, вы уже видели это раньше, когда запускали программу, когда в баннере сообщения всплывает уведомление с упоминанием «В пути». «На пути» означает, что робот находится на запрограммированном пути, а не «плавает в космосе». Например, программа может быть запущена, когда робот находится в произвольной позе бега трусцой, и программа робота хочет, чтобы робот переместился в запрограммированную позу, прежде чем позволить автоматическому режиму вступить во владение.
Я бы порекомендовал вам первым делом переместить робота домой. Если вы не хотите, чтобы робот переместился в определенную позицию в начале программы, вы можете обмануть систему с помощью следующего кода:
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, он буквально приказывает роботу переместиться туда, где он уже находится, тем самым переводя робота на путь. Как только он запустит эту строку, вы еще раз нажмете «Go», тогда он должен быть полностью автоматическим и больше не останавливаться.
Я бы попробовал это и посмотрел, работает ли это.