Mitsubishi RV-M1 Befehlsfolge in C#

  • Hallo zusammen,


    bin neu hier und benötige mal eure Expertenmeinung.
    Nachdem wir den Roboter in Betrieb genommen haben, wollen wir mittels WindowsFormAnwendung über einen Button eine Befehlsfolge starten.


    Einzelbefehle lassen sich ohne Probleme absetzen.
    Wenn jedoch mehrere Befehle abgesetzt werden wollen, dann wird immer nur der erste Befehl ausgeführt.


    hier der Auszug aus dem Programmcode:


    private void sendButton_Click(object sender, EventArgs e)
    {
    try
    {

    serialPort.WriteLine("MJ -10, 0, 0, 0, 0");
    serialPort.WriteLine("MJ +10, 0, 0, 0, 0");


    }
    catch (System.Exception ex)
    {
    MessageBox.Show(ex.Message,"Error in sendButton_Click");
    }
    }


    Weiß grad echt nicht mehr weiter und häng schon mehrere Tage daran.


    Vielen Dank schon mal im Voraus für eure Hilfe


    Gruß David
    :danke:

  • ANZEIGE
  • Ich glaube diese alten Steuerungen können keine neuen Befehle verarbeiten, wenn noch ein anderer in Bearbeitung ist.


    Beim C++-Interface für den E2 bzw. E4 gab es eine spezielle Funktion mit der man abfragen konnte, ob die Steuerung bereit ist für den nächsten Bewegungsbefehl.


    Kannst du deine Befehle nicht mit Zeilennummern versehen und dann als Programm mit RN starten ?


    Grüße


    Urmel

  • Hallo :gutidee:


    Vielen Dank für deine super schnelle Antwort.
    Unser Problem ist damit vorerst gelöst.


    Aber ich denke, wir werden uns hier auf jeden Fall nochmal melden.


    Gruß David


    :supi:

  • So,


    haben uns wohl zu früh gefreut.


    Folgender Ablauf funktioniert ohne Probleme:


    serialPort.WriteLine("SP 2");
    serialPort.WriteLine("100 DW 50, 0, 0");
    serialPort.WriteLine("110 DW 0, 30, 0");
    serialPort.WriteLine("120 ED ");
    serialPort.WriteLine("RN 100");


    Wenn ich jetzt aber in der Programmabfolge mit einer Absolutposition (MP)
    bzw. mit einer Gelenkverfahrung (MJ) in Verbindung mit einer Relativbewegung anfahren möchte, bekomme ich den beliebten Piepston zu hören. :kopfkratz:


    Anbei ein Bsp dafür:


    private void Grundstellung()


    {


    serialPort.WriteLine("MP 0, 380, 300, -70, -40");
    serialPort.WriteLine("100 DW 10, 0, 0");
    serialPort.WriteLine("110 ED ");
    serialPort.WriteLine("RN 100");


    }


    Danke für eure Meinung zu meinem Problem


    Gruss David

  • Auf den ersten Blick würde ich sagen:



    Sonst kriegt er die Programmzeilen während er sich bewegt und das mag er nicht ...



    Wenn es das nicht ist, oder er MP nicht mit Zeilennummer mag, dann speichere die Position mit PD unter einer Positionsnummer (ohne Zeilennummer vor der Zeile) und fahre dann im Programm mit MO dahin.


    Oder warte bis das MP fertig ist, bis du die anderen Zeilen sendest.

    Einmal editiert, zuletzt von Urmel ()

  • Hallo Urmel,


    also den MP-Befehl mag er nicht in Kombination mit der Zeilennummer, haben es jetzt wirklich, wie von dir vorgeschlagen, mit PD gemacht.


    Jetzt kommt aber schon wieder ein kleines Problem:



    serialPort.WriteLine("201 GO");
    serialPort.WriteLine("202 TI 5");
    serialPort.WriteLine("203 MO 1");
    serialPort.WriteLine("204 GC");
    serialPort.WriteLine("205 TI 5");
    serialPort.WriteLine("206 MO 3");
    serialPort.WriteLine("207 ED ");
    serialPort.WriteLine("RN 201");


    Wenn ich diesen Code eingebe, schließt er zwar den Greifer, öffnet ihn allerdings danach sofort wieder, bevor er in Position 3 fährt, mit anderen Worten ausgedrückt, ich kann momentan nichts von A nach B mit geschlossenen Greifer heben.


    Danke für deine Hilfe


    Gruss


    DAvid

  • Da kann ich nur spekulieren. :denk:


    Bei Movemaster Command auf dem E2 und E4 war es so, dass zu einer Position auch der Greiferzustand gehörte. Wenn der Greifer offen war und man zu einer Position fuhr, die mit geschlossenen Greifer geteacht war, machte der Roboter den Greifer zu sobald, er sich dahin bewegte.


    Man brauchte die Greiferbefehle da fast gar nicht, dafür musste man die Greifpositionen in einer offenen und geschlossenen Variante vorhalten.


    Bin mir aber nicht sicher, wie das bei M1 war. :denk:


    Edit:
    Hab gerade mal ins Handbuch geschaut, man kann

    Code
    MO 1, O


    oder

    Code
    MO 1, C


    schreiben um bei der Bewegung den Greifer zu steuern.

    Einmal editiert, zuletzt von Urmel ()

  • Ja mit dem Befehl MO 1, C in Kombination mit einem TI Befehl hat das Problem gelöst, so dass ich jetzt Teile verschieben kann. Die Möglichkeit die Position mit geschlossenen Greifer zu speichern hätte ebenfalls zum Ziel geführt.:danke:


    Als nächster Aufgabenpunkt steht nun an, die aktuelle Position des Roboters zu bestimmen, um eventuelle Kollisionen mit dem TCP zu vermeiden.


    Ich habe dazu im Handbuch auch den Befehl WH (where gefunden). Des weiteren ist folgendes Codebsp für Basic im Handbuch beigefügt:


    10 Open "COM 1: 96010, E,7,2" AS#1
    20# Print #1, "WH"
    30 Line Input # 1, A$
    40 Print "Momentane Position = " ; A$
    50 END
    RUN
    Momenta Position = +10,0, +380,0, +300,0, -70,0, -40,0



    Wenn ich das jetzt abgewandelt in C# wie folgt schreibe, bekomme ich immer eine Timeoutüberschreitung (habe Timeout verschiedene Werte probiert):


    serialPort.Write("WH"); // serialPort.WriteLine selbes Ergebniss, serialPort.Open ist ja nicht nötig da eh schon an
    textBox1.text = serialPort.ReadLine();


    Es scheint so, als ob ich vom Roboter nichts erhalten würde. Mache ich irgendwas falsch bei der Umlegung des Codes in C#? :kopfkratz:


    Gruss


    DAvid

  • Hallo Urmel,


    ich habe sowohl SerialPort.WriteLine als auch SerialPort.Write Befehl ausprobiert (zweiterer in Kombination mit \r) . Trotzdem bekomme ich keine Rückantwort, daran kann es also nicht liegen.

  • Bist du denn sicher, dass nichts zurückkommt ?


    Wird nach einem

    Code
    serialPort.Write("WH\r");
    Thread.Sleep(1000);
    textBox1.text = serialPort.BytesToRead.ToString();


    etwas anders angezeigt als 0 ?


    Wenn da eine Zahl größer als 0 steht, könnte es am ReadLine liegen, das erwartet Windows Zeilenumbrüche (die Zeichen "Carriage Return" (13) und "Line Feed" (10)), der Roboter arbeitet aber wahrscheinlich wie seine Nachfolger mit Unix Zeilenumbrüchen (nur CR).


    Andernfalls, kannst du mit anderer Software Daten vom Roboter lesen ? Vielleicht mit HyperTerminal (Bei Windows im Startmenu unter Zubehör) ? Wenn nein, ist dein Verbindungskabel ok ? :kopfkratz:

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