Roboterforum Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?
08. Februar 2012, 15:10:29
Übersicht Hilfe Suche Kalender Einloggen Registrieren
News: English and international Robotsupport now on Robot Forum. Also Supported by the Moderators of the roboterforum.de

Roboterforum für Industrieroboter Anwender  |  Industrieroboter Helpcenter  |  ABB Roboter (Moderatoren: burlibua, Sven Weyer, rmac)  |  Thema: Ruckzugstrategie bei ABB 0 Mitglieder und 1 Gast betrachten dieses Thema. « vorheriges nächstes »
Seiten: [1] 2 Nach unten Drucken
Autor Thema: Ruckzugstrategie bei ABB  (Gelesen 3069 mal)
mkilber
Member
***
Offline Offline

Beiträge: 63


« am: 05. März 2009, 10:10:44 »

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


Gespeichert
Micky
Junior Member
****
Offline Offline

Beiträge: 127



« Antworten #1 am: 05. März 2009, 13:18:46 »

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/roboter-forum/abb_roboter/befehlsatz_smove-t5053.0.html

Gruß
Micky
Gespeichert
mkilber
Member
***
Offline Offline

Beiträge: 63


« Antworten #2 am: 06. März 2009, 14:35:43 »

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

Gespeichert
Micky
Junior Member
****
Offline Offline

Beiträge: 127



« Antworten #3 am: 06. März 2009, 16:36:20 »

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


Gespeichert
MartinK
Stammgast
**
Offline Offline

Beiträge: 21


« Antworten #4 am: 09. März 2009, 08:40:26 »

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
Gespeichert
Micky
Junior Member
****
Offline Offline

Beiträge: 127



« Antworten #5 am: 09. März 2009, 14:17:35 »

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
Gespeichert
mkilber
Member
***
Offline Offline

Beiträge: 63


« Antworten #6 am: 12. März 2009, 07:55:57 »

Vielen Dank für eure Antworten.

ich muss jetzt überlegen, welche von  diesen Möglichkeuiten am schnellsten realisierbar ist.
Gespeichert
Paulaner
Junior Member
****
Offline Offline

Geschlecht: Männlich
Beiträge: 103



WWW
« Antworten #7 am: 12. März 2009, 21:35:53 »

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
Gespeichert

Erfahrung kann man nicht kaufen,
aber man kann dafür bezahlen.
Gerhard Reinig
Member
***
Offline Offline

Geschlecht: Männlich
Beiträge: 85



WWW
« Antworten #8 am: 14. Juni 2009, 22:26:41 »

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.
Gespeichert

Gerhard Reinig
Roboterprogrammierung
Fanuc KUKA ABB Comau Reis RobCad
titan72
Global Moderator
Elite Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 869



« Antworten #9 am: 22. Juli 2009, 15:13:42 »

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!
Gespeichert

‘Go To Statement Considered Harmful’

„Seit Jahren bin ich nun mit der Beobachtung vertraut, dass die Qualität von Programmierern eine abnehmende Funktion der Dichte von GOTO Anweisungen in ihren Programmen ist.“
Edsger W. Dijkstra

Dem haben wir nichts hinzuzufügen!
mkilber
Member
***
Offline Offline

Beiträge: 63


« Antworten #10 am: 07. Juli 2010, 11:37:15 »

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.
Gespeichert
Micky
Junior Member
****
Offline Offline

Beiträge: 127



« Antworten #11 am: 07. Juli 2010, 11:57:52 »

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:

Code:
  proc PosVergleich()
    VAR datapos dpBlock;
    VAR string stName;
    VAR robtarget pTemp;

    !Alle robtargets suchen
    SetDataSearch "robtarget"\PersSym\ConstSym\InTask\GlobalSym;
    !Alle gefundenen robtargets durchlaufen
    WHILE GetNextSym(stName,dpBlock\recursive) DO
      !pActPos ausschließen
      IF stName<>"pActPos" THEN
       !Wert der robtarget auslesen und in pTemp speichern
        GetDataVal stName\block:=dpBlock,pTemp;
        !
        !Vergleich zwischen pActPos und pTemp durchführen
         if ....
            return;
        ENDIF
      ENDIF
      !
    ENDWHILE
endproc

Ich hoffe das hilft Dir weiter.

Gruß
Micky
Gespeichert
mkilber
Member
***
Offline Offline

Beiträge: 63


« Antworten #12 am: 07. Juli 2010, 15:38:40 »

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?


Gespeichert
mkilber
Member
***
Offline Offline

Beiträge: 63


« Antworten #13 am: 07. Juli 2010, 15:52:00 »

das hab ich so gelöst

SetDataSearch "robtarget",\InMod:="Globale_Variablen";

allerdings wenn ich nach ROBPOS suche dann gebt es Fehler
Gespeichert
Micky
Junior Member
****
Offline Offline

Beiträge: 127



« Antworten #14 am: 07. Juli 2010, 16:34:05 »

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
Gespeichert
Seiten: [1] 2 Nach oben Drucken 
Roboterforum für Industrieroboter Anwender  |  Industrieroboter Helpcenter  |  ABB Roboter (Moderatoren: burlibua, Sven Weyer, rmac)  |  Thema: Ruckzugstrategie bei ABB « vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS