Schleifenprogrammierung in Rapid mit ABB-Roboter

  • Ist es möglich eine Art Schleife zu Programmieren?
    dass der Roboter einige male auf und wieder ab fährt, dann eine neue position 5mm weiter anfährt, dort die selbe Bewegung macht usw usw...
    Ich muss eine Kraftmessplatte validieren. Sie ist ca. 80x50cm groß und ich soll in 5mm Abständen messen...
    ich finde nichts dergleichen in den Handbüchern


    Danke für eure Hilfe

  • ANZEIGE
  • Hallo TEG,


    also Möglichkeiten gibt es da bestimmt mehrere.


    Ich weiß ja nicht wie dein Programm aufgebaut ist, aber so könnte man es machen.


    zB.


    VAR num nRepeat:=10; deine Wiederholrate
    PERS num nMaxCount:=10;
    PERS num nCount:=0;
    PERS num nVersX:=20; Verschiebung X Richtung
    PERS num nVersY:=10; Verschiebung Y Richtung
    PERS num nAktVersX:=0; Aktuelle Verschiebung X Richtung
    PERS num nAktVersY:=0; Aktuelle Verschiebung Y Richtung




    PROC main ()
    !
    nCount:=1;
    nAktVersX:=nVersX;
    nAktVersY:=nVersY;
    !
    WHILE nCount<=nMaxCount DO
    !
    rProgramm1:
    Incr nCount;
    nAktVersX:=nVersX*nCount;
    nAktVersY:=nVersY*nCount;
    ENDPROC


    PROC rProgramm1()
    FOR i FROM 1 TO nRepeat DO
    MoveL Offs(pTest,nAktVersX,nAktVersY,50),vTest,z1,tAktuell\WObj:=wAktuell;
    MoveL Offs(pTest,nAktVersX,nAktVersY,0),vTest,z0,tAktuell\WObj:=wAktuell;
    MoveL Offs(pTest,nAktVersX,nAktVersY,50),vTest,z1,tAktuell\WObj:=wAktuell;
    ENDFOR
    ENDPROC


    Wie gesagt Möglichkeiten gibt es da einige.
    Hoffe konnte dir helfen.


    Gruß..

  • Hi,


    du musst auch die Position verschhieben.


    Befehlbeispiel:


    so in der Art könnte es aussehen


    MfG heini

  • Hi,
    kreativ gesehen gibt es da viele Ansätze. Grundsätzlich würde ich mich aber dem System von Robcheck01 anschließen.
    Warum heini0707 hier mit ExitCycle und GOTO handtieren muss ist mir nicht klar. Aber das muss jeder selber wissen wie er seine Programme aufbaut. Bin bis jetzt bei all meinen Anlagen ohne diese Sachen ausgekommen. Und muss dazu sagen so ganz schick ist das nicht. Aber muss jeder für sich selber entscheiden.


    Du kannst über Variablen und die Funktion "Offs" oder "RelTool" jede Position beliebig verändern ohne das Du die grundlegenden Daten Deiner ursprünglichen Position anfassen musst. Und über While-Schleifen hast Du ja im Prinzip schon Deine Schleife als Funktion im Rapid.Syntax hinterlegt. Also kein Grund hier mit ExitCycle oder Goto rumzueiern.


    Denke das sollte Dir helfen.


    robotic74

    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!

  • Warum heini0707 hier mit ExitCycle und GOTO handtieren muss ist mir nicht klar. Aber das muss jeder selber wissen wie er seine Programme aufbaut. Bin bis jetzt bei all meinen Anlagen ohne diese Sachen ausgekommen. Und muss dazu sagen so ganz schick ist das nicht. Aber muss jeder für sich selber entscheiden.


    robotic74


    Vielleicht hat heini ja bisher Fanuc oder sowas programmiert, da geht es nicht anders.
    Ich mag ABB :beerchug:

  • Hi stromer,
    jo ich mach auch FANUC und mit FANUC ist diese nur über Karel möglich so etwas galant über die Hochprache möglich. Ansonsten ist doch FANUC tp eine simple-Programmiersprache. Also nicht vergleichbar mit ABB. Aber wenn ich soetwas zur Verfügung habe mache ich doch nicht einfach auf prähistorisch oder? Bin doch auch nur Faul und möchte mit so wenig aufwand wie möglich es übersichtlich gestalten und da würd mir bei ABB im Traum nicht einfallen so etwas so zu machen. Naja wie schon gesagt muss jeder selber wissen wie er es macht.


    FANUC ist FANUC und ABB ist ABB, Wollen doch hier nicht Apfel mit Birnen vergleichen oder? :zwink:


    robotic74

    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!

  • Also ich sitz jetzt seit weit über 20 Jahren an irgendwelchen Computern rum und programmiere. :uglyhammer_2:
    Und alles, was ich gelernt habe, ist daß GOTO ein Befehl ist, den man selbst im Notfall nicht verwenden soll. :aufsmaul:
    Wer GOTO und PULSE programmiert, der... :bawling:
    ...macht mich sprachlos. :shock: Und das will bei mir was heißen. :genau:


    :beerchug:

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


    Messages und Mails mit Anfragen wie "Wie geht das..." werden nicht beantwortet.

    Diese Fragen und die Antworten interessieren jeden hier im Forum.


    Messages and Mails with questions like "how to do..." will not be answered.

    These questions and the answers are interesting for everyone here in the forum.

  • ok...das sind ja viele vorschläge...
    ich hab mich für den von"Robcheck" entschieden.
    der hatte das schönste bsp...ich muss aber auch gestehen dass ich das erste mal an einem roboter arbeite und die Handbücher nicht so ganz das wahre sind um sich selber einzuarbeiten.
    es gibt im moment noch ein problem. im folgenden abschnitt nimmt er das PERS nicht.


    VAR num nRepeat:=10; deine Wiederholrate
    PERS num nMaxCount:=10;
    PERS num nCount:=0;
    PERS num nVersX:=20; Verschiebung X Richtung
    PERS num nVersY:=10; Verschiebung Y Richtung
    PERS num nAktVersX:=0; Aktuelle Verschiebung X Richtung
    PERS num nAktVersY:=0; Aktuelle Verschiebung Y Richtung


    er bringt mir immer die Fehlermeldung:
    Fehler 136 : Syntaxfehler:Unerwartet: 'pers'


    Ist das nur der falsche "Datentyp" ??

  • Hi TEG,
    sorichtig kann ich nicht deuten was Du meinst. :kopfkratz:
    Kommt darauf an in welcher Zeile er Dir das meldet. Er gibt immer Zeile und Spalte an in welcher Dein Syntaxfehler aufgetreten ist. Wenn Du Dein Modul od. Programm lädst gibt er Dir die Position an wo Dein Problem sich befindet. An Deinem Ausschnitt aus dem Programm kann man nichts erkennen. Und die Hälfte der Fehlermeldung bringt uns auch nicht weiter. :huh:


    Gib bitte mehr Infos wenn jemand Dir helfen soll.


    robotic74

    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!

  • Hi,
    also wir haben das Programm jetzt mal so weit verändert.....mit eigenem Werkobjekt....


    MODULE MainModule


    PERS wobjdata wPlatte := [FALSE,TRUE,"",[[0,0,0],[1,0,0,0]],[[1468.33,-253.438,-13.7974],[0.999991,0.00160308,-0.00194846,0.00329643]]];
    CONST speeddata vTest := [75,75,75,75];


    VAR num nRepeat:=10; !Wiederholrate


    PERS num nMaxCount:=10;
    PERS num nCount:=0;
    PERS num nVersX:=20; !Verschiebung X Richtung
    PERS num nVersY:=10; !Verschiebung Y Richtung
    PERS num nAktVersX:=0; !Aktuelle Verschiebung X Richtung
    PERS num nAktVersY:=0; !Aktuelle Verschiebung Y Richtung




    PROC main ()


    nCount:=1;
    nAktVersX:=nVersX;
    nAktVersY:=nVersY;


    WHILE nCount<=nMaxCount DO


    rProgramm1:
    Incr nCount;
    nAktVersX:=nVersX*nCount;
    nAktVersY:=nVersY*nCount;
    ENDWHILE
    ENDPROC


    PROC rProgramm1()


    FOR i FROM 1 TO nRepeat DO
    num pTest:={500,500,0};
    MoveL Offs(pTest,nAktVersX,nAktVersY,50),vTest,z1,tAktuell\WObj:=wPlatte;
    MoveL Offs(pTest,nAktVersX,nAktVersY,0),vTest,z0,tAktuell\WObj:=wPlatte;
    MoveL Offs(pTest,nAktVersX,nAktVersY,50),vTest,z1,tAktuell\WObj:=wPlatte;
    ENDFOR


    ENDPROC
    ENDMODULE


    ....soweit sogut
    jetzt die letzte Fehlermeldung...Sie wird mir so angezeigt....und ich weiß nicht was für ein "identifier"


    Programm wurde geändert.
    Programm wird auf Fehler überprüft...
    10.33.28.66/T_ROB1/MainModule (35) : Fehler 135 : Syntaxfehler. : Erwartet: identifier


    So steht's bei mir dran und ich werd daraus net schlau


    TEG

  • Hi TEG,
    schau mal in Zeile 35!
    num pTest etc.
    was möchtest Du da machen?


    robotic74

    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!

  • Ganz vorsichtig gesagt...meine senkrechte bewegung??? :roll:
    von oben nach unten und wieder zurück???
    würde ich jetzt mal mutmaßen.
    das problem ist, dass sich hier echt niemand mit dem roboter auskennt und bis jetzt hier immer nur mit Punkte anfahren gearbeitet wurde...und dadurch irgendwelche bewegungen simuliert wurden. aber bis ich das so fertig progarmmiert hätte wäre ich wohl schon in rente..
    ich mach das jetzt erst ne woche...sprich mein wissen ist noch etwas...dünn... :(

  • Hi TEG,
    also wie steht Dein Werkobjekt?
    Wenn Z die Auf-bzw. Abwärtsbewegung ist würde ich doch einfach eine Variable in die Offs-Funktion einbinden und diese Variable dann entsprechen Ändern wie X und Y, oder? Aber wenn Z Deine Auf- bzw. Abwärtsbewegung ist hast Du doch schon die Bewegung in der Offs-Funktion. Schau Dir mal den dritten Wert an. 50 bzw. 0.


    robotic74

    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!

  • Hallo TEG,


    wenn ich Dein Programm richtig verstehe, möchtest Du in Zeile 35 Deiner Position pTest sowas wie einen Startwert zuordnen. So wie Du es geschrieben hast, ist es eine "halbe" Deklaration und funktioniert deshalb nicht. Eine Positionsvariable ist eine Zusammensetzung aus mehreren Informationeteilen. Wenn Du auf einen speziellen Teil (z.B.: xyz) zugreifen möchtest musst Du das so machen: pTest.trans:={100,200,0} oder einzeln: pTest.trans.x:=100.
    Wie sich das alles zusammen setzt ist in der Doku eigentlich ganz gut erklärt (Datentypen).


    Aber zurück zu Deiner FOR-Schleife:
    Wenn der Robbi die Positionen verschieben soll, dann musst Du die Offsets auch mit Deinem Schleifenzähler verrechnen. Z.B. so:


    FOR i FROM 1 TO nRepeat DO


    MoveL Offs(pTest,nAktVersX*(i-1),nAktVersY,50),vTest,z1,tAktuell\WObj:=wPlatte;
    MoveL Offs(pTest,nAktVersX*(i-1),nAktVersY,0),vTest,z0,tAktuell\WObj:=wPlatte;
    MoveL Offs(pTest,nAktVersX*(i-1),nAktVersY,50),vTest,z1,tAktuell\WObj:=wPlatte;
    ENDFOR


    Wenn Du in Y auch schieben willst dann musst Du um die i-Schleifen noch eine j-Schleife legen und den y-Offset mit verknüpfen.


    Gruß
    Stromer

  • Hi,
    ich dachte Du möchtest auf einer Stelle mehrmals hoch und runterfahren und nach einer bestimmten Anzahl eine Positon weiterfahren und dort ebenfalls mehrmals hoch und runterfahren.
    :kopfkratz:
    Habe ich das jetzt falsch verstanden? :shock:


    robotic74

    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!

  • So, hatte grad etwas Zeit, deshalb hier ein etwas weiter ausgefeiltes Programm:


    MODULE MainModule


    PERS wobjdata wPlatte := [FALSE,TRUE,"",[[0,0,0],[1,0,0,0]],[[1468.33,-253.438,-13.7974],[0.999991,0.00160308,-0.00194846,0.00329643]]];
    CONST speeddata vTest := [75,75,75,75];


    CONST num nRepeat:=5; !Wiederholungen drücken
    CONST num nRepeatX:=9; !Wiederholungen X
    CONST num nRepeatY:=15; !Wiederholungen Y


    PERS num nVersX:=5; !Verschiebung X Richtung
    PERS num nVersY:=5; !Verschiebung Y Richtung




    PROC main ()


    rProgramm1;
    ENDPROC


    PROC rProgramm1()
    !*Schleife für Y-Richtung
    FOR j FROM 1 TO nRepeatY DO
    !*Schleife für X-Richtung
    FOR i FROM 1 TO nRepeatX DO
    !*Startposition oberhalb Punkt
    MoveJ Offs(pTest,nVersX*(i-1),nVersY*(j-1),50),vTest,z1,tAktuell\WObj:=wPlatte;
    !*Position auf Platte
    MoveL Offs(pTest,nVersX*(i-1),nVersY*(j-1),0),vTest,fine,t0Aktuell\WObj:=wPlatte;
    !*Drückwiederholungen
    FOR k FROM 1 TO nRepeat DO
    MoveL Offs(pTest,nVersX*(i-1),nVersY*(j-1),50),vTest,z0,tAktuell\WObj:=wPlatte;
    MoveL Offs(pTest,nVersX*(i-1),nVersY*(j-1),0),vTest,fine,tAktuell\WObj:=wPlatte;
    ENDFOR
    MoveL Offs(pTest,nVersX*(i-1),nVersY*(j-1),50),vTest,z10,tAktuell\WObj:=wPlatte;
    ENDFOR
    ENDFOR


    ENDPROC
    ENDMODULE


    Damit sollte eigentlich schon die komplette Platte abgefahren werden können, vorausgesetzt das Werkobjekt ist passend zur Platte vermessen (lange Seite ist Y-Richtung) und der pTest liegt ziemlich nahe am Ursprung des Werkobjekts.


    Gruß
    Stromer

  • Hi,


    ich will mich ein wenig verteidigen.


    So wie ich es programmiert hab, versteht es jeder Lumpenseckel (TEG, soll nicht in deine Richtung gehen) ein IF-Befehl ist ein IF-Befehl, denn versteht jeder, der irgendwannmal programmiert hat.
    Ich schreibe grundsetzlich meine Programme mit viel Kommentar und versuche die so verständlich wie möglich aufzubauen, so dass der Kunde auch selbst eine Programmänderung vornehmen kann.


    Für mich ist wichtig, dass der Kunde so selten wie möglich mich belästigt, wenn er irgend ein Fur... ändern will.
    So wie WolfHenk dass programmiert, in KAREL die ganze Logik, rennt der Kunde immer zu ihm und wenn der WolfHenk irgend wo in "Timbucktu" sitzt kann dem Kunden nicht geholfen werden.


    So bin ich in der Lage auch wenn der Gesprächspartner auf ander Seite des Telefonkabels ein Depp ist, trotzdem einiger masen dem erklären kann wie die Karre zum Laufen gebracht werden kann.


    Mag sein dass der eine oder andere den GOTO-Befehl nicht mag, aber ist halt Ideotensicher (ich meine mich) funktioniert immer, kannst immer noch ELSEIF einfügen, wenn der Ablauf geändert werden soll, ich magsssssssss :)


    MfG heini

  • Hi,


    apropo Verteidigung, wenn man sein Beitrag nachträglich manipuliert, steht der jenige der seinen vor der Änderung geschrieben hat, wie ein Depp da (siehe mich an), Der Zweite Beitrag hat noch gar nicht so ausgesehen, zu dem Zeitpunkt wo ich meinen geschrieben hab.
    Ich finde mann sollte EDIT Button nur zu korrektur Zwecken nutzen und nicht nachträglich das verstendene Problem klauen und bisschen schöner ausschreiben. So wie es jetzt gelaufen ist :down:


    Übrigens meine Lösung wa gar nicht gedacht als Schlüsselfertig sondern sollte einen Gedankenstoss geben.


    So jetzt fülle ich mich auch besser, ausgeweint und gut.


    Ich finde auch gut bei einigen Foren die Anzeige geändert am...


    MfG heini

    Einmal editiert, zuletzt von heini0707 ()

  • Hi heini0707,
    also ich habe neulich mal einige Programme mit so einer Programmstruktur in die Hände bekommen. Und ich muss sagen die Übersicht leidet ganz schön darunter. Ich meine ich kenne das vom FANUC her auch. Aber dort ist es nur mit äußerster Diziplin und Struktur möglich mit den JMP LBL und LBL's annähernd eine Übersicht zu behalten. So ging es wenigstens mir. :kopfkratz:
    Naja wie auch immer jeder soll ja schließlich glücklich werden.


    Also bis denne


    stromer: mit Deiner Version sollte TEG eigentlich klarkommen.


    robotic74


    P.S.: Ach heini0707 ich weiß garnicht warum Dich das jetzt so fuchst. Grundsätzlich ist doch wichtig das Du Deinen Jobs magst. Ob mit GOTO oder ohne ist doch wurscht. :beerchug:

    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!

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