1. Dashboard
    1. Dashboard
    2. Suche
  2. Forum
    1. Unresolved Threads
  3. Members
    1. Recent Activities
    2. Users Online
    3. Team
    4. Search Members
  4. Jobs
  5. Articles
  6. Calendar
    1. Upcoming Events
    2. Map
  7. Shop
    1. Orders
    2. Shipping Costs
  • Login or register
  • Search
Roboterprogrammierer finden
This Thread
  • Everywhere
  • This Thread
  • This Forum
  • Articles
  • Pages
  • Forum
  • Blog Articles
  • Events
  • Files
  • Products
  • More Options
  1. Roboterforum.de - die Industrieroboter und Cobot Community
  2. Forum
  3. Industrieroboter Support
  4. KUKA Roboter
Your browser does not support videos autonome mobile Roboter von KUKA
besuche unseren Hauptsponsor
Roboterprogrammierer
Online Roboterschulung
Werbung schalten Roboter
Advertise in Robotics
Der Roboterkanal
Deutscher Robotikverband
Werben in Robotik
Werben für Robotik

KRC2 - Ethernet KRL Interface - C_PTP Überschleifen funktioniert nicht

  • Pavel V
  • December 2, 2021 at 12:32 PM
  • Thread is Resolved
  • Pavel V
    Points
    20
    Posts
    3
    • December 2, 2021 at 12:32 PM
    • #1

    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:

    Code
    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
    Display More

    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:

    Quote

    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?

  • Schritt für Schritt zum Roboterprofi!
  • fubini
    Reactions Received
    72
    Points
    5,147
    Trophies
    2
    Posts
    920
    Location
    München
    • December 2, 2021 at 3:19 PM
    • #2
    Quote from Pavel V

    LOOP

    elements_read = eki_hw_iface_get(joint_pos_tgt)

    ptp joint_pos_tgt c_ptp

    ENDLOOP

    Ich kenn jetzt wiederum ethernet KRL nicht gut. Hast du mal versucht 5 Positionen vor der Loop einzulesen und dann in der Loop die 5 Positionen am Stück auszüfhren. Also ohne eki_hw_iface_get() dazwischen.

    Wenn es dann geht würde ich vermuten das Problem liegt an einem Vorlaufstop den diese Funktion produziert. Ob und welche aufrufe von Etherner KRL Vorlaufstopp triggern sollte aber auch in der Doku stehen.

    Außerdem würde ich prüfen ob du wirklich jedesmal von eki_hw_iface_get() eine geänderte Position bekommst. Eventuell schickst du ja x mal die gleiche und erst x+1 ist anders.

    Fubini

    Edited once, last by fubini (December 2, 2021 at 3:25 PM).

  • Pavel V
    Points
    20
    Posts
    3
    • December 2, 2021 at 4:18 PM
    • #3

    Ich hab gerade einige Sachen ausprobiert und es scheint, dass das eigentliche Problem nicht am Überschleifen liegt, sondern an dem FIFO/LIFO Flag.

    Wenn das Auslesen auf FIFO steht (laut Doku INT=0) und ich immer nur die selbe Position (0, -90, 90, 0, 0, 0) verschicke, dann oszilliert der Roboter zwischen meiner Position und der Null Position (0, 0, 0, 0, 0, 0). Dabei funktioniert das Überschleifen!

    Leider verstehe ich nicht, wieso der Roboter die Null Position überhaupt anfährt.

  • Pavel V
    Points
    20
    Posts
    3
    • December 2, 2021 at 4:33 PM
    • #4

    Ergänzung:

    Ich hab gewartet bis der Roboter mit der Oszillation fertig war und an seiner eigentlichen Zielposition angekommen ist. Das ist erst nach ca. 10-15 "Oszillationen" passiert.

    Dann habe ich dem Roboter drei Wegpunkte einer Trajektorie geschickt(Startpunkt, Mittelpunkt, Endpunkt). Der Roboter ist direkt zum Endpunkt gefahren, ist dort aber nicht angekommen, weil er den Mittelpunkt überschliffen hat und direkt zum Startpunkt zurückgekommen ist. Dieser Prozess wurde mit dem (angeblichen) FIFO Flag durchgeführt (INT=0). Das sieht aber nicht nach einem FIFO sondern eindeutig nach einem LIFO Verhalten aus.

    Ich verstehe nicht was ich hier falsch mache, das ist alles sehr verwirrend.

Tags

  • 1
  • 33
  • 2
  • ABB
  • ABB Roboter
  • ABS
  • base
  • constant
  • CP_PARAMS
  • Dialog
  • EX
  • EXT
  • fanuc
  • Fehler
  • FRAMES
  • INIT
  • INITIALIZED
  • INITMOV
  • IRC5
  • joint
  • KRC2
  • KRC4
  • kuka
  • new
  • NONE
  • notify
  • PATH
  • PGNO_GET
  • profinet
  • PTP_DAT
  • PTP_PARAMS
  • P_ACTIVE
  • P_FREE
  • P_RESET
  • P_STOP
  • Quit
  • Roboter
  • RobotStudio
  • Schweißen
  • Sps
  • Sync
  • T1
  • t2
  • tcp
  • Tool
  • VALUE
  • VAR
  • vel_cp
  • vel_ptp
  • Yaskawa
AD
Your browser does not support videos Automatisierung im Handwerk - ich schaffs mit KUKA
Einloggen für weniger Werbung

gesponserte Artikel

  • Gebrauchtroboter kaufen - Was ist zu beachten. Die Checkliste zum kauf von gebrauchten Robotern

    August 11, 2019 at 7:02 PM
  • Was macht ein Roboterprogrammierer genau und was verdient er?

    August 21, 2019 at 8:17 AM
  • Vernetzen, referenzieren, kollaborieren: Das B2B Portal für die Produktionsautomatisierung

    June 2, 2021 at 11:29 AM

Job Offer

  • Sie wollen Ihr Stellenangebot im Roboterforum schalten? Ab 149€

    Werner Hampel June 17, 2021 at 9:52 AM
  • Werde Roboterprogrammierer bei ROBTEC GmbH in Mainburg / Bayern

    Werner Hampel April 5, 2023 at 7:13 PM
Werbung auf Roboterseite
Roboter programmieren lernen
Banner Robotik

Tags

  • Überschleifen
  • kuka
  • KRC2
  • EthernetKRL
  • Ethernet-KRL-XML

Wieviele Mitglieder waren heute eingeloggt?

Logge Dich ein, um hier zu lesen wer in den letzten 24h Online war und um weniger Werbung zu sehen.

  1. Privacy Policy
  2. Legal Notice
Powered by WoltLab Suite™ 6.0.22
Roboterforum.de - die Industrieroboter und Cobot Community in the WSC-Connect App on Google Play
Roboterforum.de - die Industrieroboter und Cobot Community in the WSC-Connect App on the App Store
Download