Programmzeiger anhalten und auf Bewegungszeiger warten?

  • Gibt’s ein Befehl um den Programmzeiger anzuhalten und auf den Bewegungszeiger zu warten bzw zu sagen warte so lang das Bewegungszeiger sich nur noch eine Zeile hinter Programmzeiger befindet?


    Ich weiß das es so was von KUKA gibt, gibt’s das dann bei ABB auch?


    Grüße

  • ANZEIGE
  • Was möchtest du denn machen?
    Ansonsten mal den Befehl: WaitUntil \InPos, TRUE \MaxTime:=0.2; anschauen, vielleicht hilft der dir.
    Oder den Befehl: MoveLSync pLaserP1CA207Togp10, v1000, z5, tool1,"setTeilpruefSperr";
    Dort kann man Programme mit der Bewegung aufrufen.
    Und es gibt noch die Trigger Funktion von ABB.

  • Das sind aber alles Befehle die den Roboter erst mal anhalten lassen oder seh ich das falsch?
    Worin ist eigentlich der Unterschied zwischen WaitRob und \inPos?
    Möchte dies verwenden um abzufragen ob eine Kollisionszone frei ist…


  • Möchte dies verwenden um abzufragen ob eine Kollisionszone frei ist…


    Mit dem Thema ärgere ich mich gerade auch wieder rum. Der Robbi steht im Sägeschnitt und wartet auf die Zone, wobei der Wartebefehl mit der Bedingungsüberprüfung erst programmiert ist, wenn die Sägebahn komplett beendet ist.
    Mit MoveLSync oder MoveJSync würde es vielleicht gehen, aber da wird es wieder hässlich mit der Parameterübergabe...


    Grüße,
    Michael

  • Triggersignal im Movebefehl und dann in der Interruptroutine ein WaitDI bis Kollisionszone frei wäre ja auch möglich oder täusch ich mich da?
    Oder sind Trigg + Interrupts zu unsicher?

  • Für Trap-Routinen gelten ja auch wieder ganz andere Einschränkungen, aber prinzipiell geht das. Man hat dann sogar noch extremere Möglichkeiten, weil man den Interrupt auf die fallende Flanke setzen kann und den dazugehörigen virtuellen DO mit einer definierten Zeit pulst und solche Scherze... steigt nur keiner mehr durch.
    Wobei mir die Interruptverarbeitung beim ABB genauso suspekt ist wie der Vorlaufzeiger. Beim KUKA kannste 'ne Priorität festlegen, beim ABB geht das nicht, da werden die Interrupts in einem Stapel gespeichert und nacheinander abgearbeitet. Das heisst, wenn gerade zu der Zeit ein anderer Interrupt aktiv ist, wird der für die Zonenfreigabe erst ausgewertet, wenn der andere fertig ist.


    Grüße,
    Michael

  • genau das war auch ein Grund wieso ich mich gegen Interrupt entschied hab.
    Und per Handshake hast die gefahr das nach einem Programmabbruch man irgendwo festsitzen könnte so das er gar nicht mehr weiter fährt...

  • Na ja, da kann man sich ja Notausgänge programmieren. Man muss nur dran denken... blöd, wenn der Kunde anruft, weil sich der Roboter kunstvoll selbst blockiert.


    Es kommt bei der Herangehensweise vielleicht auch darauf an, welches Ziel man verfolgt:
    1.) der Roboter soll so schnell wie möglich und am besten unterbrechungsfrei eine Bahn fahren, deren Freigabe erst im allerletzten Moment erfolgt
    2.) der Roboter soll nicht in einen Bereich einfahren, der durch eine externe Bedingung im allerletzten Moment verboten wird.
    3.) beides


    Für den zweiten Fall kann man sich notfalls eine programmtechnische Abfrage machen, die nicht vollständig synchron arbeitet, jedoch zusätzlich am Programm vorbei mit Weltzonen arbeiten bzw. mit Systemeingängen oder so etwas. Falls etwas schief geht, stoppt die Anlage dann halt hart. Der erste Fall ist einfach nur lästig, geht aber nur im Programm.


    Was die Interrupts angeht, habe ich in der Praxis allerdings selten Probleme gehabt. Im "normalen" Programmablauf verwende ich Interrupts nicht so oft, dass sich da was überkreuzen könnte.


    Grüße,
    Michael

  • Dragon
    Hast du Multitasking auf dem System?
    Dann geht das durch einen 2ten Task. Wenn deine Abfrage nicht zu Zeitkritisch ist.
    Dann halt schauen, dass die Weltzonen passen oder einen Punkt teachen der Überschliefen wird und in diesem Punkt einen Simulieren Ausgang setzen.


    Wobei du immer noch nicht genau geschrieben hast, was du machen willst. Vielleicht kommen dann schon die passenden Ideen. Geht es um die Freigabe für die Fahrt in eine andere Maschine? Da reicht ein Waituntil aus. Da wäre auch der Satzvorlauf nicht schlimm. Oder um die Freigabe vom Roboter an eine andere Maschine. Dann kannst du das auch über die Weltzonenfunktion machen.
    Oder willst du nur den Roboter anhalten können, falls die Arbeitsraumfreigabe der anderen Maschine weggeht. Das habe ich immer über einen 2ten Task gelöst. Weil ich bei den Interrupter beim ABB auch öfters das Problem hatte, dass die nicht so auslösen wollten, wie ich es gerne hätte.

  • Ja Multitasking hab ich, daran hab ich auch schon gedacht, vielleicht wirds das auch...


    Also was ich vor hab, folgender Fall:
    Ich fahr mit meinem Robi + Teil im Greifer auf Position
    Leg Teil ab. Und fahr aus Kollisionsbereich, um das nächste Teil zu holen.
    Währendessen wird das Eine Teil bedruckt und danach von einem Portal abgeholt.
    Zwischen Druckvorgang und Portal abholen bekomm ich kurzzeitig eine Kollisionsfreigabe von der SPS. Also könnte in diesem Moment der Vorlaufzeiger weiter springen und mein Robi würde auf Kollision fahren…
    Aus Zeitgründen muss ich mich wahrscheinlich schon auf die Position „Teil ablegen“ fahren bevor das teil vom Portal abgeholt ist.
    Ich weiß allerdings noch nicht wie der Ablauf später wirklich sein wird da wir noch nicht am optimieren sind. Also könnte es sein der Robi muss jedes Mal auf die Kollisionszone warten bzw halten, könnte aber auch sein nur bei jedem 5.Teil oder auch gar nicht.


    Was ich noch gefunden hab ist der Befehl TriggCheckIO, was mir hier zwar nicht gefällt ist das der Roboter immer wenn er keine Freigabe hat, so schnell als möglich hält.
    Wenn das später nicht im Dauerbetrieb sein sollte, dann wäre dies ja ok, da es eine Ausnahmesituation ist.


    Da ihr jetzt meine Siuation genauer kennt, hat noch wer eine idee ;)
    Danke für eure Hilfe!


    Grüße!

  • Hallo Zusammen,


    @ Dragen:
    Eins vorab....Beim ABB ist der Vorlaufzeiger immer eine Position weiter als der Bewegungszeiger.
    Du musst nicht den Robi anhalten lassen um danach ein Signal abzufragen. Der Punkt vor der Abfrage kann überschliffen werden.


    !Bewegung zum Teil mit z200
    MoveJ pVPKonsole, vZwBewVoll, z200, tGreifer;
    !Signal abfragen
    WaitMsgDi diFrgAufnahme, high,sM_FrgAufnahme\nFehlerNr:=10;
    !Wenn Freigabe dann in Bereich setzen
    Reset doAusserBerAufnahme;
    !und Interrupt mit der Freigabe aktivieren
    IWatch intFreigabeAufn;


    Also wenn dein Freigabesignal schon vor der Bewegung 1 ist bleibt der Robi nicht stehen alles wird in der Bewegung durchgeführt.
    Wenn das Signal nicht 1 sein sollte bleibt der Robi bei pVPKonsole stehen und wartet auf das Signal.
    Je nach dem wie der aktuelle Ablauf in der Anlage ist bleibt der Robi stehen oder er läuft ohne Stopp durch.
    Im Interrupt machst du einen StopMove und wartest auf das Signal danch gehts weiter.
    Gruß Paulaner

    Für seine Arbeit muß man Zustimmung suchen, aber niemals Beifall.<br />Zitat: Charles-Louis Baron de Montesquieu


  • Und auch wenn der nur einen Bewegungsablauf vorrausspringt hab ich ja den Nachteil das er bei nem true Signal über den Waitbefehl springt und schon wieder an der nächsten Bewegung klebt.


    Zu deinem Code, du arbeitest dann ohne Kollisionszonen?!


    Ich arbeite im Moment eben mit solchen Zonen. Mein Signal wird dann erst zurück gesetzt wenn ich in der Zone bin, das bedeutet ich geb keine „Vorwarnung“ an die SPS das ich jetzt rein fahre. Auf das würd ich auch gern verzichten, aus dem Grund das wenn der normale Vorgang mal abgebrochen wird, man sich da dann irgendwo vielleicht do aufhängt…


    Versuch mich gerade am TriggCheckIO, also quasi eine doppelte Abfrage:



    !Der Punkt vor der Zone
    TriggJ \Conc, p34_Zw_T1, vSchnell, td_nIstPos34, z200, tGreifer;
    TPLastWriteSave "Warte das CollZone 2 frei ist";
    !Im Regelfall wartet der Roboter dann hier
    WaitDI PLC_di_CollZone2,1;
    !Falls das Signal noch mal weg gehen würde und ich noch nicht in der Zone bin, würde ich jetzt mit einem TriggCheckIO den Eingang erneut abfragen(100mm nach dem Startpunkt bzw kurz vor der Kollisionszone)
    TriggJ \Conc, p35_Zw_T1, vSchnell, td_nIstPos35 \T2:=td_CheckCollZone2 \T3:=td_MsgCollZonePassed, z200, tGreifer;
    !Entweder fährt der Robi weiter oder er wird per QuickStop über den Trigger angehalten und wartet dann innerhalb einer Interruptroutine auf die weiterfahrt. Vorteil das Anhalten wird vom Trigger selbst ausgeführt, also kein warten auf Interrupt, Nachteil ich hab ein Quickstop was im Normal betrieb ja nicht erwünscht ist...


    Zusätzlich Frag ich in einer extra Task meine Kollisionszonenbits ab, sobald das Bit von der SPS und dem Roboter null ist, Stopp ich den Roboter und entfern mein Programmzeiger aus der Bewegungstask. Das entfernen mach ich damit ein Wiederanlauf durch ein „versehentlichen“Startmove verhindert wird.


    Wie wird eigentlich das ganze beim MoveJSync bearbeitet, das wird ja laut Beschreibung auch auf Trap ebene abgearbeitet und ist eine Mischung aus TriggInt und TriggJ. Also heißt das wenn mir irgendwo ein Interrupt dazwischen funkt ist dies auch nicht das wahr???

  • Ja ich arbeite ohne solche Zonen die im Raum definiert sind. Eben aus diesem Grund den du beschrieben hast. Der Robi bewegt sich schon in die Zone und das Signal im Bereich ist noch eins. Im Programm wird es direkt nach der Freigabe gesetzt. Und wenn du noch einen großen Greifer mit mehreren TCP´s hast und dann überlappen sich auch noch mehrere Zonen......dann muss man einiges tun damit alles gut läuft. Finde ich mal so!
    Wieso verwendest du diese Zonen? Damit der Robi auch in Handmodus diese Signale setzt?

    Für seine Arbeit muß man Zustimmung suchen, aber niemals Beifall.<br />Zitat: Charles-Louis Baron de Montesquieu

  • Ja unter anderm deswegen nimm ich Weltzonen.
    Hab auch übergabe bits zur SPS als Vorgabe, aber ich machs jetzt so das ich die Lösung von dir nehm + die Weltzonen. Beide Signal Bündel ich mit einem ODER Glied im ABB Roboter und sende diese dann als ein Signal raus.
    Denk so müsste es dann sauber sein, was meinst?

  • Hallo Dragon,
    doppelt gemobbelt hält besser :uglyhammer_2:
    Ob das alles sauber funktioniert hängt vom Robi- und SPS-Programmierer ab. Wenn alles richtig getestet wird, dann langt auch eine Variante davon.
    Wenn bei der Station Taktzeit wichtig ist dann wäre die Weltzonen-Lösung die schlechtere Wahl. Du musst ja die Zonen relativ groß machen. Damit beim reinfahren rechtzeitig das Signal gesetzt wird. Beim rausfahren könnte das zum Problem werden weil dadurch viel Zeit verschenkt wird.
    Da werden aber auch die Signale gesetzt wenn der Robi von Hand bewegt wird. Aber mal ehrlich.......wenn der Bediener den Robi irgendwo hin bewegt und dann auch noch z.B. ein Portal über das SPS-Bedienpanel bewegt und er sieht das nicht.......dann machts crash :aufsmaul:
    Meistens wird der Robi über irgendlweche Programme zu einer Position bewegt um z.B. Positionen zu teachen. Und in diesen Programmen muss das Signal halt auch gesetzt werden.
    Je mehr der Bediener, die Anlage, über´s OP oder übers FP bedienen und steuern kann um so einfacher und sicherer wird es sein.
    Gruß Paulaner

    Für seine Arbeit muß man Zustimmung suchen, aber niemals Beifall.<br />Zitat: Charles-Louis Baron de Montesquieu

Hilfe und Support für ABB Roboter Programmierung, Konfiguration, Inbetriebnahme finden Sie hier im ABB Roboter Forum. ABB Rapid Programmierung ist einfach, die Roboterforum Community hilft sehr gerne.

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