Emulation Mode

  • Hallo,


    ich programmiere im Rahmen meiner Bachelorarbeit unter der Verwendung der Software Adept ACE (Version 3.2.2.11)
    einen Quattro s650H. Zurzeit noch im Emulation Mode, da der Roboter leider noch nicht betriebsbereit ist.


    Momentan beschäftige ich mich mit den Befehlen für die Bildschirmausgabe, also TYPE und PROMPT. Der Befehl TYPE funktioniert auch ohne Probleme, aber mit dem PROMPT-Befehl habe ich ein Problem. Das Programm läuft einfach weiter, obwohl es auf eine Eingabe warten müsste.


    Beispiel:


    PROMPT "Zyklen?", zyklen


    Ich habe zyklen natürlich vorher auch deklariert.


    Also warum funktioniert der PROMPT-Befehl bei mir nicht???

  • ANZEIGE
  • Hallo Foxx,


    das ACE Monitor Fenster emuliert das frühere AdeptWindows Monitor Fenster, stellt allerdings nicht alle Funktionalität zur Verfügung. Für TYPE Befehle zum Debuggen ist es ok aber für Programmsteurung bzw. Werteeingabe würde ich es nicht nutzen. Insbesondere da es wenn es nicht explizit geöffnet ist die TYPE und PROMPT Ausgabe nicht durchführen kann und diese Befehle dadurch überspringen muss.


    Da du ACE nutzt kannst du z.B. ein Graphical User Interface Objekt einfügen und dir eine kleines GUI mit ein paar Mausklicks zusammenbauen.
    1. Ein eigener Ordner für das GUI ist übersichtlicher.
    Rechte Maustaste im Workspace Explorer und mit "New Folder" einen neuen Unterordner anlegen.
    2. User Interface Form Objekt hinzufügen.
    Rechte Maustaste "New -Program - User Interface Form".
    3. Ein Label hinzufügen welches als Text "Anzahl Zyklen ?" hat einfügen
    In der User Interface Form aus der "Toolbox" ein Label mit der Maus anklicken und auf die Form ziehen.
    Das Label anklicken und in den Properties unter "Appearance - Text" den Text "Anzahl Zyklen ?" eingeben.
    4. Ein Textfeld hinzufügen welches mit der V+ Variablen "Zyklen" verlinkt ist.
    In der User Interface Form aus der "Toolbox" ein Textfeld mit der Maus anklicken und auf die Form ziehen.
    Das Textfeld anklicken und in den Properties unter "Property Links - Item Text" dein "V+ Global Variables" Objekt anklicken und die Variable zyklen auswählen.


    Jetzt könnten wir die User Interface Form schon Kompilieren und Ausführen (Compile and Run) und sobald du einen Wert im Textfeld eingibst ändert sich auch der Wert in V+. Allerdings sollten wir das V+ Programm noch leicht modifizieren.
    Zum Beispiel:


    zyklen = 0
    DO
    WAIT
    UNTIL zyklen <> 0 ;hiermit warten wir darauf, dass im Textfeld ein Wert ungleich 0 eingegeben wird.


    roboter.zyklen = zyklen ;hat den Vorteil, dass sobald das Programm ausgefuehrt wird eine neue Eingabe im Textfeld unseren Schleifenendwert nicht veraendert
    FOR i = 1 to roboter.zyklen
    ;Roboterzyklus
    END



    Wenn du die User Interface Form noch etwas verschönern willst kannst du ein Start-Button hinzufügen.
    5. Ein Toggle Button hinzufügen welcher mit einer neuen V+ REAL Variablen start.roboter verlinkt ist.
    In der User Interface Form aus der "Toolbox" ein Toogle Button mit der Maus anklicken und auf die Form ziehen.
    Den Toggle Button anklicken und in den Properties unter "Property Links - Item Text" dein "V+ Global Variables" Objekt anklicken und die Variable "start.roboter" auswählen.


    Die User interface Form neu kompilieren und ausführen. Wenn du jetzt auf den Button klickst wird in V+ der Wert der Variablen start.roboter auf TRUE gesetzt. Wenn du loslässt wieder auf FALSE. Dein V+ Programm würde sich dann ändern in
    zyklen = 0
    DO
    WAIT
    UNTIL start.roboter == TRUE ; == TRUE kannst du auch weglassen wenn du moechtest


    roboter.zyklen = zyklen ;hat den Vorteil, dass sobald das Programm ausgefuehrt wird eine neue Eingabe im Textfeld unseren Schleifenendwert nicht veraendert
    FOR i = 1 to roboter.zyklen
    ;Roboterzyklus
    END



    Ich hoffe ich konnte dir weiterhelfen.



    Gruß und viel Spaß
    Sunny

  • Hallo,


    zunächst vielen Dank für deine Antwort Sunny. Ich habe deine Anleitung befolgt und besitze nun ein funktionsfähiges GUI, das den PROMPT-Befehl sozusagen imitiert.


    Nun habe ich noch ein paar weitere Fragen. Und zwar arbeite ich, wie vorher schon geschrieben, zurzeit im Emulation Mode und simuliere eine Pick and Place Aufgabe per 3D-Visualisierung. Leider stehen in der 3D-Visualisierung als Objekte nur Boxen und Zylinder zur Verfügung. Meine Frage ist jetzt, ob man vielleicht Objekte, die beispielsweise in Form von CAD-Daten zur Verfügung stehen, in ACE importieren kann. Dies interessiert mich sowohl für die Objekte, die gegriffen werden sollen, als auch für den Greifer selbst. Man kann sich zwar auch selbst einen Greifer generieren, dennoch würde gerne wissen, ob man einen fertigen Greifer integrieren kann.


    Außerdem möchte ich gerne wissen, ob es möglich ist, dass sich die Objekte, die gegriffen werden, von der Pick- zur Placeposition mitbewegen. Momentan kann ich halt nur über die Signale mitverfolgen, ob ein Objekt gegriffen oder abgesetzt wird.


    Mir ist klar, dass meine Fragen für die reine Programmierung eigentlich unnötig sind. Jedoch möchte versuchen, dass die Simulation optisch möglichst nah an den realen Versuchsstand rankommt.


    Im Voraus schon einmal vielen Dank für eure Hilfe!


    Gruß,
    Foxx

  • Hallo Foxx,


    ich befürchte viel kann ich dir hierbei nicht helfen.


    Mir ist zur Zeit keine ACE Version bekannt welches es erlaubt CAD Daten zu importieren.


    ACE erlaubt allerdings den Zugriff auf alle ACE Objekte per C# Scripting.


    Ich hab dir einen kleinen ACE Workspace angehängt. Darin findest du ein V+ Programm und ein C# "Programm". Compiliere das C# Programm aus ACE heraus und dann starte das V+ Programm. Du solltest beobachten können wie der Adept Cobra s600 Roboter einen Zylinder aufnimmt und ihn zu einer Ablageposition bringt. Nicht perfekt aber immerhin etwas 8)


    Gruß
    Sunny

  • Hallo Sunny,


    ich habe versucht deinen ACE Workspace so zu ändern, dass er für meinen Quattro s650H verwendbar ist. Leider bekomme ich jetzt, wenn ich das V+ Programm laufen lasse, im C# Programm die Fehlermeldung "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt". Der Programmablauf stoppt dann im V+ Programm "def.schritt" in Zeile 37. Ich habe zwar rausgefunden, dass dann wohl eine Variable null ist und nicht auf ein Objekt verweist, aber leider weiß gar nicht, wo ich im C# Programm suchen soll, da bei der Fehlermeldung keine Zeile angegeben wird.


    Außerdem habe ich das Problem, dass im meinen Testprogramm die Befehle DEPARTS und MOVES nicht mehr als V+ Befehle erkannt werden.


    Ich habe meinen Workspace mal angehängt. Vielleicht hast du ja einen Tipp für mich.


    Gruß
    Foxx

  • Hallo Foxx,


    der Syntax des MOVES und DEPARTS ist etwas anderst als der des APPROS. Oben im Programm ist der MOVES richtig geschrieben.


    MOVES position
    DEPARTS mm
    APPROS position, mm


    Der Fehler "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt" war gemein. :denk:
    Dein SmartController Objekt hatte am Ende ein Leerzeichen. In C# macht das leider etwas aus. Ich hab es auch erst gesehen nachdem ich das Objekt nochmal in den Script gezogen habe. Hier die richtige und die falsche Zeile (auskommentiert).
    //IQuattro650 quattro6501 = (IQuattro650) ace["/SmartController /R1 Quattro650"];
    IQuattro650 quattro6501 = (IQuattro650) ace["/SmartController/R1 Quattro650"];


    Ich hab dir den Workspace wieder angehängt.


    Gruß
    Sunny

  • Für alle Interessierten.


    Die aktuelle ACE Version 3.3.3.0 stellt den Emulationsmodus (Roboter und Kamera) kostenlos zur Verfügung und erlaubt den Import von CAD Daten in die 3D Ansicht (STL Format).


    Gruß
    Sunny

  • Hallo,
    das Thema ist zwar schon ein bisschen älter, aber ich probiere zur Zeit eine Simulation zu erzeugen, wo sich die Objekte bewegen.
    Ich habe auch schon die Workspaces ausprobiert, bekomme aber bei allen den gleichen Fehler
    "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt"


    Wenn ich das Workspace Bewegung_Box_2_neu öffne und das C- Program im Debug Modus kompiliere und starte springt er auf die Zeile


    IVPlusGlobalVariable varPlace1 =vPlusGlobalVariableCollection.GetVariableByName("place1");


    bzw.


    IVPlusGlobalVariable varPick1 =vPlusGlobalVariableCollection.GetVariableByName("pick1");


    Ich finde den Fehler hierbei leider nicht...
    Habe auch einen s650H
    ACE vers. ist 3.6.3.2


    Ich hoffe hier ist noch jemand aktiv der mir dabei helfen kann...


    Gruß
    pjoker22

    Einmal editiert, zuletzt von pjoker22 ()

  • So sollte es gehen:


    using Ace.Core.Server.Program;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using Ace.Adept.Server.Controls;
    using Ace.Adept.Server.Device;
    using Ace.Core.Server.Sim3d;
    using Ace.Adept.Server.Motion.Robots;
    using Ace.HSVision.Server.Parameters;
    using Ace.Core.Server;



    namespace Ace.Custom {


    public class Program {


    public AceServer ace;


    public void Main () {

    //IQuattro650 quattro6501 = (IQuattro650) ace["/SmartController /R1 Quattro650"];
    IQuattro650 quattro6501 = (IQuattro650) ace["/SmartController/R1 Quattro650"];
    IAdeptController contr = quattro6501.Controller;
    IBox box = (IBox) ace["/Box"];
    IIODrivenEndEffector iODrivenEndEffector = (IIODrivenEndEffector) ace["/SmartController/Gripper R1 Quattro650"];
    IVariableNumeric varSchritt = (IVariableNumeric) ace["/Numeric Variable Schritt"];

    IVPlusGlobalVariableCollection vPlusGlobalVariableCollection = (IVPlusGlobalVariableCollection) ace["/V+ Global Variables"];
    quattro6501.Parent = null;

    switch ((int) varSchritt.CurrentValue)
    {
    case 1:
    box.Visible = false;
    box.Parent = null; //keine Ahnung wie man einen Parent NULLen kann
    Transform3D transPick1;
    transPick1 = contr.Link.ListL("pick1");
    box.WorldLocation= transPick1;
    box.Visible = true;
    break;

    case 2:
    box.Visible = false;
    box.OffsetFromParent = new Transform3D(0,0,0,0,0,0);
    box.Parent = (ICartesianObject) quattro6501;
    box.Visible = true;
    break;

    case 3:
    box.Visible = false;
    box.Parent = quattro6501.Parent; //keine Ahnung wie man einen Parent NULLen kann
    Transform3D transPlace1;
    transPlace1 = contr.Link.ListL("place1");
    box.WorldLocation = transPlace1;
    box.Visible = true;
    break;

    }



    }
    }
    }


    Viele Grüße,
    -Pitl

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