Roboterforum Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?
18. Mai 2012, 12:29:07
Übersicht Hilfe Suche Kalender Einloggen Registrieren
News: >> Roboterprogrammierer gesucht !? <<

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

Geschlecht: Männlich
Beiträge: 25



« am: 17. Juni 2008, 11:18:05 »

Hallo Liebe Programmierer,

mit welcher Trigger-Anweisung kann ich eine Variable beschreiben um im Fehlerfall geziehlt eine
Rückzugstrategie fahren zu können.

Beispiel KUKA:

TRIGGER WHEN DISTANCE=1 DELAY=0 DO ROBPOS=1
PTP STARTPOSITION

Die Variable ROBPOS ist somit meine Positionswariable mit dem jeweis entsprechenden Zahlenwert der Aktuellen Roboterposition.

Nun Frage, wie in Rapid(ABB IRC5)???
Hilde wäre super. hilfe

Pascal




Gespeichert
Sven Weyer
Moderator
Elite Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 912



WWW
« Antworten #1 am: 17. Juni 2008, 13:54:24 »

Beim ABB würde ich anders vorgehen:
erst einmal würde ich eine spezielle Routine erstellen z.B.:
Die kannst Du behandeln wie eine normale Bewegungsinstruktion MoveL nur mit dem unterschied das Du deiner Variablen
nActPos den übergebenen Wert mit gibst:
z.B.:
SMoveL 20,p20_1,vmax,z200,tGreifer\WObj:=wAblage;

Die Zahl 20 nach der "SMoveJ" wird in die nActPos, einer globalen Variablen geschrieben die immer wieder Abgefragt werden kann im Programm.
Bei Zwischenpunkten würde es folgendermaßen Aussehen können z.B.:

SMoveL 229901, *, vmax, z200, tGreifer\WObJ:=wAblage;

229901 bedeutet von der Endposition "p22" zur Endposition "p99", (Homeposition) , wäre das die erste Hilfsposition. Somit kann das bei einer Grundstellungsfahrt von irgendwoher definiert passieren da der Roboter anhand des Zahlenwertes weiß welches seine letzte Aktion war.

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

Mit anderen Move-Instruktionen kann natürlich genauso verfahren werden.

Hoffe es hilft Dir ein wenig.

Sven
Gespeichert

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

Beiträge: 133



« Antworten #2 am: 17. Juni 2008, 14:53:38 »

Hallo,

bei der Lösung von Sven wird die Positionsnummer nicht beim Erreichen der Roboterposition zugewiesen (triggern), sondern er weist der Positionsvariablen bereits den neuen Wert zu, sobald die Instruktion ausgeführt wurde.
Aufgrund der Rechnervoreilung werden bereits mehrere Position vorverarbeitet, so dass die Positionsvariable nicht den zur aktuellen Position gehörenden Wert beinhaltet.

Bei der ABB Steuerung gibt es leider keine Möglichkeit direkt eine Variable zu triggern, dies ist nur über einen Umweg z.B. durch Aufruf einer Triggerinterruptroutine möglich. Diese kann z.B. über die Instruktion TriggL bzw. MoveLSync aufgerufen werden.

Bei MoveLSync kann die Routine direkt in der Bewegungsinstruktion angegeben werden.

Beispiel:
MoveLSync p10,v1000,z10,tGreifer,"SyncRoutine";

PROC SyncRoutine()
  nActPos:=10;
ENDPROC

Mit dieser Methode könnte man jetzt die verschiedenen Positionsvariablen zuweisen, wobei man sich aber noch einen intelligenten Algoryhtmus ausdecken muss um nicht für jede Positionsnummer eine eigene Routine anlegen zu müssen.

Um den Roboter im Fehlerfall gezielt nach Hause fahren zu können, bietet ABB die Option "HomeposRunning" an, bei der zum einen für jede Position eine Positionszuweisung über eine Positionstriggerung erfolgt. Zum anderen beinhaltet diese Option bereits die Möglichkeit über eine spezielle Strategie positionsabhängig in die Grundstellung zu fahren.

Gruß
Micky
Gespeichert
Sven Weyer
Moderator
Elite Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 912



WWW
« Antworten #3 am: 17. Juni 2008, 15:36:59 »

