PZ in einer Routine über Rapid versetzen?

  • Hallo zusammen,
    gibt es eine Möglichkeit, wo ich den Programmzeiger in einer Routine auf eine bestimmte Zeile/Satz springen lassen kann und von dort die Abarbeitung weiter führe?
    Vielen Dank im Voraus!

  • ANZEIGE
  • Guten Tag,


    was erhoffst du dir durch den sprung? ist der Sprung im Programm an eine Bedingung geknüpft?
    GoTo finde ich unsauber aber das kann man machen.
    Beispiel 1:
    GOTO next;
    ...
    next:
    Die Programmabarbeitung fährt mit der Instruktion fort, die auf "next" folgt.
    Beispiel 2:
    reg1 := 1;
    next:
    ...
    reg1 := reg1 + 1;
    IF reg1<=5 GOTO next;
    Die Abarbeitung wird viermal an next übertragen (für reg1= 2, 3, 4, 5).
    Beispiel 3
    IF reg1>100 THEN
    GOTO highvalue
    ELSE
    GOTO lowvalue
    ENDIF
    lowvalue:
    ...
    GOTO ready;
    highvalue:
    ...
    ready:



    Gruß, Aleks.

  • Na komm.



    Zitat

    GOTO wird verwendet, um die Programmabarbeitung in eine andere Zeile (ein Label) innerhalb derselben Routine zu verlegen.


    Normalerweise brauchste kein GOTO, und es wird mit Recht als Trash-Lösung der Unfähigen angesehen. In sehr seltenen Fällen ist es allerdings extrem effizient.


    Was will man denn sonst zur Laufzeit eines Programmes machen?
    Andererseits, wie ich Dich kenne... schreib ein RAPID-Programm, welches ein RAPID-Programm als Textdatei schreibt, in welcher die fragliche Routine so aussieht, dass das gewünschte Sprungziel als erste Anweisung kommt. Diese speicherste dann als *.MOD auf der Disk, lädst das Modul und führst es mit später Bindung wieder aus. Das geht tatsächlich.
    Wenn Du das dann noch auf drei oder mehr Ebenen verschachtelst wird man irgendwo in Schweden in einem Keller einen pentagrammförmigen Altar bauen, auf welchem Dein Portrait aufgestellt wird. :twisted:


    Grüße,
    Michael

  • Hallo Michael,
    vielen Dank für Deine ausführliche Antwort. Die Idee mit dem Modul erstellen, finde ich gar nicht verkehrt ;)
    [size=2]Das Problem was ich habe, ist folgendes:[/size]
    [size=2]Bei uns hängen drei Roboter an einer Steuerung und wenn einer von diesen Kollision fährt, bleiben alle stehen. Danach müssen alle drei freigefahren werden. Bei zwei Rob. läuft nach wiederholten Start alles automatisiert und sicher übers Menüauswahl automatisch in die HomePos.. Doch bei dem einem fehlt mir noch die richtige Idee. Bei diesem Rob. ist der sicherste Weg in die HomePos. zu fahren, die angefangene Routine zu Ende fahren lassen. Den, nach jedem Start über SPS werden die Rob. von Main gestartet.[/size]
    [size=2]Deswegen war mein Gedanke, dass über MoveLSync eine Routine jedes Mal angesprochen wird und die abgearbeitete Zeile (mit incr) abgespeichert wird. Somit könnte ich beim Nächstem Start in die Routine springen und auf die zuletzt gespeicherte PZ/Zeile springen und von dort den Ablauf sicher zu Ende fahren lassen.[/size]
    Meine Move Positionen sehen so aus:
    MoveL [[1703.56,475.90,159.64],[0.704233,-0.203026,0.616582,-0.287512],[0,1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]],v500,z1,toR5_XX;
    Es sind ca. 20-30 Position pro Vorrichtung.

  • Ah, die konfliktreiche automatische Homefahrt, wie automatisch darf sie sein?
    Tja, pragmatisch gesehen wäre es wohl das Einfachste, Du würdest die SPS überreden, im Falle einer gewesenen Kollision eben nicht StartMain zu schicken, sondern nur Start. Die Roboter können ja wissen, dass sie eine Kollision hatten (gibt ja einen Systemausgang dafür) und sich, wenn sie gut drauf sind, im letzten Akt vorher dann selbst nach Main schicken. Und wenn sie schlecht drauf sind, fahren sie eben weiter.
    Wenn StartMain ein Dogma ist und Deine Programmstruktur einfach genug, dann bleibt Dir tatsächlich nur übrig, die Bewegungen durchzulabeln. Irgendwas Bescheuertes habe ich für einen anders gelagerten Fall mal gemacht, dass ich eigene Bewegungsbefehle gebaut hab, sozusagen einen Wrapper für MoveL etc., und wenn man da drinne ein bedingtes "Return" an die erste Zeile setzt, dann kann man sein ganzes Programm (abzüglich von Positionsüberprüfungen freilich) durchhecheln, OHNE überhaupt eine Bewegung zu machen, solange, bis die Bedingung wegfällt. Das könnte ein Zähler sein, der mitgelaufen ist oder sowas. Das müsste man dann nur SEHR konsequent handhaben. Und MoveC und Rückwärtsfahren und so fällt weg...


    Grüße,
    Michael

  • Hallo Michael,
    leider geht es ohne "Start Main" nicht. Wäre es den möglich mir dieses Schnipsel zukommen lassen? :zwink:

    Zitat

    Irgendwas Bescheuertes habe ich für einen anders gelagerten Fall mal gemacht, dass ich eigene Bewegungsbefehle gebaut hab, sozusagen einen Wrapper für MoveL etc., und wenn man da drinne ein bedingtes "Return" an die erste Zeile setzt, dann kann man sein ganzes Programm (abzüglich von Positionsüberprüfungen freilich) durchhecheln, OHNE überhaupt eine Bewegung zu machen, solange, bis die Bedingung wegfällt. Das könnte ein Zähler sein, der mitgelaufen ist oder sowas. Das müsste man dann nur SEHR konsequent handhaben. Und MoveC und Rückwärtsfahren und so fällt weg...

  • Ach was soll das, das war in einem obskuren Palettenprogramm eines KUKA, es geht hier ums Sinngemäße.
    Machst halt einen Zähler, der immer bei 0 startet, und einen Speicher, der die Zahl vom letzten Durchlauf behält. Außer wenn das Programm normal gut endet, dann den Speicher auf 0. Und dann noch die Bewegungsbefehl-Wrapper, z. B. einen PROC MoveLSL (alle Parameter wie bei MoveL) und dann drinnen
    Incr zaehler;
    IF (zaehler < speicher) return;
    MoveL Alle durchgereichten Parameter;
    ENDPROC
    In dem Falle würde er keine Bewegung machen, bei welcher der Zähler kleiner ist als die vom letzten mal behaltene Zahl. Sobald der Zähler größer oder gleich wird, führt er die Bewegung aus.
    Aber ich find's riskant. Man muss beim Start absolut sicher sein, dass der Robbi noch da steht, wo er vermutet wird (dafür gibt's aber was im System).


    Schönes Wochenende,
    Michael

  • Hallo,
    meines Erachtes gibt es seit RobotWare 6.04 eine Fehlerbehandlung für die Kollision.
    Die Fehlernummer lautet: ERR_COLL_STOP


    Die Verwendung der Fehlerbehandlung muss in den Systemparametern (SYS) über "Controller/General Rapid/CollisionErrhandling" explizit eingeschaltet werden.


    Wichtig ist das eine Fehlerbehandlung in die erforderliche Routine eingebaut wird.


    Alternativ gibt es von ABB das Produkt "HomeposRunning", das für Deinen Anwendungsfall evtl. verwendet werden kann. Das Thema wurde hier im Forum bereits schon mehrfach behandelt. Vielleicht suchst Du mal danach.


    Gruß
    Micky

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

  • Hallo Michael, Hallo Micky,
    vielen Dank für eure Ideen und Unterstützung. Werde mal aus dem ganzen mir noch etwas an Strategie überlegen.
    Möchte halt nur ungerne HomePosRunning einsetzen und daher der Selbstversuch :)

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