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.
Beiträge von Flo
-
-
Die einfachste Variante wäre die Übergabe entsprechenderFehlernummern an die SPS. Hierzu einfach einen Gruppenausgang verwenden!
-
So wie es aus deinem Code hervorgeht, sind wohl Interrupt 1 - 6 am Aufruf deiner Messroutinen beteiligt. Obwohl die Verwendung von Interrupt 3 eigentlich für den $Stopmess reserviert sein sollte (siehe Init im cell.src)
-
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
-
In Zeile 37 hast einen Tippfehler BASE_DATA[10]=BASE_DATE[2], sollte BASE_DATA[10]=BASE_DATA[2] heissen. Weiß nicht wie das ohne Syntaxfehler geht. Und ja, bitte config.dat posten
-
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
-
do01 wird wieder auf den Wert von di01 gesetzt!
keine Flanke nötig -
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+ -
Brücke an XS 7
siehe Anhang -
In der config.dat ein entsprechendes Signal und Variable definieren
; Vorgabe Verschiebung
SIGNAL giVerschiebungX $IN[33] TO $IN[40];Verschiebung speichern
INT nVerschiebung=0Im Programm zuweisen
nVerschiebung=giVerschiebungX -
Im Forum wurde dies zum Glück ja schon alles besprochen
Variablenanzeige
http://www.roboterforum.de/rob…riablenanzeige-gestalten/Base-Verschiebung
http://www.roboterforum.de/rob…hieben/msg43561/#msg43561 -
oh, sorry- Hast recht, bin gerade am ABB programmieren...
-
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 verschiebenBewegung
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ß
-
Kannst du auch das Projekt anhängen mit dem du die ldb erzeugt hast?
-
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
StartMoveHoffe ich hab das einigermassen verständlich erklärt.
Am einfachsten umzusetzen ist aber wahrscheinlich die Lösung mit Interrupt (ISignalAI) -
Hast Du Multitasking? Ansonsten kannst du dein Problem mit einem Interrupt lösen. Schau Dir mal im Handbuch die Instruktion ISignalAI an
-
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.
-
Ich weiß dass diese Möglichkeit wahrscheinlich zu einfach ist, aber über den Systemeingang SysReset kann der Roboter von der SPS neu gestartet werden.