Ja die Idee mit der MoveLSync kam mir auch, aber hier können keine Routinen mit Übergabeparameter eingesetzt werden somit benötigt man ja für jede Position eine eigenen Routine und das ist schon ein bisschen doof. Das Thema trifft aber auch auf den Trigger in Bezug auf die Aktivierung eines Interrupts zu.
Zum anderen Thema muss ich zu meiner Überraschung eigentlich sagen das ich damit bis dato noch nie so wirklich ein richtiges Problem damit hatte. Aber systemtechnisch und theoretisch hat Micky da natürlich vollkommen recht. Der Vorlaufzeiger sollte diesbezüglich schon Schwierigkeiten machen.  Denken

Aber ansonsten sehe ich bei ABB keine so einfache Möglichkeit wie beim KUKA, auf den ersten Blick.  zwink

Sven
Gespeichert

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!
Catamanta
Stammgast
**
Offline Offline

Geschlecht: Männlich
Beiträge: 25



« Antworten #4 am: 17. Juni 2008, 16:18:12 »

Hallo nochmals,

interresante Vorschläge. Vielen Dank für die Anregungen.
Option Homeposrunning hört sich nach mehr Zahlen(Geld) an. Gibt es denn keine Möglichkeit sich solch eine
Trigger-Struktur selber zu schreiben die mir dann eine Variable beschreibt?

Oder anderer Vorschlag:
Wenn ich zur Schaltaktion des Triggers eine Routine aufrufen kann, ist es dann möglich, aus einer Systemvariablen die Aktuelle Position, damit meine ich die Positionsbezeichung als String, auszulesen?


Danke schon mal danke

Pascal
Gespeichert
rmac
Global Moderator
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 282


« Antworten #5 am: 17. Juni 2008, 17:05:09 »

[...]Gibt es denn keine Möglichkeit sich solch eine Trigger-Struktur selber zu schreiben die mir dann eine Variable beschreibt?[...]
Nein, zumindest nicht in der Form wie bei KUKA, weil man beim (ABB-)Triggern nicht direkt eine Anweisung angegeben
kann die ausgeführt werden soll, sondern "nur" eine gesamte Interrupt-Routine (bei TriggInt).
Und einer Interrupt-Routine kann man logischerweise keine Parameter übergeben...
Im Übrigen ist die Verwendung eines Trigger-Interrupts per TriggInt oder eines MoveXSync (bezogen auf die Aufgabenstellung)
identisch. Beim MoveXSync wird die angegebene Routine in der Mitte der Bahn ausgeführt, beim TriggInt läßt sich dagegen
noch genauer spezifizieren wo bzw. wann der Trigger (bezogen auf Start- oder Endpunkt) ausgelöst werden soll.

[...]Wenn ich zur Schaltaktion des Triggers eine Routine aufrufen kann, ist es dann möglich, aus einer Systemvariablen die Aktuelle Position, damit meine ich die Positionsbezeichung als String, auszulesen?[...]
Nein, auch das nicht.
Die aktuelle TCP-Position läßt sich natürlich ermitteln, aber nicht den Bezeichner/Namen der aktuellen bzw. zuletzt verwendeten
Position. Wüßte auch nicht wie das gehen sollte wenn man z.B. direkt zu einer Position verfährt die direkt im Verfahrbefehl
angegeben ist, also gar keinen Namen hat.
(MoveL [[-19.08,-343.42,-76.86],[0.122998,0.007122,-0.002962,-0.992377],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]]...)

Gruß
rmac
Gespeichert
Catamanta
Stammgast
**
Offline Offline

Geschlecht: Männlich
Beiträge: 25



« Antworten #6 am: 17. Juni 2008, 17:25:21 »

Tja Leute,

dann sag ich mal vielen Dank für Eure Behmühungen das Problem zu lösen. Sieht mir nicht nach gut durchdachtem Konzept seitens ABB aus. Werd wohl hergehen müssen u. mir für jede Position ein Signal deklarieren mit dem ich dann in einem Hintergrundtask( wie sps.sub bei KUKA) in Abhängigkeit des Signals eine Positionsnummer generiere. Ist zwar ein bisschen Schreibarbeit, aber so gehts auch.

Mal was anderes: Was wenn ich mal wie bei meinem letzten Auftrag ca. 1700 E/A´s über den Profibus schaufeln muss. Bei KUKA schreibe ich die Langtexte mit Excell u. erzeuge dann eine Textdatei die ich dann in der BOF über das Inbetriebnahmemenü "Langtexte" laden kann. Aufwand ca. 2 Stunden.

Geht das bei ABB auch so ähnlich, oder muss ich mir da 3 Tage für Zeit nehmen?? Denken

Liebe Grüße

Pascal
Gespeichert
rmac
Global Moderator
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 282


« Antworten #7 am: 17. Juni 2008, 21:53:34 »

Nochmal was zur ursprünglichen Problematik zu Beginn des Threads:

1. Das Problem mit dem Vorlauf bei den Positions-Nummern ließe sich (z.B.) durch einen FIFO (FirstIn/FirstOut) 
als Ringpuffer umgehen. Schreiben und Lesen sind dann unabhängig voneinander.
Funktioniert ungefähr so:
- vor jedem Verfahrbefehl wird die entsprechende Pos.-Nr in den FIFO geschrieben
- in der Sync-Routine wird die entsprechende letzte Pos.-Nr (für den gerade aktiven, synchronen Verfahrbefehl) aus dem FIFO
  gelesen

Code:
  CONST NUM CMAXFIFO := 10;      ! Anzahl FIFO Einträge
  VAR NUM nFIFO{CMAXFIFO};       ! FIFO Speicher (Ringpuffer)
  VAR NUM nFIFOInPtr := 1;       ! nächster Index zum Schreiben in FIFO
  VAR NUM nFIFOOutPtr := 1;      ! nächster Index zum Lesen aus FIFO
  VAR NUM nCurPosNr;             ! enthält Nr. der letzten Verfahr-Position

  PROC GetFIFOPosNr()
    nCurPosNr := nFIFO{nFIFOOutPtr};              ! nächste Pos. aus FIFO lesen
    nFIFOOutPtr := nFIFOOutPtr + 1;
    IF nFIFOOutPtr > CMAXFIFO nFIFOOutPtr := 1;   ! ggfls. Ringpuffer wieder von vorn
  ENDPROC

  PROC SMoveL(NUM ActPos, robtarget ToPoint, speeddata speed, zonedata zone, INOUT tooldata tool \INOUT wobjdata WObJ)
    nFIFO{nFIFOInPtr} := ActPos;                  ! Pos. in FIFO schreiben
    nFIFOInPtr := nFIFOInPtr + 1;
    IF nFIFOInPtr > CMAXFIFO nFIFOInPtr := 1;     ! ggfls. Ringpuffer wieder von vorn
   
    MoveLSync ToPoint,speed,zone,tool\WObj?WObJ, "GetFIFOPosNr";
  ENDPROC
Bemerkungen hierzu:
- Puffergröße von 10 sollte wohl ausreichen, da der Vorlauf ja nicht mehr als 10 Verfahrbefehl voreilt (denke ich)
- BACKWARD-Handling müßte noch eingebaut werden wenn gewünscht/notwendig
- Zus. Plausibilitätsprüfungen sollten/könnten noch eingebaut werden was die Gültigkeit der FIFO-Ptr. angeht, das hab ich
mir jetzt gespart.


2. Um zu Ermitteln in welcher Entfernung man sich zu einer benannten Position befindet (z.B. für besagte Rückzugsstrategie)
könnte man folgendermaßen vorgehen:
Code:
  PROC FindNearestRT(POS pPos)
    VAR DATAPOS block;
    VAR STRING sName;
    VAR STRING sMinName := "";
    VAR ROBTARGET rt;
    VAR NUM nMinDist := 3.4e38;
    VAR NUM nDist;

    SetDataSearch "robtarget", \InTask;
    WHILE GetNextSym(sName, block \Recursive) DO    ! alle Robtargets durchkaspern
      GetDataVal sName \Block:=block, rt;
      nDist := Distance(pPos, rt.Trans);                        ! min. Entfernung ermitteln
      IF nDist < nMinDist THEN
        nMinDist := nDist;
        sMinName := sName;
      ENDIF
    ENDWHILE
   
    IF sMinName <> "" TPWrite "Stehe in der Nähe von '" + sMinName + "'. Entfernung: ", \NUM:=nMinDist;
  ENDPROC
