Parameterübergabe an Fehlerroutine

  • 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

  • ANZEIGE
  • 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

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

  • 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

  • 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

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind. (Albert Einstein)

  • 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

Hilfe und Support für ABB Roboter Programmierung, Konfiguration, Inbetriebnahme finden Sie hier im ABB Roboter Forum. ABB Rapid Programmierung ist einfach, die Roboterforum Community hilft sehr gerne.

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