Hallo
Ich bin neu mit KRL und KUKA.
Ich habe ein KRL-Programm geschrieben, in dem der Roboter Koordinaten vom Computer erhält und dann in diese Richtung fährt, und es gibt auch einen Interrupt, der das Timing steuert, und wenn der Roboter Daten erhält, stoppt er die Bewegungsfunktion und nimmt einen neuen Wert an, deshalb ich brauchte einen RESUME .
Ich habe bereits $advance = 0 und habe versucht, den Interrupt auf OFF zu setzen, wenn er steuert, aber nix funktioniert. Können Sie mir bitte helfen ?
Danke
Code
&ACCESS RVP
&REL 1
DEF com()
; Declarations
decl FRAME PE
decl int elements_read
decl bool startedd
startedd = FALSE
bas(#initmov, 0)
eki_hw_iface_init()
; Setup interrupts
interrupt decl 16 when $timer_flag[1]==true do eki_hw_iface_send()
interrupt off 16
wait sec 0.012
PE = {x 0,y 0,z 0,a 0,b 0,c 0}
$BWDSTART=FALSE
$BASE = $NULLFRAME
$TOOL = $NULLFRAME
PDAT_ACT=PDEFAULT
FDAT_ACT=FHOME
BAS(#PTP_PARAMS,60)
$H_POS=XHOME
ptp XHOME
$IPO_MODE = #BASE
; Loop forever
$advance = 5
loop
if startedd == False then
starttimer()
startedd = True
endif
eki_hw_iface_move()
endloop
end
def eki_hw_iface_init()
decl eki_status eki_ret
eki_ret = eki_init("XML_Client")
eki_ret = eki_open("XML_Client")
end
def starttimer()
$timer[1] = -200 ; Time in [ms] before first interrupt call
$timer_stop[1] = false ; Start timer 1
interrupt on 16
end
def eki_hw_iface_send()
decl eki_status eki_ret
decl real vel_percent
if $flag[1] then
$BASE = $NULLFRAME
eki_ret = eki_setreal("XML_Client", "Robot/Data/ActPos/X", $POS_ACT.X)
eki_ret = eki_setreal("XML_Client", "Robot/Data/ActPos/Y", $POS_ACT.Y)
eki_ret = eki_setreal("XML_Client", "Robot/Data/ActPos/Z", $POS_ACT.Z)
eki_ret = eki_setreal("XML_Client", "Robot/Data/ActPos/A", $POS_ACT.A)
eki_ret = eki_setreal("XML_Client", "Robot/Data/ActPos/B", $POS_ACT.B)
eki_ret = eki_setreal("XML_Client", "Robot/Data/ActPos/C", $POS_ACT.C)
eki_ret = eki_setreal("XML_Client", "Robot/Data/ActPos/G", $VEL_MA.CP)
; interface state
eki_ret = eki_checkbuffer("XML_Client", "Robot/Data/X")
; Send xml structure
if $flag[1] then ; Make sure connection hasn't died while updating xml structure
eki_ret = eki_send("XML_Client", "Robot")
endif
endif
; Set timer for next interrupt [ms]
$timer[1] = -10 ; ~10 ms for above send + 10 ms interrupt timer -> ~50 Hz state transmission
if $flag[1] then ; If connection alive
resume
endif
end
deffct int eki_hw_iface_get(PE :out)
decl eki_status eki_ret
decl FRAME PE
PE = {x 0,y 0,z 0,a 0,b 0,c 0}
if not $flag[1] then
return 0
endif
eki_ret = eki_checkbuffer("XML_Client", "Robot/Data/X")
if eki_ret.buff <= 0 then
return 0
endif
eki_ret = eki_getreal("XML_Client", "Robot/Data/X", PE.x)
eki_ret = eki_getreal("XML_Client", "Robot/Data/Y", PE.y)
eki_ret = eki_getreal("XML_Client", "Robot/Data/Z", PE.z)
eki_ret = eki_getreal("XML_Client", "Robot/Data/A", PE.a)
eki_ret = eki_getreal("XML_Client", "Robot/Data/B", PE.b)
eki_ret = eki_getreal("XML_Client", "Robot/Data/C", PE.c)
return 1
endfct
def eki_hw_iface_move()
decl FRAME PE , PO
decl int elements_read
interrupt off 16
$advance = 0
$BASE = $NULLFRAME
PO.X = $POS_ACT.X
PO.Y = $POS_ACT.Y
PO.Z = $POS_ACT.Z
PO.A = $POS_ACT.A
PO.B = $POS_ACT.B
PO.C = $POS_ACT.C
$BASE = PO
elements_read = eki_hw_iface_get(PE) ; Get new command from buffer if present
interrupt on 16
LIN PE
$BASE = $NULLFRAME
END
Alles anzeigen