Ich hab hier einen KR16 stehen, mit einer alten KRC2 Steuerung. Auf der Steuerung ist KUKA.Ethernet KRL XML Version 1.2 installiert.
Ich steuere den Roboter mit Hilfe von ROS über ein, für KRC2 angepasstes, EKI Interface.
Hier ist das angepasste KRL Programm, mit dem ich einige Probleme habe:
def kuka_eki_hw_interface()
decl axis joint_pos_tgt
decl int elements_read
bas(#initmov, 0)
id_count = 0
eki_hw_iface_init()
joint_pos_tgt = $axis_act
ptp joint_pos_tgt
$advance = 5
$APO.CPTP = 5.0
LOOP
elements_read = eki_hw_iface_get(joint_pos_tgt)
ptp joint_pos_tgt c_ptp
ENDLOOP
end
def eki_hw_iface_init()
decl int ekx_ret
id_count = 0
global interrupt decl 15 when $flag[1]==false do eki_hw_iface_reset()
interrupt on 15
global interrupt decl 16 when $timer_flag[1]==true do eki_hw_iface_send()
interrupt on 16
wait sec 0.012
$timer[1] = -200
$timer_stop[1] = false
ekx_ret = EKX_Open("EkiHwInterface")
EKX_HandleError(ekx_ret)
$flag[1] = true
end
def eki_hw_iface_send()
decl int ekx_ret
decl real vel_percent
if $flag[1] then
ekx_ret = EKX_WriteReal("EkiHwInterface.RobotState.Pos.A1", $axis_act.a1)
EKX_HandleError(ekx_ret)
ekx_ret = EKX_WriteReal("EkiHwInterface.RobotState.Pos.A2", $axis_act.a2)
EKX_HandleError(ekx_ret)
ekx_ret = EKX_WriteReal("EkiHwInterface.RobotState.Pos.A3", $axis_act.a3)
EKX_HandleError(ekx_ret)
ekx_ret = EKX_WriteReal("EkiHwInterface.RobotState.Pos.A4", $axis_act.a4)
EKX_HandleError(ekx_ret)
ekx_ret = EKX_WriteReal("EkiHwInterface.RobotState.Pos.A5", $axis_act.a5)
EKX_HandleError(ekx_ret)
ekx_ret = EKX_WriteReal("EkiHwInterface.RobotState.Pos.A6", $axis_act.a6)
EKX_HandleError(ekx_ret)
ekx_ret = EKX_WriteInteger("EkiHwInterface.RobotState.RobotCommand.ID", id_count)
EKX_HandleError(ekx_ret)
ekx_ret = EKX_Send("EkiHwInterface.RobotState")
EKX_HandleError(ekx_ret)
endif
$timer[1] = -10
end
deffct int eki_hw_iface_get(joint_pos_cmd :out)
decl bool ekx_ret
decl axis joint_pos_cmd
decl bool is_new
decl int rec_id
;decl int new_advance
ekx_ret = EKX_WaitForSensorData(1, "EkiHwInterface.RobotCommand.ID", 10000)
ekx_ret = EKX_GetIntegerElement(1, "EkiHwInterface.RobotCommand.ID", rec_id, is_new)
;ekx_ret = EKX_GetIntegerElement(1, "EkiHwInterface.RobotCommand.Advance", new_advance, is_new)
ekx_ret = EKX_GetRealElement(1, "EkiHwInterface.RobotCommand.Pos.A1", joint_pos_cmd.a1, is_new)
ekx_ret = EKX_GetRealElement(1, "EkiHwInterface.RobotCommand.Pos.A2", joint_pos_cmd.a2, is_new)
ekx_ret = EKX_GetRealElement(1, "EkiHwInterface.RobotCommand.Pos.A3", joint_pos_cmd.a3, is_new)
ekx_ret = EKX_GetRealElement(1, "EkiHwInterface.RobotCommand.Pos.A4", joint_pos_cmd.a4, is_new)
ekx_ret = EKX_GetRealElement(1, "EkiHwInterface.RobotCommand.Pos.A5", joint_pos_cmd.a5, is_new)
ekx_ret = EKX_GetRealElement(1, "EkiHwInterface.RobotCommand.Pos.A6", joint_pos_cmd.a6, is_new)
id_count = rec_id
;if not (new_advance == $advance) then
; $advance = new_advance
;endif
return 1
endfct
def eki_hw_iface_reset()
decl int ekx_ret_int
decl bool ekx_ret_bool
ekx_ret_bool = EKX_Close("EkiHwInterface")
ekx_ret_int = EKX_Open("EkiHwInterface")
EKX_HandleError(ekx_ret_int)
$flag[1] = true
end
Alles anzeigen
Das erste Problem, welches mir aufgefallen ist:
Generell alle EKX_Get Funktionen haben einen Flag, der das Ausleseverhalten des Buffers festlegt. In der Dokumentation steht folgendes:
Zitat
INTEGER
Determines whether the next value or the current is to be read from the buffer
INT=0: the next value is read (First In First Out)
INT=1: the current value is read (Last In First Out)
Das entspricht nicht der Realität. Flag=0 resultiert in LIFO und Flag=1 in FIFO obwohl es in der Dokumentation genau andersrum steht. Entweder ist die Dokumentation falsch oder ich habe eine fehlerhafte EthernetKrl Version oder ich habe etwas falsch verstanden. Mit Flag=1 ist das Problem jetzt soweit aber behoben.
Jetzt das eigentliche Hauptproblem: Überschleifen mit C_PTP funktioniert nicht.
Ich verschicke immer maximal 5 neue Wegpunkte an die Robotersteuerung (das überprüfe ich mit Hilfe der id_count Variable). Der Roboter bleibt jedoch bei jedem einzelnen Punkt stehen, bevor er zum nächsten weiterfährt.
Ich bin kein Kuka-Programmierer und weiß ab hier einfach nicht mehr weiter. Kann sich jemand bitte das KRL-Programm anschauen und mir sagen, wieso das Überschleifen ignoriert bzw. abgebrochen wird?