Interne Var´s für Errorhandler

  • Hallo zusammen,


    kann es sein, dass die Variablen bsuchenI.O und bsuchenN.IO systeminterne Features sind, bei Verarbeiten eines ErrorHandlers? wie z.B. errno_signupsearch?
    bei Linearensuchbefehl SearchL....


    PROC GM5


    var=bsuchen
    .
    .
    .
    .
    ERROR
    IF bsuchenniO=true then (do what i want to do)
    else if
    raise;


    die Variable wird am Anfang der Procedure deklariert, aber nirgens einen Wert zugeordnet...nur auf true and false im Errorhandler abgefragt. :nocheck:


    mfg. Noobie *edit: S4c plus*

    Viele Grüße Noobie

    Einmal editiert, zuletzt von Noob ()

  • ANZEIGE
  • Ist ja interessant, ist gibt doch noch welche, die im Variablennamen den Datentyp verstecken,
    bsuchenI.O > b >>bool.
    Zurück zum Thema: zu 90% NEIN, denn dafür gibt es ja die auswertbaren Errornummern.
    Les' mal im Handbuch etwas über die zurückgegeben Fehlernummern des Search-Befehls.
    Meine Vermutung ist, das diese booleans in einem Interrupt geschalten werden.
    Tip: nicht im Backup suchen sondern Programm speichern, dann haste schonmal alle Programm-
    module in einer Datei, und dann einfach im Texteditor die Variablen suchen.
    Sollteste Du sie da nicht finden, können die ja nur noch in den meißt wenigen Systemmodulen sein.
    Kannst mir aber auch ein Backup schicken.


    Gruß
    msc

  • das ist es ja, im Handbuch hab ich nichts darüber gefunden.
    die Variable wurde nachträglich nur in einem Programm.Mod hinzugefügt.
    Wenn ich am Montag wieder auf der Arbeit bin, schick ich Dir das Modul mal zu.

    Viele Grüße Noobie

  • Hallo Noob,


    sorry, aber irgendwie kann ich die Syntax deines Programmausschnittes nicht nachvollziehen: :bawling:

    Zitat

    Variablen bsuchenI.O und bsuchenN.IO ...
    var=bsuchen ...
    IF bsuchenniO=true then ...

    :kopfkratz:


    Zitat

    die Variable wird am Anfang der Procedure deklariert, aber nirgens einen Wert zugeordnet...


    Ein Wert muß auch nicht zwingend zugewiesen werden (Zitat Handbuch):
    "Variables with value types may be initialised (given an initial value). The expression
    used to initialise a program variable must be constant. Note that the value of an
    uninitialized variable may be used, but it is undefined, i.e. set to zero.
    "
    d.h. in deinem Fall ist die Variable (wenn nicht anders initialisiert oder zugewiesen) also FALSE.


    Selbst wenn es eine entsprechende globale Variable mit gleichem Namen geben würde, die intern zur Verarbeitung von SearchL o. dgl. genutzt wird, würde man auf diese Variable in der Procedure nicht zugreifen können sobald eine lokale Variable gleichen namens in der Proc deklariert wird, da diese im lokalen Kontext (Scope) bevorzugt werden würde.


    Zu guter Letzt halte ich es für recht unwahrscheinlich, dass die RAPID-Entwickler (Schweden ?) für eine derartige Variable einen deutschen Namen verwenden würden. (Obwohl... weiß jemand was "Suchen" auf Schwedisch heißt ?)
    BTW: Ich finde die "Main() <-> Haupt()" Benennung ist schon ein ziemlich krampfhaftes Zugeständnis. :wallbash:


    Gruß
    Rainer

  • ok, dann werde ich genauer:


    Es soll etwas gesucht werden, wird duch einen Fehler die Instruktionsabarbeitung fehlerhaft, soll erneut gesucht werden. Das ganze 3x. Wird nach 3x nix gefunden, dann soll eine Meldung ausgebracht werden.
    Was ich nirgends finde ist die Wiederholungschlaufe 3x. hier der Error-Handler:
    Am Anfang wird deklariert:


    VAR robtarget pZaehl;
    VAR num nZaehl;
    VAR bool bSuchenNIO;



    ERROR
    !Suchen wiederholen
    IF ERRNO=ERR_WHLSEARCH AND bSuchenNIO=FALSE THEN
    bSuchenNIO:=TRUE;
    RETRY;
    ELSE
    Message tmGestSuchen;
    ENDIF
    IF ERRNO=erZurHomePos MoveToPos "20VP";
    IF ERRNO=erVakuum THEN
    Incr nVakFehler;
    !Entnahme abbrechen ?
    IF nVakFehler>=nMaxVakFehler THEN
    MoveToPos "20VP";
    Message tmVakuumAbbruch;
    IF OpMode()=OP_MAN_PROG TPReadFK nFKey,"","OK","","","",""\DIBreak:=diIRBzurHome\BreakFlag:=erFehler;
    ELSE
    !Roboter freifahren und Greifen wiederholen
    mv20GP_20FP;
    TRYNEXT;
    ENDIF
    ENDIF
    RAISE;
    ENDPROC


    Wenn es doch 3x versucht werden soll, müßte meiner Meinung nach die Sache so aussehen:
    1. nummerische Var zum Zählen deklarieren und Null-Setzen:


    VAR num nSuchversuch
    clear nSuchversuch


    Dann die Wiederholungschleife im Handler


    ERROR
    !Suchen wiederholen
    IF ERRNO=ERR_WHLSEARCH AND nSuchversuch <=3 THEN
    incr nSuchversuch;
    RETRY;
    ELSE
    Message tmGestSuchen;
    ......

    Viele Grüße Noobie

    Einmal editiert, zuletzt von Noob ()

  • Hallo Noob,
    das ist schön das Du uns nun doch gewillt bist uns genauere Informationen bekannt zu geben. Ich hatte Deinen Beitrag schon recht früh gesehen aber konnte mit den ganzen Wortfetzen leider nichts anfangen.
    Die Schleife ist schon da aber ich kann leider keine 3x erkennen.
    Schau Dir die Befehle RETRY und TRYNEXT an und du wirst fündig. :mrgreen:
    Denn wenn Deine Routine aufgerufen wird werden die Variablen, wie rmac schon sagte, initialisiert. d.h in Deinem Fall auf FALSE gesetzt.
    Nun wird eine Suchfahrt durchgeführt und die führt nicht zu einem Erfolg. Dies war aber die erste Suchfahrt ohne Erfolg und somit ist Deine Variable "bSuchenNIO" =FALSE. Nun wird diese bei der ersten negative Messung auf TRUE gesetzt und durch den Befehl "RETRY" Deine Suche nochmals gestartet wo dieser Fehler aufgetreten ist. Sollte bei dieser Such noch einmal dieser Fehler auftreten wird der Errorhandler weiterabgearbeitet, bzw. eine Meldung ausgegeben.
    Ich denke das sollte Dir weiterhelfen. :blumen:


    Wenn nicht denke daran wenn Du bei uns eine klare schnelle Information haben möchtest die Frage auch demensprechend genau und klar zu stellen mit allen erdenklichen Fakten. :supi:


    @mod-poser: Bei uns sind alle Variablen mit Präfixen versehen um deren erkennung zu vereinfachen. Ist für das Verständnis im Programm viel besser! :supi:


    Hilft im Schluß allen weiter! :mrgreen:

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • Vielen Dank, während Du die Antwort geschrieben hast, habe ich meinen Betrag nochmal editiert, wie ich denke, dass eine 3x Schleife aussehen soll.
    Danke für Eure Bemühungen, bin noch nicht ganz so fit im Rapid...
    :danke:

    Viele Grüße Noobie

  • Hallo Noob,
    so kommen wir der Sache schon viel näher! :grinser043:


    Herzlichen Glückwunsch!! :blumen:


    So wird es doch!! :biggrins:


    robotic74

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • also ist das 3x Suchen so tasächlich machbar?


    Wenn es doch 3x versucht werden soll, müßte meiner Meinung nach die Sache so aussehen:
    1. nummerische Var zum Zählen deklarieren und Null-Setzen:


    VAR num nSuchversuch
    clear nSuchversuch


    Dann die Wiederholungschleife im Handler


    ERROR
    !Suchen wiederholen
    IF ERRNO=ERR_WHLSEARCH AND nSuchversuch <=3 THEN
    incr nSuchversuch;
    RETRY;
    ELSE
    Message tmGestSuchen;



    Nochmals :merci: für Eure Hilfe

    Viele Grüße Noobie

  • Hallo Noob,
    natürlich sollte das so gehen!
    Aber die Frage stellt sich mir warum Du dreimal die gleich Bewegung durchführen möchtest. Aber ist ja auch egal wirst schon Deine Gründe haben.


    Bis denne


    robotic74

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • Damit ich Dir auch helfen kann :zwink:, weil wir Probleme mit dem Suchen haben, durch wechselnde Winkel des zu suchenden Materials (Scheiben) auf dem Gestell.



    Grüße Noobie

    Viele Grüße Noobie

  • Hallo noob,


    hier ein Ausschnitt aus meinem Fundus, vielleicht als Anregung.
    (Habe ich schnell zusammengekürzt, deshalb OHNE GEWÄHR!)


    Gruß
    Rainer

  • Hier drin stecken, die Wiederholungen : "IF nVakFehler>=nMaxVakFehler", aber das ist auch aus Rainers
    Beitrag ersichtlich. Ich denke mal es gibt einen wiederholten Versuch, das Teil zu finden und wenn dies
    erfolgreich war, wird "nMaxVakFehler" mal versucht das Teil mit einem Vakuumsauger zu fassen.
    Ohne das Programm zu kennen,würde ich aber fast behaupten, daß anstelle von TRYNEXT auch ein
    RETRY stehen sollte. Ausserdem glaube ich nicht, dass es Sinn macht auf einen ERR_WHLSEARCH direkt
    mit RETRY zu reagieren, ohne vorher zurückzufahren oder Positionsdaten zu ändern.
    Kann ich aber erst sagen, wenn ich das komplette Programm kenne.
    Bei TRYNEXT oder RETRY muß man immer aufpassen, wieoft ein RAISE ausgeführt wurde, bevor die
    Fehlernummer abgefangen wird.


    Gruß
    msc


  • Hier drin stecken, die Wiederholungen : "IF nVakFehler>=nMaxVakFehler", aber das ist auch aus Rainers
    Beitrag ersichtlich. Ich denke mal es gibt einen wiederholten Versuch, das Teil zu finden und wenn dies
    erfolgreich war, wird "nMaxVakFehler" mal versucht das Teil mit einem Vakuumsauger zu fassen.


    Richtig. aber dafür muß das Teil erst gefunden werden :P



    Ohne das Programm zu kennen,würde ich aber fast behaupten, daß anstelle von TRYNEXT auch ein
    RETRY stehen sollte. Ausserdem glaube ich nicht, dass es Sinn macht auf einen ERR_WHLSEARCH direkt
    mit RETRY zu reagieren, ohne vorher zurückzufahren oder Positionsdaten zu ändern


    auch korrekt, nach erfolgloser Suche, bewegt sich der IRB auf eine mittels-offset korregierte Startpos, bevor die Suche erneut beginnt. das wird aber schon in der Routine selbst gemacht.
    Mir ging es nur darum, wie diese bsuchenNIO verarbeitet wird. Hatte den Sinn in Verbindung mit 3x Suchen nicht verstanden. ´Hat sich aber Dank Eurer Hilfe geklärt.

    Viele Grüße Noobie

  • jungs,


    in diesem Zusammenhang (Suchen etc.) gibt es eh nicht besonders viele sinnvolle Anwendungen für RETRY, denke ich, zumindest würde ich es ungerne einsetzen, weil (Zitat Doku):

    Zitat

    If the maximum number of retries (4 retries) is exceeded, the program execution stops
    with an error message. The maximum number of retries can be configured in System Parameters (System miscellaneous)


    Ausserdem funzt RETRY nicht wenn der Fehler über RAISE ausgelöst wurde. (Ja gut, damit könnte man noch leben...)


    Nach dem Motto "Wer hat an der Uhr gedreht, ist es wirklich schon so spät ...?" steht man dann vor der Kiste und wundert sich warum "unser Liebling" denn schon nach 4 Versuchen aufgegeben hat...
    Gut, der ein oder andere mag sagen: "Toll, dann kann ich das doch über die System-Parameter einstellen!"
    ...jau, aber spätestens wenn man an verschiedenen Stellen unterschiedliche Wiederholungsversuche braucht ist "Ende im Gelände", von dem "System-Parameter umgestellt -> dann Neustart"-Generve mal ganz abgesehen. Nee, danke.


    Hey, mir fällt gerade auf, dass dieser Smiley :stupid: den Zyklus "System-Parameter ändern -> Neustart" ziemlich gut versinnbildlicht.
    Obwohl der :krank: ist auch nicht schlecht...


    In diesem Sinne, schönen Feirabend noch... :tot:
    Rainer

  • Zitat


    Ausserdem funzt RETRY nicht wenn der Fehler über RAISE ausgelöst wurde. (Ja gut, damit könnte man noch leben...)


    Stimmt!



    Zitat


    Die Instruktion ist nur in der Fehlerbehandlungsroutine innerhalb einer Routine
    möglich. Wenn der Fehler mit einer RAISE-Instruktion erzeugt wurde, kann die
    Programmabarbeitung nicht mit der Instruktion RETRY neugestartet werden. In
    diesem Fall muss die Instruktion TRYNEXT verwendet werden.


    Das ist ja hart: Da dieser Handler:


    von einem RAISE in der aufgerufenden Routine kommt, ist das ganze ja für´n A.... mit dem RETRY...
    Jetzt weiß ich auch, warum das nicht klappt. :shock:


    *langsam kommt Licht ins Dunkle*

    Viele Grüße Noobie

  • Na dann, weiter viel erfolg !
    Ich wollte hier nicht mit dem Zeigefinger wedeln. Entschuldigung, wenn das so bei Dir
    angekommen sein sollte. :wallbash:

  • Hab jetzt auch mal Seite 2 gelesen.
    Klärt mich mal bitte auf, aber ist es nicht so :
    Wenn ich die Fehlernummer erst nach einem RAISE behandle, ist es doch aber so,
    daß ein darauffolgendes RETRY den Programmzeiger in der Routine des behandelnden
    Errorhandlers auf den Prozeduraufruf stellt, aus dem der der RAISE-Befehl letzendlich, wennauch
    über mehrere Prozeduraufrufe und Rücksprünge, gekommen ist.
    Wenn man dies geschickt plaziert, weit genug mit RAISE zurückspringen und dann nochmal versuchen,
    kann man sich jede Menge Programmiererei ersparen.


    Gute Nacht
    msc

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