22. Juli 2019, 20:22:26
Roboterforum.de - Die Industrieroboter- Anwender und Experten Community

[offen] Parameterübergabe an Fehlerroutine


normal_post_locked Autor Thema: [offen] Parameterübergabe an Fehlerroutine  (Gelesen 1107 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

03. April 2018, 15:50:31
Gelesen 1107 mal
Offline

Chris_ROL


Hallo,
ich darf an einer Robotersteuerung die von einer anderen Firma in Betrieb genommen wurde einige Änderungen durchführen.
Nun hat der Roboter währen der Tests eine unerwartete Reaktion gezeigt, zum Glück ohne Crash.
Auf der Suche nach der Ursache bin ich auf eine SearchL ohne entsprechende Fehlerroutine gestoßen, soweit noch klar für mich.
In der entsprechenden Prozedur gibt es eine Fehlerroutine für eine Kollisionserkennung mit einer Parameterübergabe, diese wurde durch den Fehler der SearchL ausgeführt.
        ERROR (err_num_koll_Typ4_oben)
Leider habe ich nirgends Info zu einer Parameterübergabe gefunden, wird dieser Parameter überhaupt ausgewertet?
Ich würde normalerweise per "if" prüfen ob das der Fehler war und entsprechend reagieren und bin im Augenblick etwas verwirrt.

Gruß Christian
  • gefällt mir    Danke

Heute um 20:22:26
Antwort #1

Werbung

Gast

09. April 2018, 13:20:51
Antwort #1
Offline

Micky


Hallo,
eine Fehlerbehandlung wird immer über eine RAISE-Instruktion mit der Übergabe einer Fehlernummer aufgerufen.
In Deinem Fall müsste es einen Aufruf "RAISE err_num_koll_Typ4_oben" irgendwo im Programm geben.

Normalerweise wird ein Fehler immer in der Routine behandelt in der er mit RAISE im normalen Programmablauf ausgelöst wurde. Soll der Fehler in einer der aufrufenden Routine abgearbeitet werden, so muss der Fehler über den expliziten Aufruf von RAISE in der Fehlerbehandlung solange weitergeleitet werden, bis der Fehler behandelt wird.

Wird ein Fehler in einer Interruptroutine ausgelöst und soll im normalen Programmablauf behandelt werden, so funktioniert dies nicht, da der Programmzeiger nicht weiß wo er hinspringen soll. Um die Fehlerbehandlung trotzdem zu ermöglichen gibt es die "Long-Jump"-Funktionalität. In diesem Fall werden hinter der ERROR-Anweisung alle Fehlernummern durch Kommata getrennt aufgelistet, die in dieser Fehlerbehandlung bearbeitet werden sollen.
Dies funktioniert natürlich nur, wenn der Fehleraufruf in einer Routine erfolgt, die von dieser zuvor aufgerufen wurde.

In Deinem Fall wurde dies durch die folgende Programmzeile gewährleistet:
ERROR (err_num_koll_Typ4_oben)

Der Long-Jump kann auch dazu verwendet werden, um auf das explizite Einfügen der RAISE-Instruktionen zwischen der fehlerauslösenden Routine und der fehlerbehandelten Routine vezichten zu können.

Das bedeutet, beim Auslösen der Fehlerbehandlung springt der Programmzeiger direkt in die Routine mit den Klammern hinter ERROR. Wenn der Fehler auch in einer Routine in der Aufrufreihenfolge zwischendurch behandelt werden soll, muss die Fehlernummer auch hinter die ERROR-Anweisung dieser Routine geschrieben werden da ansonsten dise Fehlerbehandlung nie ausgeführt würde.

Weitere Details zu dem Thema "Long-Jumps" findets Du im Handbuch "RAPID Kernel" Document id: 3HAC050946-001 oder auch hier im Forum.

Gruß
Micky


  • gefällt mir    Danke
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

09. April 2018, 14:47:41
Antwort #2
Offline

Chris_ROL


Hallo Micky,

Danke für deine ausführliche Antwort.
In meinem Fall, ist es so, das in dieser Routine der Kollisionseingang im Ablauf unterschiedliche Interruptroutinen auslöst.
Zum besseren nachvollziehen etwas Code:

    PROC Typ_4_Greifen_oben()
        BookErrNo err_num_koll_B4X_oben;
        IDelete intnum_greifer;
        CONNECT intnum_greifer WITH GIBO_Koll_Typ4_oben;
        ISignalDI\Single, GR01_AF1_di_06, 0, intnum_greifer;
        MoveJ Offs(p_Typ4_greifen_ob,0,0,750), v_schnell, z100, t_Greifer\WObj:=wobj_Box_oben;
        MoveL Offs(p_Typ4_greifen_ob,0,0,210), v_GIBO, z1, t_Greifer\WObj:=wobj_Box_oben;
        IDelete intnum_greifer;
        CONNECT intnum_greifer WITH Kollision;
        ISignalDI\Single, GR01_AF1_di_06, 0, intnum_greifer;
        MoveL Offs(p_Typ4_greifen_ob,0,0,60), v_langsam, z10, t_Greifer\WObj:=wobj_Box_oben;
        SearchL\Stop, GR01_AF1_di_04, suchpunkt, p_Typ4_greifen_ob, v_suchen, t_greifer\WObj:=wobj_Box_oben;
...
       ERROR (err_num_koll_Typ4_oben)

Im Modul für die Interrupt gibt es ein
"TRAP Kollision" darin wird der Roboter solange gestoppt bis der Kollisionseingang 0 ist und ein Fehler ausgegeben.
und ein

     TRAP GIBO_Koll_Typ4_oben
     RAISE err_num_koll_Typ4_oben;
     ERROR
     RAISE;
     ENDTRAP    

Funktioniert auch alles und dank deiner Erklärung weiß ich jetzt auch wieso es funktioniert ;-)
Kommt nun aber ein Fehler vom SearchL wird auch die Fehlerroutine für "err_num_koll_Typ4_oben" ausgeführt welche aber nicht passt, wie löst man sowas üblicherweise?
Gruß Christian
  • gefällt mir    Danke

