Interrupt vs. Vorlaufstopp

  • Ein KR6 (KR C2 V5.2.15) holt Bauteile von einem Stapel. Er fährt von oben langsam heran und wenn der Sensor das Teil erkennt (Interrupt), wird angehalten (BRAKE), angesaugt und (RESUME) wieder nach oben gefahren. Funktioniert wunderbar, denkt der Roboterprogrammierer und klopft sich auf die Schulter. Der Kunde fragt den Roboterprogrammierer, warum der Roboter "ständig" anhält und ihm dadurch kostbare Millisekunden flöten gehen. Der Roboterprogrammierer erklärt ihm: Das Anhalten kommt vom fehlenden Überschleifen in das Folgeprogramm. Der Kunde verdreht die Augen und fragt wieder: Warum hält der Roboter an? Der Roboterprogrammierer befragt das Roboterforum, ob da noch was geht.



    Konkret geht es um den Vorlaufstopp am Ende des Programms holen_B1S1(). Laut Experten-Dokumentation erfolgt am END ein Vorlaufstopp, wenn im Programm ein Interrupt deklariert wurde:



    Das Stichwort "non-global" könnte dazu verleiten, ein GLOBAL davor zu setzen, aber dann habe ich ja den Vorlaufstopp in der Deklarationszeile ("has already been declared"). (Richtig?)
    CONTINUE vor dem END sieht schon ziemlich verzweifelt aus und hilft hier anscheinend nicht (siehe Code). (Sollte das funktionieren?)

    Da ich keinen Vorlaufstopp möchte, müsste ich den Interrupt also weiter oben in der Programmstruktur deklarieren, also ungefähr da wo der Loop (holen-ablegen) ist. Dann funktioniert aber das RESUME so nicht mehr, denn "RESUME bricht alle laufenden Interrupt-Programme und alle laufenden Unterprogramme ab bis zu der Ebene, in der der aktuelle Interrupt deklariert wurde." Und das hätte zur Folge, dass ich dann dort die Fortsetzbewegung (vom Stapel nach oben fahren) planen müsste.


    Habe ich also nur die Wahl zwischen Pest (Vorlaufstopp am Ende vom Holen-Programm) oder Cholera (Fortsetzen der Bewegung nach dem Saugen im übergeordneten Programm)? Oder fällt euch noch was ein?

    Wenn ich irgendwo oben falsche Annahmen getroffen habe, korrigiert mich gerne!


    Gruß,

    M.

  • Schritt für Schritt zum Roboterprofi!
  • Wäre eine Idee. :supi:

    Dann müsste ich nur den Punkt P1 (über dem Stapel) wieder finden, zum rausfahren. Aber den kann ich in einem globalen Punkt zwischenspeichern. Ich hab nämlich vier Stapel (entsprechend viermal "P1"), aber es gibt ein übergeordnetes Programm, wo das gut reinpassen könnte.

    Danke.

  • Also das Continue vor dem END ist schon richtig, bei lokalen Interrupts. Hatte mal dasselbe Problem.
    Wo springt der Roboter denn nach dem holen_B1S1() Programm rein? Hast du ein Auszug?

    Bist du dir sicher, dass es in dem Holen Programm zum Vorlaufstopp kommt?

  • Sicher bin ich mir nie...

    Hier noch der Loop und die Holen-Funktion.

    Ich habe alles was irgendwie nach I/O aussieht mit CONTINUE versehen. Auch die Ablegen()-Funktion sollte sauber sein, die wird auch in der Holen_B1S1() gerufen und läuft ohne Stopp durch.

  • :wallbash:

    Ach wie herrlich ist doch so ein Perspektivwechsel... wenn man mal den Code kopiert und in einer anderen Darstellung sieht, fällt gleich was auf. Ich habe hier schön die Kommentarzeilen mit CONTINUE versehen...

    Code
    CONTINUE
    ;Bereich 1 frei

    Hier wird zwar nicht auf Ein-/Ausgänge geschaut, aber wer weiß...

    Code
    DEFFCT REAL Min(Z1:IN, Z2:IN)
    REAL Z1, Z2
    IF Z1<Z2 THEN
    RETURN Z1
    ENDIF
    RETURN Z2
    ENDFCT
  • Wie sieht denn das Ablegeprogramm aus? Fährst du da am Anfang des Programms auf Home?

    Weil der letzte Punkt beim Holen Home ist, Kuka kann 2 Punkte nacheinander mit der selben Punktkoordinate nicht sauber "verarbeiten" und dadurch entsteht ein Vorlaufstop


    CONTINUE

    ;Bereich 1 frei

    IF MIN(Stapelhoehe[1,1],Stapelhoehe[1,3])>MIN(Stapelhoehe[1,2],Stapelhoehe[1,4]) THEN

    Holen_B1S1()

    ELSE

    Holen_B1S2()

    ENDIF


    Hier sind die Continues falsch gesetzt

  • :wallbash:

    Ach wie herrlich ist doch so ein Perspektivwechsel... wenn man mal den Code kopiert und in einer anderen Darstellung sieht, fällt gleich was auf. Ich habe hier schön die Kommentarzeilen mit CONTINUE versehen...

    Code
    CONTINUE
    ;Bereich 1 frei

    Hier wird zwar nicht auf Ein-/Ausgänge geschaut, aber wer weiß...

    Code
    DEFFCT REAL Min(Z1:IN, Z2:IN)
    REAL Z1, Z2
    IF Z1<Z2 THEN
    RETURN Z1
    ENDIF
    RETURN Z2
    ENDFCT

    ah mist, da war ich etwas zu spät dran :D hatte es grad geschrieben

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden