Roboterforum Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?
18. Mai 2012, 12:39:48
Ü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: Schweissung_Messen 0 Mitglieder und 1 Gast betrachten dieses Thema. « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Schweissung_Messen  (Gelesen 1890 mal)
AB_Rotech
Gast
« am: 22. Mai 2008, 13:04:12 »

Hallo,

habe folgende Aufgabe wobei mir die Erfahrung und das Wissen dafür fehlt;  Embarassed

als info: IRC5 Setuerung mit ArcWare Frn TPS 4000.

Ein teil mit 27x35mm Schweissnaehte wird hergestellt. Nun ist es aber
passiert das durch Bedienfehler einige Naehte ausgelassen oder übersprungen wurden.  waffen100

Nun zu meine Frage:  hilfe
Wie kann ich es im Program irgendwie verhindern das instruktionen übersprungen werden können?
Oder wie kann ich am Ende des Programs kontrollieren ob Naehte fehlen.

Habe folgende idee gehabt die ich aber nicht sinnvoll nutzen konnte.
Beispiel:
   !!
   VAR num weldlength_1:=0;
   !!
   MoveL p10, v500, z40, tWeldGun\WObj:=wobjSTN1;
   ArcLStart p20, v300, seam2, weld3, fine, tWeldGun\WObj:=wobjSTN1;
   ArcLEnd p30, v1000, seam2, weld3, fine, tWeldGun\WObj:=wobjSTN1;
   !!
   weldlength_1 := Weld_dist(p20,p30);
   !!
   MoveL p40, v500, z40, tWeldGun\WObj:=wobjSTN1;
   !usw.

   FUNC num Weld_dist(
      robtarget point1,
      robtarget point2)

      VAR num sum:=0;
      VAR pos pos1:=[0,0,0];

      pos1:=point2.trans-point1.trans;
      sum:=pos1.x*pos1.x+pos1.y*pos1.y+pos1.z*pos1.z;
      RETURN Sqrt(sum);
    ENDFUNC

 Am ende des Programs wollte ich die Summe aus allen Naehten vergleichen und dem   ensprechend
 mit einem Errohandler bearbeiten.
 Leider ist dies auch nicht problemsloesung gewesen weil ich damit die tatsaechliche Schweissung nicht
 messe sondern nur die laenge zwischen p20 und p30.  Aber ob Schweissen aktiv war ist ungewiss.  kopfkratz  
 ich braeuchte dafür das di_ArcOn Signal um die tatsaechliche Schweissung zu messen.

 An diesem Problem hänge ich schon eine Zeit lang und alle meine ideen führen in die Sackgasse.
 

 Ich freu mich über jede Idee die mich hier weiter bringt!!

 MFG

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

Geschlecht: Männlich
Beiträge: 282


« Antworten #1 am: 22. Mai 2008, 17:27:19 »

Hi,

erstmal als Info vorab: ich habe keine Ahnung von dem Schweissdings und auch noch nie mit ArcWare gearbeitet,
von daher alles ohne Gewähr....  liebe029

Wie kann ich es im Program irgendwie verhindern das instruktionen übersprungen werden können?
Ich denke im Programm kann man das überhaupt nicht verhindern, weil das Programm seinen eigenen Ablauf in der
Form nicht überwachen/kontrollieren kann. Man kann den Zugang des Benutzers zum Programm einschränken, dazu solltest du
die entsprechende Doku konsultieren.

Prinzipiell ist dein Gedanke zur Messung der Nahtlängen ja nicht schlecht...
Funktioniert aber leider nicht wenn der Anwender die Arc-Instruktionen überspringt und nur deine Längenmessung
durchlaufen läßt (weldlength_1 := Weld_dist(p20,p30)). Aber das hast du ja schon bemerkt.....
BTW: Du brauchst für die Längenberechnung keine eigene Funktion, die gibts in RAPID nämlich schon:
weldlength_1 := Distance(p20.trans, p30.trans);

Nun zur eigentlichen Längenmessung:
Ich habe mal die ArcWare-Doku überflogen, aber nichts zu dem, von dir genannten di_ArcOn gefunden.
Das, was dem am nächsten kommt, wäre vielleicht ArcEst (Pflichtsignal: gibt an ob der Lichtbogen gezündet hat) oder
vielleicht auch WeldOK (?)
Vorausgesetzt ein entsprechendes Signal (ArcEst ?) ist vorhanden und abgreifbar, dann hätte ich folgende Idee:
Code:
  VAR INTNUM iArcChange;
  VAR BOOL bArcOnValid := FALSE;    ! zur Sicherheit: Merker für gültige Arc-Zündung
  VAR POS pArcOn;
  VAR NUM nWeldTotal := 0;

  TRAP trArcChange                           ! Interrupt-Routine für Lichtbogen an/aus
    IF TestDI(ArcEst) THEN
      pArcOn := CPos();                      ! wenn Lichtbogen eingeschaltet wurde, dann Start-Pos. merken
    ELSE
      ! wenn Lichtbogen aus und vorheriger Start gültig war, dann Länge zw. An/Aus-Pos. ermitteln
      IF bArcOnValid nWeldTotal := nWeldTotal + Distance(pArcOn, CPos());
    ENDIF
   
    bArcOnValid := TestDI(ArcEst);     ! On/Off merken für nächste Flanke
  ENDTRAP

  PROC Main()
    bArcOnValid := FALSE;
    nWeldTotal := 0;

    CONNECT iArcChange WITH trArcChange;
    ISignalDI ArcEst, edge, iArcChange;     ! Flankenerkennung: Arc On/Off

    ! hier schweißi schweißi machen...
   
    TPWrite "Geschweißte Länge: " \NUM:= nWeldTotal;
  ENDPROC

Ich hab zwar keine Ahnung ob das so geht, aber du hast ja geschrieben du freust dich über jede Idee...  Wink
Gruß
rmac

PS.: Nicht vergessen: funktioniert -wenn überhaupt-, dann logischerweise nur bei linearen Nahtverläufen (wg. Distance),
bei Kreisbahnen müßte man noch ein bisschen mehr rechnen...
Gespeichert
Robcheck01_MJ
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 269



« Antworten #2 am: 22. Mai 2008, 18:03:21 »

Hallo AB_Rotech,

Als erstes falls Du keinen hast. Würde ich mir einen Errorhändler programmieren.
In diesem Errorhändler könntest Du dann.
1. Stop ausführen und aktuelle Pos speichern oder
2. Nur einen Merker setzen das Du einen Fehler hattest + Meldung ausgeben und diesen dann bei Anfang der nächsten Naht abfragen (durch Bediener)

Hier mal ein Auszug aus der Doku.

AW_START_ERR - Fehler bei der Startbedingung; Überwachung von Brenner, Gas oder Wasser
AW_IGNI_ERR - Fehler bei der Zündung; Zündüberwachung
AW_WELD_ERR - Schweißfehler; Zündüberwachung
AW_EQIP_ERR - Schweißausrüstungsfehler; Überwachung von Spannung, Strom, Wasser oder Gas während des Schweißvorgangs
AW_WIRE_ERR Draht festgeklebt - Fehler; Überwachung, damit der Draht nicht an der Schweißnaht festklebt
AW_STOP_ERR - Durch die Eingabe Stop Process wurde der Schweißvorgang unterbrochen

Oder wie kann ich am Ende des Programs kontrollieren ob Naehte fehlen.

Möglich hier wäre ein Zähler den Du nach jeder Instruktion hochzählst und am Ende abfragts, was aber sehr unelegant wäre oder Du schreibst dir eine eigene Moveinstruktion mit der kannst Du dann einiges erschlagen.

PERS num nMaxSwCount:=3; Zähler maximale Schweisspunkte
PERS num nAktSwCount:=0; Zähler für gemachte Schweisspunkte, diesen dann am Ende mit Max vergleichen und am Anfang wieder initialisieren
PERS bool bSwError:=FALSE; Merker für Fehler beim Schweissen

PROC Schweissen()
  bSwError:=FALSE;
  CLEAR nAktSwCount;
  MoveArcL\On,p10,v400,sm01,wd01,wv0,fine,SWTool\Wobj:=Station_1;
  MoveArcL p20,v400,sm01,wd01,wv0,z1,SWTool\Wobj:=Station_1;
  MoveArcL\Off,p30,v400,sm01,wd01,wv0,fine,SWTool\Wobj:=Station_1;
  ! aktualisieren deiner MaxNähte am Ende deines Schweissprogrammes, wenn kein Fehler war
  IF bSwError=FALSE nMaxSwCount:=nAktSwCount;
ENDPROC

PROC MoveArcL(
    \num PosNum
    \switch On
    |switch Off,
    robtarget Position,
    speeddata vSpeed,
    PERS seamdata Sm,
    PERS welddata Wd,
    PERS weavedata Wv,
    zonedata Zone,
    PERS tooldata Tool
    \PERS wobjdata Wobj)

    IF Present(On) THEN
      ArcL\On,Position,vSpeed,Sm,Wd,Wv,Zone,Tool\Wobj:=Wobj;
    ELSEIF Present(Off) THEN
      ArcL\Off,Position,vSpeed,Sm,Wd,Wv,Zone,Tool\Wobj:=Wobj;
    ELSE
      ArcL Position,vSpeed,Sm,Wd,Wv,Zone,Tool\Wobj:=Wobj;
    ENDIF
    INCR nAktSwCount;
  BACKWARD
    ! hier Vorsicht, bitte nicht weiter Schweissen also ausmachen
    MoveL Position,vSpeed,Zone,Tool\WObj:=Wobj;
  ERROR
  ! hier deine Errorhändler integrieren
  bSwError:=TRUE;
   IF ERRNO=AW_WELD_ERR THEN
    !
   ELSEIF ERRNO= AW_START_ERR THEN
    !
   ENDIF
ENDPROC

Ist aber alles ohne Gewähr, habe gerade keinen ABB in der Hand. Hoffe bin jetzt nicht zu extrem abgewichen.
Kannst das ja noch mit rmac seinen Sachen kombinieren.

Gruß..
Gespeichert

„Herr, lass mich ein guter Mensch sein. Aber bitte nicht sofort.“
AB_Rotech
Gast
« Antworten #3 am: 29. Mai 2008, 15:43:14 »

Hallo rmac,
Hallo Robchech01

erstmal vielen Dank für Eure schnellen Antworten bzw. Blitzideen.  danke

Hat beides geklappt.

Robchech01 nach deinem motto:
Zitat
Kannst das ja noch mit rmac seinen Sachen kombinieren

Habe etwas rumgebastellt und beide Tips kombiniert und es fuktioniert.

Zitat
PS.: Nicht vergessen: funktioniert -wenn überhaupt-, dann logischerweise nur bei linearen Nahtverläufen (wg. Distance),
bei Kreisbahnen müßte man noch ein bisschen mehr rechnen...
Aber wie mich schon rmac aufmerksam machte, kann ich nur lineare nahtverlaeufe messen.

Bei Kreisbahnen ermittle ich etwa den Durchmesser!

Muss mich jetzt etwas über Kreisberechnung am Robi schlau machen
und es auch irgendwie parallel laufenlassen.  kopfkratz

Danke Ihr seit spitze

mfg
Adnan
Gespeichert
rmac
Global Moderator
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 282


« Antworten #4 am: 29. Mai 2008, 17:28:12 »

Hallo AB_Rotech,

mit einer kleinen Erweiterung kannst du auch per Interrupt eine angenäherte Kreisbahn vermessen,
ohne eine explizite Kreisberechnung machen zu müssen.

Grundidee: Beim Zünden des Lichtbogens wird ein zeitgesteuerter Interrupt (ITimer) aktiviert, der jede Sekunde
die bereits abgefahrenen (Teil-)Strecken berechnet und addiert. Beim Ausschalten des Bogens wird auch der
Timer wieder deaktiviert.
So können auch Kreise und Bögen (gerade Nähte sowieso) über Liniensegmente angenähert werden.
Da die zeitlichen Auflösung des Timers konstant ist (z.B. 1 Sek.), hängt die Segmentlänge (und damit die Genauigkeit
der Kreis/Bogen-Annäherung) von der TCP-Geschwindigkeit ab, d.h. je langsamer verfahren wird, umso kürzer sind
die Segmente und entsprechend genauer ist die Kreisannäherung.

Sieht dann ungefähr so aus:
Code:
  VAR INTNUM iArcChange;
  VAR INTNUM iArcTimer;
  VAR BOOL bArcOnValid := FALSE;    ! zur Sicherheit: Merker für gültige Arc-Zündung
  VAR POS pArcOn;
  VAR NUM nWeldTotal := 0;

  TRAP trArcChange
    VAR POS pCurPos;
   
    pCurPos := CPos();         ! aktuelle Pos.

    IF INTNO = iArcChange THEN ! Interrupt ausgelöst durch Lichtbogen an/aus
      IF TestDI(ArcEst) THEN
        pArcOn := pCurPos;     ! wenn Lichtbogen aufgebaut, dann Start-Pos. merken
        IWatch iArcTimer;      ! Timer-Interrupt aktivieren
      ELSE
        ISleep iArcTimer;      ! Timer-Interrupt deaktivieren
        ! wenn Lichtbogen aus und vorheriger Start gültig war, dann Länge ermitteln
        IF bArcOnValid nWeldTotal := nWeldTotal + Distance(pArcOn, pCurPos);
      ENDIF
    ELSE                       ! Interrupt ausgelöst durch Timer
      IF bArcOnValid THEN
        nWeldTotal := nWeldTotal + Distance(pArcOn, pCurPos);
        pArcOn := pCurPos;                      ! aktuelle Pos. wird Startpunkt für nächstes Segment
      ENDIF
    ENDIF
   
    bArcOnValid := TestDI(ArcEst);     ! On/Off merken für nächste Flanke
  ENDTRAP

  PROC Main()
    bArcOnValid := FALSE;
    nWeldTotal := 0;

    CONNECT iArcChange WITH trArcChange;
    ISignalDI ArcEst, edge, iArcChange;     ! Flankenerkennung: Arc On/Off
    CONNECT iArcTimer WITH trArcChange;
    ITimer 1, iArcTimer;                    ! Timer-Interrupt jede Sekunde (sollte laut Doku. nicht unter 0,5 Sek liegen)
    ISleep iArcTimer;                       ! Timer deaktivieren

    ! hier schweißi schweißi machen...
   
    TPWrite "Geschweißte Länge: " \NUM:= nWeldTotal;
  ENDPROC
Wie immer alles ohne Gewähr.

Wenn man es ganz genau braucht, könnte man auch aus den drei Punkten des Kreises den Radius und damit
die exakte Länge der Segmentbögen berechnen. Sollte gehen, denke ich....

Gruß
rmac
Gespeichert
Robcheck01_MJ
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 269



« Antworten #5 am: 29. Mai 2008, 20:38:09 »

Hallo AB_Rotech,

gern geschehen.  jawohl

Wie rmac schon sagte kannst Du das über die 3 Punkte ermitteln. Ist aber ein wenig an Berechnung notwendig um die Segmentlänge oder Kreisbogen zu ermitteln.

Kannst ja mal bei Google nachschauen, da wirst Du einige Matheforen finden. Zu empfehlen wäre auch noch wikipedia.org.

Gruß..
Gespeichert

„Herr, lass mich ein guter Mensch sein. Aber bitte nicht sofort.“
rmac
Global Moderator
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 282


« Antworten #6 am: 29. Mai 2008, 22:26:32 »

Hiho,

kaum den ersten Schluck Bier im Kopp, da kommt mir doch siedendheiß noch 'ne beknackte Idee:

Vorausgesetzt die Verfahrgschwindigkeit beim Schweißen ist (relativ) konstant, könnte man (wieder per Interrupt)
die Einschaltzeit des Lichtbogens ermitteln und über die (konstante) Geschwindigkeit die geschweißte Strecke berechnen.
Ist dann völlig wurscht ob Kreis, Bogen oder Gerade....

Leider habe ich in der Doku keine Funktion zur Ermittlung der aktuellen TCP-Geschwindigkeit gefunden,
insofern müsste man sich vor jeder Arc-Verfahr-Instruktionen die eingestellte Geschwindigkeit merken (z.B. durch
Kapselung in einer eigenen Routine, oder so)

Sollte theoretisch auch funzen...  beerchug

gruß
rmac
Gespeichert
Robcheck01_MJ
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 269



« Antworten #7 am: 30. Mai 2008, 00:24:57 »

Gar nicht so verkehrt. Bräuchte er also nur beim Start im MoveLArc
bei ArcL\On,Position,vSpeed,Sm,Wd,Wv,Zone,Tool\Wobj:=Wobj;
den Timer starten und beim stopen ( ArcL\Off,Position,vSpeed,Sm,Wd,Wv,Zone,Tool\Wobj:=Wobj;) Timer wieder lahm legen und dann über die übergebene Speeddata ermitteln.

Könntest aber nochmal die Doku durchschauen. Glaube unter Systeparameter (Outputs) gab es was mit Ausgabe des aktuellen TCP Speeds.
Ich glaube aber die mathematische Funktion wäre die sauberste.

Gruß...

Gespeichert

„Herr, lass mich ein guter Mensch sein. Aber bitte nicht sofort.“
WolfHenk
Forenjunkie
********
Online Online

Geschlecht: Männlich
Beiträge: 1522


GIT d- s+:- a+ C++ UL+ P+ L+ E-- W++ !N !o !K w !O


WWW
« Antworten #8 am: 30. Mai 2008, 06:49:33 »

Audi Ingolstadt machts nur per Zeit.
Gespeichert

Wolfram (Cat) Henkel

never forget Asimov's Laws at the programming of robots...

"Safety is an integral part of function. No safety, no production. I don't buy a car without brakes."

http://www.xing.com/go/invita/5634410

PMs mit Anfragen wie "Wie geht das..." werden nicht beantwortet. Diese Fragen und die Antworten interessieren jeden hier im Forum.
http://roboterszene.de
rmac
Global Moderator
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 282


« Antworten #9 am: 30. Mai 2008, 08:25:26 »

@Robcheck01

Gar nicht so verkehrt. Bräuchte er also nur beim Start im MoveLArc
bei ArcL\On,Position,vSpeed,Sm,Wd,Wv,Zone,Tool\Wobj:=Wobj;
den Timer starten und beim stopen ( ArcL\Off,Position,vSpeed,Sm,Wd,Wv,Zone,Tool\Wobj:=Wobj;) Timer wieder lahm legen und dann über die übergebene Speeddata ermitteln.
Ich denke die Zeitmessung über den Interrupt (Arc-On/Off) ist da einfacher und eleganter, weil man dann genau die
Lichtbogen An/Aus-Zeiten hat und sich um Zonen, Vorlauf etc. keine Gedanken mehr machen muß.

Könntest aber nochmal die Doku durchschauen. Glaube unter Systeparameter (Outputs) gab es was mit Ausgabe des aktuellen TCP Speeds.
Jau, du hast Recht. TCP-Speed gibt's als Systemausgang, sollte man verwenden können...  supi

Gruß
rmac
Gespeichert
Robcheck01_MJ
Special Member
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 269



« Antworten #10 am: 30. Mai 2008, 11:52:15 »

@rmac

Hast recht, macht wohl am meisten Sinn es so zu machen.
Werd aber trotzdem nochmal wegen der Berechnung schauen, würde mich persönlich doch schon interesieren.

Mal sehen wie es AB_Rotech nun machst.

Gruß..
Gespeichert

„Herr, lass mich ein guter Mensch sein. Aber bitte nicht sofort.“
Seiten: [1] Nach oben Drucken 
Roboterforum für Industrieroboter Anwender  |  Industrieroboter Helpcenter  |  ABB Roboter (Moderatoren: burlibua, Sven Weyer, rmac)  |  Thema: Schweissung_Messen « 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