09. April 2018, 17:24:32
Antwort #3
Offline

Micky


Hallo Chris,

wenn beim SearchL ein Fehler auftritt werden die Fehlernummern "ERR_WHLSEARCH" bzw. "ERR_SIGSUPSEARCH" ausgelöst.

Der Programmzeiger springt dann in die Fehlerbehandlung und dort müssten dann dann alle Fehler behandelt werden.


Das müsste im Programm in etwa so aussehen:

PROC Typ_4_Greifen_oben()
...

ERROR (err_num_koll_Typ4_oben)

IF ERRNO = err_num_koll_Typ4_oben THEN
    !Fehlerbehandlung für Trap routinen

ELSEIF ERRNO = ERR_WHLSEARCH THEN
   !Es wurde nichts gefunden

ELSEIF ERRNO = ERR_SIGSUPSEARCH THEN
   !Suchsignal war beim start der Suche schon auf high
ENDIF

RAISE;
ENDPROC


Ich bin mir nicht sicher, was Du mit "Fehlerroutine für "err_num_koll_Typ4_oben"" meinst, aber es gibt in einer Routine nur einen einzigen Fehlerbehandlungsblock in dem alle möglichen Fehler behandelt werden, egal woher sie kommen.

Evtl. postest Du nochmal die komplette Fehlerbehandlung der Routine "Typ_4_Greifen_oben()"

Gruß
Micky
  • gefällt mir    Danke
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

13. April 2018, 08:40:20
Antwort #4
Offline

Chris_ROL


Hallo Micky,

ich denke, ich hab es jetzt verstanden ;-)
Die "IF" Abfragen für die unterschiedlichen Fehler sind klar und haben im ERROR-Block gefehlt.
Weshalb im Fehlerfall von SearchL auch falsch reagiert wurde.

Und die Angabe von "err_num_koll_Typ4_oben" hinter ERROR ist notwendig um den richtigen ERROR-Block auszuführen.

Danke für die Hilfe
Gruß Christian
  • gefällt mir    Danke

Heute um 20:22:26
Antwort #5

Werbung

Gast


Teile per facebook Teile per linkedin Teile per pinterest Teile per reddit Teile per twitter
 

über das Roboterforum

Nutzungsbedingungen Impressum Datenschutzerklärung

Sponsoren des Roboterforums

ROBTEC GmbH