Bemerkungen hierzu:
- je nach Aufgabenstellung sollte man den Daten-Suchbereich einschränken (z.B. nur in bestimmten Modulen)
- die Suche funktioniert NICHT in Arrays, d.h. funzt nur bei Robtargets in "Einzel"-Const/Var/Pers
- ggfls. müßten noch Werkobjekt und/oder Tool berücksichtigt werden

Wie immer: alles nicht getestet....also keine Gewähr  pfeif

Gruß an Hilde (unbekannterweise)  zwink
rmac
Gespeichert
Robcheck01_MJ
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 269



« Antworten #8 am: 25. Juni 2008, 04:41:35 »

Hallo Catamanta,

also EA`s über Exel in eine .CFG Datei schaufeln funktioniert so nich bei ABB. Es sei den Du schreibst dir Script was das erledigt. Kenne auch mehrere Systeme, aber das vom ABB ist mir persönlich am übersichtlichsten. Ist aber definitiv Geschmackssache, wie überall im Leben!!! fluch Ich denke die Lösungen die dir angeboten wurden gehen schon in die richtige Richtung. Du könntest aber auch dir 2  Moveinstruktion schreiben. Eine für die Vorwährtsabarbeitung und eine für die Rückwärtsabarbeitiung. Ist auch nur ein Gedanke, aber ich würde mir jeweils eine Array mit zB.30-50 Stellen für Positionen,Tools,Werkobjekte anlegen und dann über die Instruktion Storepath(schau mal in der Doku nach) die Sache erledigen. In der Vorwährtsbewegung müsstest Du dir bloss die Positionen + Tools + etc in den Arrays speichern und bei der Rückwärtsabarbeitung nur Rückwärts aufrufen. Müsste auch relativ sicher sein da Du dir ja alle relevanten Daten wie Pos und Tools abspeicherst. Ist aber auch nur so ein Denkanstoss

Gruß...

 
Gespeichert

„Herr, lass mich ein guter Mensch sein. Aber bitte nicht sofort.“
SPSdaniel
Neuling
*
Offline Offline

Beiträge: 18


« Antworten #9 am: 28. August 2008, 23:41:30 »

Hallo bin neu hier, bin SPS Programmierer und programmiere gerade zum ersten Mal ABB Roboter IRB 4400
mit IRC5 Steuerung. Das ganze ist ein Klebeanlage bei der in Magazinen Teile, auf denen vorher Kleber aufgebracht wurde, verpresst werden. Da der Roboter fast im gesamten Arbeitsraum hantiert, will der Kunde eine automatische Grundstellungsfahrt. Jetzt würde mich schon interessieren wie ihr das so handhabt. Ich habe zurzeit eine Fehlerbehandlung damit der Roboter mittels Pfadaufzeichnung in den einzelnen Station bei einen Fehler wieder herausfährt in die Vorposition und danach kann mit der Starttaste der Vorgang durch die Pfadaufzeichnung vorwärts an dem Punkt wieder gestartet werden. Aber wie ich die automatische Grundstellungsfahrt realisieren soll will mir im Moment noch nicht einfallen. Es muss doch auch eine Möglichkeit geben ohne die Option Homeposrunning. Ein Ansatz von mir wäre gewesen daß wenn ein gültige Pfadaufzeichnung esxistiert diese gespeichert wird, diese rückwärts abgefahren wird bis zu jeweiligen Vorposition
und von dieser Vorposition ist es gefahrlos möglich in die Grundstellung zu fahren. Was passiert aber bei Spannungsausfall oder bei aus-/einschalten oder Auto->Hand->Auto ist es dann nöch möglich auf den gespeicherten Pfad zu zugreifen? Wäre für weiter Denkanstösse dankbar..

Gruß Daniel...
Gespeichert
Seiten: [1] Nach oben Drucken 
Roboterforum für Industrieroboter Anwender  |  Industrieroboter Helpcenter  |  ABB Roboter (Moderatoren: burlibua, Sven Weyer, rmac)  |  Thema: Roboterpositionen Triggern « 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