Beiträge von Flo

    Wenn die Routine die mit einem Trigger ausgeführt wird beim Erreichen des PTP-Punktes noch nicht vollständig abgearbeitet wurde (Warten auf Eingang), dann bleibt doch der Roboter an diesem Punkt stehen bis die Routine fertig ist! Das wäre doch genau die geforderte Reaktion, oder ist das nicht so?? Kann es im Moment leider nicht ausprobieren.

    Du kannst ja auch im Modul lokale Unterprogramme anlegen, diese sind dann auch nur in diesem Modul bekannt.


    z.B.


    Modulname: BMW.src


    Im Modul steht dann:


    DEF BMW()



    END


    DEF DGM_Einfahren()



    END


    DEF DGM_Ausfahren()



    END

    Definiere dir einfach ein paar PDAT, die du immer bei deinen Bewegungen verwendest


    PTP:


    langsam
    DECL PDAT PPDAT10={VEL 10.0,ACC 50,APO_DIST 50.0,APO_MODE #CPTP}
    mittel
    DECL PDAT PPDAT50={VEL 50.0,ACC 75,APO_DIST 50.0,APO_MODE #CPTP}
    schnell
    DECL PDAT PPDAT100={VEL 100.0,ACC 100,APO_DIST 50.0,APO_MODE #CPTP}


    LIN:


    langsam
    DECL LDAT LCPDAT10={VEL 0.10,ACC 30.0,APO_DIST 5.0,APO_FAC 50.0,ORI_TYP #VAR,CIRC_TYP #BASE,JERK_FAC 50.0}
    mittel
    DECL LDAT LCPDAT50={VEL 1,ACC 50.0,APO_DIST 5.0,APO_FAC 50.0,ORI_TYP #VAR,CIRC_TYP #BASE,JERK_FAC 50.0}
    schnell
    DECL LDAT LCPDAT50={VEL 2,ACC 100.0,APO_DIST 5.0,APO_FAC 50.0,ORI_TYP #VAR,CIRC_TYP #BASE,JERK_FAC 50.0}



    jetzt kannst du durch anpassen der PDAT bzw LDAT deine Geschwindigkeiten global verändern

    Hallo Martl


    Glaube auch, dass du nur diese eine Zeile anpassen musst.
    Doku findest du bei der IRC 5 Doku unter Anwendungshandbücher-> Feldbus Optionen -> DeviceNet
    ABB Hotline meinte diese gilt, mit geringen Abweichungen der Syntax, auch für die S4C+

    In der config.dat ein entsprechendes Signal und Variable definieren


    ; Vorgabe Verschiebung
    SIGNAL giVerschiebungX $IN[33] TO $IN[40]


    ;Verschiebung speichern
    INT nVerschiebung=0


    Im Programm zuweisen
    nVerschiebung=giVerschiebungX

    Variable ganz "normal" im Programm anlegen
    PERS num nXVerschiebung:=0;


    An gewünschter Stelle im Programm mit dem Befehl Verschiebung abfragen
    TPReadNum nXVerschiebung, "Verschiebung in X-Richtung eingeben";

    die Verschiebung in der Bewegung verarbeiten
    MoveL Offset(pPosition,nXVerschiebung,0,0), v50, fine, tGreifer\WObj:=wRahmenOrginal;


    oder direkt Werkobjekt verschieben in dem der Rahmen abgefahren wird
    In Werkobjekt wRahmenOrginal ist der Rahmen in Orginalposition vermessen
    ! Initialisieren
    wRahmenVerschoben:= wRahmenOrginal;
    ! Verschiebung
    wRahmenVerschoben.trans.x:=wRahmenVerschoben.trans.x + nXVerschiebung

    oder den oframe des Orginalwerkobjektes verschieben


    Bewegung
    MoveL pPosition, vlangsam, fine, tGreifer\WObj:=wRahmenVerschoben;

    fertig

    Hallo


    Motor entfernt -> offener Schaltkreis Temperatursensor


    Aus der Doku:


    Normalerweise wird ein Temperatursensor vom Typ PTC-Widerstand eingesetzt. Ein hoher
    Widerstand oder offener Schaltkreis bedeutet, dass die Motortemperatur höher ist als
    zulässig. Wenn kein Temperatursensor verwendet wird, muss der Schaltkreis überbrückt
    werden.


    Gruß

    Zum Beispiel am Anfang der Einfahrbewegung zur Waage eine boolsche Variable (bUeberwachen) auf TRUE setzen.
    Wenn du keine Taktzeitprobleme hast einen Fine-Punkt anfahren, um das Tarieren definiert und wiederholbar erledigen zu können. Ansonsten schau dir den Befehl MoveLSync mal an.
    Diese Variable kannst du in einem deiner Hintergrundtasks zur Aktivierung deiner Überwachung und/oder Tarieren benutzen.
    Bei Überschreitung deiner zulässigen Kraft den Roboter mit dem Befehl StopMove anhalten, Meldung ausgeben, etc.
    Schau dir einfach mal folgende Befehle an:
    MoveJSync (Starten deiner Überwachung bzw. gleich in der aufgerufenen Routine tarieren)
    StopMove
    StartMove



    Hoffe ich hab das einigermassen verständlich erklärt.
    Am einfachsten umzusetzen ist aber wahrscheinlich die Lösung mit Interrupt (ISignalAI)

    Hallo


    Du brauchst bei deiner WaitDi keinen Interrupt auslösen wenn MaxTime abgelaufen ist. Errorhandler würde auch reichen.


    z.B



    WaitDI diSignal,iCondition1\MaxTime:=nMaxTime\TimeFlag:=bTimeout;
    WaitDI diSignal,iCondition1;


    ERROR
    IF ERRNO=ERR_WAIT_MAXTIME THEN
    TPErase;
    TPWrite "Vakuum nicht erreicht" ;


    ETC.....


    TRYNEXT;


    ENDIF

    Führe LoadIdentify nicht in Auto sondern in Einrichtbetrieb 100% aus, dann bist du auch nicht von externen Signalen abhängig.