Ruckzugstrategie bei ABB

  • Hallo,


    ich habe jetzt Vergnügen 2x140 IRB zu Inbetriebzunehmen.
    Es läuft soweit gut. Allerdings habe ich Schwirigkeiten bei der Ruckzugstartegie oder Grundstellungsfahrt.
    Ihc habe ein bißchen nachgelesen und habe verstanden dass bei ABB nicht geht wie z.B. bei Fanuc oder KUKA.


    Ich fasse hier noch zusammen.
    1.
    MoveL p10,speed,zone,tool\WObj?WObJ;
    ActPos:=10;


    Und dann GST mit Case ActPos


    Allerdnigs wegen Vorlaufzeiger wird es nicht immer funktionieren wenn mehrere Positionen vorhanden sind.


    2
    Die Strategie die ich mir uberlegt hab
    möchte ich mit PARAMETER \inPos realisieren
    MoveL p10,speed,zone,tool\WObj?WObJ \inPos ;
    dabei wird in variable nPOS wert 10 geschrieben.
    und dann mit Test nPOS case 10 usw.


    Allerdnigs das sind nur teoretische überlegungen und von Parameter inPos bei Instructionen Move habe ich nur gehört und kenne den genauer Syntax nicht. deswegen freue ich mich aus eure Meineung und Vorschläge


    3.
    MoveLSync p10,v1000,z10,tGreifer,"SyncRoutine";
    PROC SyncRoutine()
    nActPos:=10;
    ENDPROC


    Ungefähr so habe ich mir es auch vorgestellt. Nur noch eine Frage. Gibt es möglichkeit die aktuell angefahrenen Position in SyncRoutine aubzufragen
    z.B.
    PROC SyncRoutine()
    IF (Roboter in p10) !hier aktuel aktuell angefahrene Position
    nActPos:=10;
    Endif
    IF (Roboter in p11)
    nActPos:=11;
    Endif
    IF (unbekannt)
    per hand in HOME
    ENDIF
    ENDPROC


    Oder gibt es wie z.B bei Stäubli die möglichkeit um p10 ein Kugel zu defineren welche im Hintergrund überwacht wirt und dann ein wert oder Variable zurückgibt


    4
    dann Habe ich eine Möglichkeite mit SmoveL gesehen
    SMoveL 20,p20_1,vmax,z200,tGreifer\WObj:=wAblage;


    eingentlich ist die Strategie auch nicht schlecht.
    Nur muss man die Folgende Prozedure slbst schreiben oder die ist bereits vorhanden und wird im hintergrund abgearbeitet??
    !* Procedure SMoveL() *
    !* *
    !* Linear move of robot with saving a number related *
    !* to the position *
    !* *
    !* Globale variables: num nActPos *
    !* Input parameters: num ActPos *
    !* robtarget ToPoint *
    !* speeddata Speed *
    !* zonedata Zone *
    !* tooldata Tool *
    !* Optionale parameter: wobjdata Wobj *
    !**********************************************************
    PROC SMoveL(
    num ActPos,
    robtarget ToPoint,
    speeddata speed,
    zonedata zone,
    INOUT tooldata tool
    \INOUT wobjdata WObJ)


    MoveL ToPoint,speed,zone,tool\WObj?WObJ;
    nActPos:=ActPos;
    BACKWARD
    MoveL ToPoint,speed,zone,tool\WObj?WObJ;
    nActPos:=ActPos;
    ENDPROC



    Ich freue mich auf eure Antworten


    Gruß


    Maxim

  • ANZEIGE
  • Hallo,


    zu 2: InPos ersetzt nur das Zonenargument, eine Zuweisung der Positionsnummer erfolgt dadruch nicht.


    zu 3: Deine Syncroutine wird in der Mitte der Zone zwischen den beiden Punkten ausgeführt, das Abfragen der aktuellen Position bringt hier nichts, da Du dich zum zeitpunkt der Abfrage nie an der programmierten Position befindest


    zu 4: Die Instruktion SMoveL die Du angehängst hast, kann bei den heutigen Steuerungen so nicht mehr verwendet werden, denn deine Positionszuweisung erfolgt direkt nach der MoveL instruktion. Aufgrund der Rechnervoreilung kann aber diese Programmzeile bereits abgearbeitet sein, bevor der Roboter diese Position überhaupt erreicht hat. Hierdurch würdest Du in Deinem Programm von einer ganz falschen Roboterposition ausgehen, z.B. die nächste oder übernächste Position.


    ABB bietet eine Softwareoption mit dem Namen "Homepos-Running" an, deren Bewegungsinstruktionen ebenfalls "SMoveL", etc. heißen. Bei diesen Instruktionen funktioniert aber die korrekte Zuweisung der Positionsnummer.



    :waffen100:


    Mehr zu diesem Thema wurde in diesem Forum bereits in mehreren Beiträgen behandelt.


    http://www.roboterforum.de/rob…hlsatz_smove-t5053.0.html


    Gruß
    Micky

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

  • Hallo Micky,


    das stimmt, das Thema wurde schon mehrmal gestartet aber nie bis zum Ende diskutiert, deswegen bei jedem ABB Anfänger wird die von vorne gestartet.


    Trotzdem vielen Dank für deine Antwort.


    Ist die Option HomePos running kostenpflichtig?
    Ich habe bei meinen Robies die Instructionen nicht gefunden und auch kein DOKU dazu. Wie kommt man an die dran.


    ein Beispiel für "InPos" in verbindung mit MoveL Instruction wäre nicht schlecht.


    Kann man bei ABB Überwachung von Räumen um den Positionen machen?



    Zu dem Punkt 4
    Ist die Möglichkeit bei IRC5 nicht realiesierbar? ich dachte das gilt nur für PUNKT 1


    Zitat

    zu 3: Deine Syncroutine wird in der Mitte der Zone zwischen den beiden Punkten ausgeführt, das Abfragen der aktuellen Position bringt hier nichts, da Du dich zum zeitpunkt der Abfrage nie an der programmierten Position befindest


    Wenn man das mit Kugelüberwachung von den Positionen verknüpft
    dann kann man die Position fast genau rausfinden.
    zum Beispiel


    MoveLSync p10,v1000,z10,tGreifer,"SyncRoutine";
    PROC SyncRoutine()
    IF Kugel um Pos 10 Then
    nActPos:=10;
    If Kugel um Pos 11 Then
    n ActPos :=11
    Endif


    ENDPROC


    Die Frage ist ob das realisierbar ist??


    Gruß


    Maxim

  • Hallo,


    die Option "HomeposRunning" ist kostenpflichtig. Die aktuelle Doku habe ich Dir angehängt.


    Verwendung von Inpos:


    Im Referenzhandbuch unter Datentypen findest Du unter "stoppointdata - Stopppunktdaten" ein ausführliche Beschreibung mit Beispielen und Bildern.


    Es gibt die Option "WorldZones", mit diesen Weltzonen kann man einen Ausgang setzen lassen, wenn der Roboter-TCP sich innerhalb oder außerhalb des definierten Bereich befindet. Zusätzlich kann auch der definierte Raum für den Roboter gesperrt werden.
    Nähere Informationen hierzu kannst dem Referenzhandbuch entnehmen.



    Zu Punkt 4.


    - In der Steuerung können nur eine begrenzte Anzahl von Weltzonen eingesetzt werden. Um alle Punkte abzudecken wäre der Aufwand recht groß.
    - Die Überprüfung der Position ist sehr schwierig, denn außer bei einem Finepunkt befindet sich der Roboter nie an dem programmierten Punkt.
    - Bei Punkten mit sehr kleinen Abständen kann nicht korrekt bestimmt werden, an welchem sich der Roboter gerade befindet.
    - Prinzipiell müsstest Du aber nur für jede Position eine eigene SyncRoutine verwenden, in der die Positionszuweisung für den jeweiligen Punkt erfolgt, denn die Routine wird ja an der richtigen Position aufgerufen.


    Das Problem kann mit Sicherheit gelöst werden, bedarf aber sicherlich einen sehr hohen Testaufwand bis alles fehlerfrei funktioniert.


    Aus diesem Grund setzen wir "HomeposRunning" ein, denn damit funktioniert zum einen die Positionszuweisung und man kann die bereits erstellten Bewegungsroutinen für die Bewegung in die Homeposition nutzen.


    Gruß
    Micky

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

  • Hallo Maxim,


    ein einfache Methode ist auch CJointT. Damit kriegst du alle Achswinkel raus und
    kann davon den Rückzug aus der Anlage abhängig machen.


    PROC istpos()
    joints:=CJointT();
    linksrechts:=Round(joints.robax.rax_1);
    obenunten:=Round(joints.robax.rax_2);
    obenunten3:=Round(joints.robax.rax_3);

    pist:= CRobT();
    IF regobun >= -10 THEN
    MoveL Offs(pist,0,0,100), v500, fine, Greifer\WObj:=Taktband;
    Endif
    ENDPROC


    Statt dem Offset kannst du natürlich auch sicher erreichbare Punkte anfahren.


    Martin

  • Hi,


    Du könntest vieleicht auch die Position in einem Gruppenausgang anstelle von einer Variablen speichern.
    Hierzu würdest Du alle Bewegungen mit einer TriggL oder TriggJ Instruktion ausführen und über die Instruktion TriggIO die Positionsnummer definieren, die beim Erreichen der Position gesetzt werden soll.


    Wenn Du zusätzlich noch in den Systemparametern "Store Signal Value at Power Fail" beider der Gruppe setzt, wird der Wert beim einem Neustart bzw. Stromausfall wieder auf den alten Wert gesetzt.


    Zur vereinfachung würde ich die Trigg Anweisung in einer eigenen Bewegungsinstruktion kapseln, so dass das ganze wie folgt aussehen könnte:


    Code
    PROC MyMoveL(num ActPos,robtarget ToPoint,.....)
      VAR triggdata trPosition;
    
    
      TriggIO trPosition, 0\GOp:=goActPos, ActPos;
      TriggL ToPoint, speed, trPosition, zone, tool;
    ENDPROC


    Später köntest Du dann die Position wie folgt abfragen:


    Code
    IF GOutput(goActPos)=...



    Gruß
    Micky

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

  • Hi,
    für Grundstellungsfahrt gibt es verschiedene Lösungen,keine Frage!
    Hier noch eine.
    Ich selbst benutze dafür die RAISE und ERROR Befehle.
    Damit kommst du ohne irgendwelche Positionsnummer aus. Und man muss auch keine eigenen Bewegungsbefehle programmieren die dann diese Pos-Variablen setzen.
    Viele Wege führen nach Rom :genau:


    Hier mal ein Beispiel wie das gemacht werden könnte


    LOCAL PROC Pr_DueBa4Zylinder()


    Bewegungen_XX
    ...........................
    IF diMoveHome=high RAISE enGstbei_XX;
    mvDueBa_4Zyl;
    StationWahl rStName.DueBa,rStAktion.Aus;
    IF diMoveHome=high RAISE enGstbei_YY;
    RETURN;
    ERROR
    !fehlerbehandlung->grundstellungsfahrt
    VelSet 100,400;
    !Druck und Drehzahlvorgabe auf 0 setzen
    TEST ERRNO
    CASE enGstbeiXX:
    TPLastWriteSave "Grundstellung!Nach Bewegung XX";
    mvDueBa_A_Bereit;
    RAISE enGstBereit; ! hier übergabe an das übergeordnete programm mit neuer fehlernummer
    CASE enGstbeiYY:
    TPLastWriteSave "Grundstellung!Nach Bewegung YY";
    mvDueBa_E_Bereit;
    RAISE enGstBereit; hier übergabe an das übergeordnete programm mit neuer fehlernummer
    DEFAULT:
    DefaultCase "Pr_DueBa4Zylinder"\nFehlerNr:=9;
    ENDTEST
    ENDPROC



    @ mkilber:
    Auf jeden Fall hast du jetzt noch eine Möglichkeit zum probieren.
    Viel Spaß. Paul

    Für seine Arbeit muß man Zustimmung suchen, aber niemals Beifall.<br />Zitat: Charles-Louis Baron de Montesquieu


  • vieleicht auch die Position in einem Gruppenausgang anstelle von einer Variablen speichern.
    Hierzu würdest Du alle Bewegungen mit einer TriggL oder TriggJ Instruktion ausführen


    Mal 'ne Frage dazu: Ist es beim ABB nicht möglich wie beim Kaffee und Kuchen Augsburg in Variablen zu triggern sondern nur in Singnale wie z. B. Gruppenausgänge?
    Hab' nämlich auf 'nem nackigen KUKA ohne jegliche Tech-Pakete so gemacht.

  • Hallo,
    ich glaube die IRC5 sollte es mittlerweile können, bei S4c+ und < ist triggern auf der Bahn nur mit Gruppenausgang möglich gewesen, wobei das auch kein Problem darstellt, wird einfach ein virtuelles Board angelegt, der GO deklariert und es werden keine IO's verschwendet!

  • Hallo,


    Ich möchte folgendes machen:
    Ich will alle mein Robtargets durchsuche und die Positionen mit der aktuelle vergleichen



    PERS robtarget pActPos:=[[0,0,0],[1,0,0,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];
    VAR jointtarget jActPos:=[[0,0,0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,0]];



    !-- Globale Punkte beispiel
    PERS robtarget pROBPOS_20:=[[-131.09,-87.4,106.62],[0.00166434,-0.711063,-0.0163969,-0.702934],[0,1,-3,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    PERS robtarget pROBPOS_21:=[[-186.66,-47.54,-111.07],[0.366085,-0.334428,0.355468,-0.792327],[0,0,-2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    PERS robtarget pROBPOS_22:=[[-323.29,9.15,-384.54],[0.56517,0.0338027,-0.0232342,-0.823954],[0,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];


    pActPos:=CRobT(\Tool:=tGripper\WObj:=wobj0);


    FOR nI FROM 1 TO 500 DO
    !str :=pROBPOS_+NumToStr(nI,0);
    nDistance := Distance ( pActPos,CallByVar ("pROBPOS_",nI));
    !nDistance := Distance (pActPos,pActPos);
    IF nDistance<100 THEN
    Setze Merker(CallByVar ("nActPos_",nI)
    ENDIF
    ENDFOR


    Bei dem Grundstellungsfahrt
    TEST nActPos
    CASE
    Move pRobPos_1
    usw



    Bei der Zeile
    nDistance := Distance ( pActPos,CallByVar ("pROBPOS_",nI));
    habe ich Typenkonflikt. Wie man das anders realisiert weiss ich nicht.


    Freu mich auf die Antwort.

  • Hi,


    du kannst die Instruktion GetDataval zum auslesen einer Variablen verwenden. Desweiteren besteht die Möglichkeit nach allen Robtargets zu suchen und ggf. noch einen Namensfilter zu setzen (siehe SetDataSearch)


    Anbei ein Beispiel:



    Ich hoffe das hilft Dir weiter.


    Gruß
    Micky

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

  • Danke für schnelle Antwort.
    Es hat soweit funktioniert nur.
    Meine robtargets sind wie folgt mit vortlaufendem nummer definert:
    PERS robtarget pROBPOS_20:=[[-131.09,-87.4,106.62],[0.00166434,-0.711063,-0.0163969,-0.702934],[0,1,-3,0],


    SetDataSearch "pROBPOS_20", \InTask;
    Mit diese Definition bekomme ich Suchfehler.
    Die Deklaration von den Robtargets ist bei mir in einem Systemmodul "Globale_Variablen"


    SetDataSearch "robtarget", \InTask;
    Die Abfrage funktioniert wunderbar


    wie kann man die ausfiltern?

  • Hi,


    über den Parameter Object kannst Du den Namen filtern, in dem du einen einen regulären Ausdruck angibst. Die genaue Beschreibung wie das funktioniert kannst Du dem Referenzhandbuch entnehmen.


    Anbei die Lösung für dein Problem:


    Code
    SetDataSearch "robtarget"\Object:="pROBPOS_*"\InTask;


    Gruß


    Micky

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

  • Hallo,


    ich wollte die SMoveL Funktion anpassen. und zwar in den TriggL umwandeln


    PROC STrMoveL(
    num ActPos,
    robtarget ToPoint,
    speeddata speed,
    triggdata gunon,
    zonedata zone,
    INOUT tooldata tool
    \INOUT wobjdata WObJ)
    TriggL ToPoint,speed,gunon,zone,tool\WObj?WObJ;
    nActPos:=ActPos;


    Fehler 4083 : Typenfehler : triggdata nicht vom Typ 'value'. 09.07.2010


    diese fehlermeldung bekomme ich.


    geht es überhaupt??

  • Hallo mkilber,


    Du musst VAR vor die Deklaration von triggdata schreiben, dann sollte es funktionieren.


    Code
    PROC STrMoveL(
        num ActPos,
        robtarget ToPoint,
        speeddata speed,
        VAR triggdata gunon, ...


    Gruß
    Micky

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

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