Brauche Antwort von E2-Steuerung

  • Hallo,


    ich verwende den E2 in Kombination mit Bildverarbeitung und programmiere in Visual Studio 2008 C++. Die Verbindung zur Steuerung läuft über die serielle Schnittstelle. Ich habe nun das Problem, dass der Programmablauf nicht darauf wartet, bis der Roboter seine Position angefahren hat, sondern nachdem der Move-Befehl an die Steuerung gesendet wurde, werden die weiteren Codezeilen direkt weiter ausgeführt. Gibt es eine Möglichkeit von der Steuerung ein Feedback zu bekommen, wenn der Movebefehl ausgeführt wurde?? Denn erst wenn eine Bewegung vollständig abgeschlossen ist weiß ich, dass ein Bild aufgenommen werden kann.


    Vielen Dank im Voraus und viele Grüße
    Jens

  • ANZEIGE
  • Hallo,


    lang ists her, als ich zuletzt mit einem E2 gearbeitet habe war noch Visual C++ 6 aktuell ...


    Dein Problem ist mir daher nicht ganz unbekannt, es ist nicht so ganz einfach herauszufinden, wann eine Bewegung fertig ist. Bei der Netzwerkkarte, die es für diesen Roboter gibt, gab es tatsächlich einen Befehl womit man das testen konnte. Aber das hilft dir ja nicht weiter, die Dinger sind ausverkauft.


    Was ich in deinem Posting nicht ganz verstanden habe, ist ob du die Befehle einzeln zum Roboter schickst (ohne Zeilennummern), oder ob da ein Movemaster Programm läuft ?


    Wenn du den Bewegungsbefehl so sendest, könntest du solange mit WH abfragen wo der Roboter steht, bis sich die Position nicht mehr ändert bzw. der Zielposition entspricht.


    In einem Programm könnte man nach dem Bewegungsbefehl einen Wartebefehl (DLY in Melfa Basic, war das TI in Movemaster ?) setzen, der sollte eigentlich erst ausgeführt werden, wenn die Bewegung zu ende ist. Danach könnte man z.B. ein Ausgangsbit setzen und dieses (notfalls in dem man es über einen Eingang wieder hereinholt) abfragen.


    Hoffe das hilft dir etwas weiter.


    Grüße


    Urmel

    Einmal editiert, zuletzt von Urmel ()

  • Also ich lege erst die Position fest z.B.
    serialPort1->WriteLine("PD 1,"+NewPosString+Convert::ToChar(13));


    und dann wird der Move-Befehl ausgeführt:
    serialPort1->WriteLine("MO 1"+Convert::ToChar(13));


    Wenn ich nach dem Movebefehl versuche die aktuelle Position abzuholen (s.u.), wird eine Exception geworfen. Wenn der Roboter sich gerade nicht bewegt, funktioniert das abholen der aktuellen Koordinaten natürlich....
    s="WH"+Convert::ToChar(13);
    serialPort1->WriteLine(s);
    GetPosString_CR=serialPort1->ReadLine();


    Mache ich da irgendwas nicht korrekt?


    Viele Grüße
    Jens

    Einmal editiert, zuletzt von Jens81 ()

  • Ach ja, daran habe ich nicht gedacht. :wallbash:


    Ich glaube beim E2 war es so, dass er es nicht mag, wenn man ihn anspricht während er gerade etwas tut.


    Damit habe ich damals auch gekämpft, als ich ein Programm von einem E4 auf einen gebrauchten E2 umstellen musste. Nur leider kann ich mich nicht mehr genau erinnern wie ich das gemacht habe, eventuell habe ich einfach eine feste Zeit gewartet. Es ist halt neuneinhalb Jahre her. :denk:


    Auf dem E4 existiert das Problem nicht, man kann sogar wenn man mehrere WH hintereinander sendet sehen wie sich der Roboter bewegt. Bei den Netzwerkfunktionen für die E und EN Roboter gibt es einen Pakettyp "Movemaster Command Check" (ARC_CMD_M2CMDCK), mit dem man nachschauen kann, ob gerade ein Befehl aktiv ist.


    Aber ich meine mich zu erinnern, bei mir hätte damals der Roboter gepiepst, wenn man ihn während der Bewegung abfragt. Ist das bei dir auch so ? Was für eine Fehlermeldung enthält den die Exception ?


    Wenn du die Möglichkeit hast, z.B. über irgendeine preiswerte USB-Platine, Bits auf dem PC einzulesen, wäre es eventuell eine Alternative ein Roboterprogramm zu schreiben, also mehrere Zeilen mit Zeilennummer hintereinander senden, das ein Ausgangsbit löscht, die Bewegung ausführt, kurz wartet und dann das Bit wieder setzt. Starten würdest du es dann über den RN-Befehl. Dann würdest du in einer Schleife das Digitalinterface abfragen und auf das Bit warten ...


    Übrigens, auch in C++/CLI sollte man statt

    Code
    s="WH"+Convert::ToChar(13);


    einfach

    Code
    s="WH\r";


    schreiben können.


    Grüße


    Urmel

    Einmal editiert, zuletzt von Urmel ()


  • Wenn du die Möglichkeit hast, z.B. über irgendeine preiswerte USB-Platine, Bits auf dem PC einzulesen, wäre es eventuell eine Alternative ein Roboterprogramm zu schreiben, also mehrere Zeilen mit Zeilennummer hintereinander senden, das ein Ausgangsbit löscht, die Bewegung ausführt, kurz wartet und dann das Bit wieder setzt. Starten würdest du es dann über den RN-Befehl. Dann würdest du in einer Schleife das Digitalinterface abfragen und auf das Bit warten


    Da würde ich zur K8055 greifen http://www.velleman.be/ot/de/product/view/?id=351346
    Die ist im Internet durch den Einsatz in diversen Projekten in den gängigen Programmiersprachen gut dokumentiert.


    Ich werde mir wohl auch mal 1-2 Stück besorgen um die Kommunikation über DI und DOs simulieren zu können.


    Viele Grüsse

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