Position des TCP eines RV-3SB über Ethernet ändern

  • Hallo alle zusammen!


    Ich bin neu hier in diesem Forum und habe eine grundlegende Frage zur Positionierung eine Mitsubishi RV-3SB Roboters (CR2B Steuergerät).


    Ich würde nämlich gerne in Abhängigkeit der Daten einer Bildverarbeitungssoftware die Position (X,Y,Z) , sowie die Orientierung (A,B,C) des TCP-ändern. Die Kamera die für die Bildverarbeitungssoftware eingesetzt wird soll dabei an dem elektrischen Greifer von Mitsubishi montiert sein. Das heißt also, wenn ich näher an das Bild heranfahren will,dann muss ich mich mit dem TCP nach vorne bewegen (unabhängig von der derzeitigen Orientierung).


    Die Kommunikation findet dabei via Ethernet statt mit den Befehlen aus dem Dokument "Protocol Connection with PC_ RS232 Ethernet" von Mitsubishi. Nun ist meine Frage, wie ich am besten die Positionierung des TCP löse. Mit meinem VB.net-Programm kann ich bereits Ports öffnen sowie auch Positionen auslesen, schreiben und die restlichen Steuerbefehle funktionieren auch.


    Mein erster Denkansatz zu diesem Problem ist:
    -Ich schreibe im ersten Schritt ein Melfa Programm das nur die Fahrgeschwindigkeit und eine anzufahrende Position enthält.
    -Von meinem Programm aus würde ich dann die dem Progamm zugehörige XYZ-Position editieren (Programm laden, Position ändern, schließen und wieder speichern)
    -Dann das Programm aufrufen, so dass die neue Position angefahren werden kann.


    Wenn ich es jetzt aber richtig verstanden habe, kann ich ja nicht direkt die Position/Orientierung des TCP über die Steuerbefehle ändern sondern kann nur die XYZ-Koordinaten ändern. Wie müsste ich dann denn am besten vorgehen um diese Koordinaten dementsprechend zu berechnen(Koordinatentransformation mit Rotationsmatrizen) :denk:


    Ich hoffe mir kann jemand einen sinnvollen Rat zu diesem Problem geben. Vielen Dank auf jeden Fall schon mal in voraus für die Mühe!


    Gruß,
    Spider

    Einmal editiert, zuletzt von Spider ()

  • ANZEIGE
  • Hallo,


    mit dem Tool-Befehl oder einer Zuweisung an P_Tool kann man schon die aktuellen Toolkoordinaten ändern. Allerdings nicht in einer laufenden Bewegung.


    Eleganter ist es vermutlich mit Positionen zu rechnen. Der * Operator entspricht ja einer Matrixmultiplikation mit Positionen, so liefert etwa P_Curr * (0, 0, 10, 0, 0, 0) eine Position (in Weltkoordinaten) die vom TCP 10 mm in Tool-Z Richtung liegt.


    Grüße


    Urmel

  • Danke für das posten dieser einfachen Lösung. Ich hatte mir schon die Rotationsmatrizen für die Drehung im Raum um eine beliebige Achsen usw. rausgesucht aber deine Lösung ist natürlich wirklich trivial.


    Der nächste Schritt für mich wäre dann, dass ich P_Curr nicht mit festen Werten multiplizieren will, sondern diese durch Variablen ersetzen möchte die ich dann über die Ethernet-Kommunikation (Load=Programmname -> Val=Name der Variablen dessen Wert geändert wurde -> Programm wieder speichern).
    Wie oder besser gesagt wo definiere ich denn dann am besten meine Variablen, da diese nicht zur Laufzeit des Bewegungsprogramms geändert werden können.
    Dazu müssten also meiner Meinung nach die Variablen in einem anderen Programm global deklariert sein, so dass das Bewegungsprogramm dann auf diese geänderten Werte Zugriff hat. Zum Ändern würde ich dann also das "Koordinatenverschiebungsdaten-Programm" aufrufen, dort die Variablenwerte ändern und dann nach dieser Änderung das Bewegungsprogramm aufrufen.


    Also, lange Frage kurzer Sinn: Wie und wo müssen die Varariblen definiert sein, damit ich diese vor der Bewegung über Ethernet ändern kann?



    In freudiger Erwartung auf eine erneut so triviale Lösung ;),
    Spider

  • Wenn du dein Roboterprogramm nur lädst und nie startest, kannst du ja sowas machen


    Code
    1;1;EXECPTmp = P_Curr * (0, 0, 10, 0, 0, 0)
    1;1;EXECMvs PTmp


    Also einzelne Programmzeilen direkt aufrufen.


    Besser ist es aber, wenn das Roboterprogramm mit einer zweiten TCP-Verbindung mit Print und Input sich die Daten selber vom PC holt.


    Variablenwerte in laufenden Programmen ändern geht mit dem Protokoll auch, ist aber eher unüblich.

    Einmal editiert, zuletzt von Urmel ()

  • Ic denke der Vorschlag mit dem direkten ausführen der Programmzeilen fällt für mich weg, da ich ja nicht unbedingt nur eine Programmzeile ausführen will sondern primär die Distanz/Winkel der Bewegung ändern will.
    Das eigentliche Ziel ist es ja mich verinfahct gesagt einem Punkt zu folgen der sich verschoben hat. Der Regelalgorithmus prüft dahingehend immer die aktuelle Position und nähert sich mit kleiner werdenden Schritten dem Punkt an, so dass ich zu Begin bspw. 10mm Verfahrweg bis hin zu 0,1mm Verfahrweg für die fast finale Positiontionierung benötige. Dahingehend wollteich halt gerne die Werte für Distanz/Drehung variabel haben.


    Zur Zeit war es so gelöst (vielleicht werdet ihr jetzt schmunzeln weil ich um 7 Eken gedacht habe um ein Problem zu lösen) das ich Zeile im Quellcode des Programm überschieben hatte und dann vor der Ausführung des Programm geschaut habe wieviel Zeilen Quellcode enthalten sind und dann immer wieder mit Hilfe des State-Befehls geprüft habe in welcher Zeile er sich aktuell befindet. War die letze Zeile erreicht, bedeutete es das Ende der aktuellen Verfahrbewegung und mein Reglalgorithmus hat die nächste Bewegung "angestoßen".


    Ich denke diese Lösung würde sich dann auch durch die Kommuniktion über die zweite TCP-Verbindung lösen lassen oder?
    Welche Voraussetzung muss ich denn für diese Operationen erfüllen, da ich teilweise mit einem Latop oder mit Rechnern arbeite bei denen sehr viele Ethernet-Teilnehmer(Diagnosegeräte) vorhanden sind. Programmierumgebung ist dabei wie bereits im ersten Thread genannt Vb.net.


  • Welche Voraussetzung muss ich denn für diese Operationen erfüllen, da ich teilweise mit einem Latop oder mit Rechnern arbeite bei denen sehr viele Ethernet-Teilnehmer(Diagnosegeräte) vorhanden sind. Programmierumgebung ist dabei wie bereits im ersten Thread genannt Vb.net.


    Ich vermute mal du benutzt die TCP-Client Klasse in deinem VB-Programm. Dann legst du einfach eine zweite Instanz an und connectest mit einem anderen Port des Roboters. Wenn du mit der ersten Verbindung die 10001 verwendest, nimmst du mit der 2. z.B. die 10002 oder 10003.


    Eventuell ist es am besten den Beispielen aus dem Handbuch zu folgen und die 10003 zu nehmen. Die entsprechenden Einstellungen an den Parametern wie COMDEV oder CPRCE13 findest du dann im Handbuch.


    Zu den Details habe ich hier in anderen Postings schon genug geschrieben, das möchte ich nicht nochmal alles aufschreiben. Schliesslich gibt es sowas ja auch fertig, für die die es nicht selber machen wollen / können.
    http://www.battenberg.biz/content/DE/SW_RobCommand.html


    Den zusätzlichen Netzwerkverkehr auf deiner Leitung kannst du vernachlässigen, das bischen Text was da übertragen wird, fällt nicht weiter auf.

    Einmal editiert, zuletzt von Urmel ()

  • Erstmal danke für die schnelle Antwort. :supi:


    Du hattest auch recht mit deiner Vermutung das ich eine TCP-Klasse benutze. Also werde ich es demnächst (nach der Fertigstellung meines Regelalgorithmus) versuchen die zweite Instanz zu erzeugen und dann mit Print und Input zu arbeiten. Sollten dann noch weitere Fragen auftreten die sich nicht mit den anderen Treads und dem Handbuch beantworten lassen, werde ich mich nochmal melden.


    Gruß,
    Spider

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