Main Aufruf Extern Modus KUKA

  • Servus zusammen,


    ich habe zu dem Thema im Forum ein paar Ideen gefunden aber leider noch keine Endlösung da ich noch ziemlich neu im Thema Kuka bin.:/


    Ich möchte unseren Roboter per Externer SPS starten und stoppen. Tut der Roboter nun während dem Betrieb einen Fehler ,z.B. Teileverlust, melden wird er gestoppt und nun soll das "Main" Programm neu Aufgerufen werden da er sich dort Initialisiert und dementsprechend das Programm fortführt.


    Wie löst man dies am besten?


    Ich habe gelesen es soll mit "cwrite" in der Roboter SPS funktionieren?

    Bsp:

    ;"User SPS Kuka"

    IF IN iMain_aufrufen==True Then

    CWRITE($CMD,STAT,MODE,"RUN /R1/MAIN()")

    ENDIF


    Anbei ein Einblick in mein Programm.


    Beispiel:


    ;Main Start

    ;--------------------------------------------

    ;Initialisierung

    ;--------------------------------------------

    Job1_Init_Grundstellung()

    ;--------------------------------------------

    ;Zyklusstart

    ;--------------------------------------------

    REPEAT


    CONTINUE


            IF nGreiferStatus==0 THEN


          Job4_BAZ_entladen()


            ENDIF


    CONTINUE


      IF nGreiferStatus==2 THEN


          Job5_Teil_ablegen()


    CONTINUE


    IF nGreiferStatus==4 THEN

    .....

    .....

    .....

    ......

    .....


      CONTINUE


    UNTIL  ( NOT iBelade_an )


    PTP XHOME

    TRIGGER WHEN DISTANCE=1 DELAY=0 DO regpos=0


      HALT

  • Schritt für Schritt zum Roboterprofi!
  • IF IN iMain_aufrufen==True Then

    CWRITE($CMD,STAT,MODE,"RUN /R1/MAIN()")

    ENDIF

    IF IN iMain_aufrufen ist schon mal falsch.

    Den Bezeichner IN gibt es bei KUKA nicht.

    IF iMain_aufrufen


    Dann sollte das Programm auch zuerst mal gestoppt und, so mache ich es zumindest immer, abgebrochen werden.

    Code
    IF iMain_aufrufen AND NOT bMain_aufrufen THEN
      bMain_aurufen = TRUE
    ENDIF
    IF bMain_aufrufen THEN
      CWRITE($CMD,STAT,MODE,"STOP/R1/MAIN()")
      CWRITE($CMD,STAT,MODE,"CANCEL/R1/MAIN()")
      CWRITE($CMD,STAT,MODE,"RUN /R1/MAIN()")
      bMain_aufrufen = FALSE
    ENDIF

    Das Signal iMain_aufrufen darf auch nicht statisch gesetzt sondern nur gepulst werden.

    Gruß Roland


    Wie poste ich falsch?

    Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Ich bin wie ich bin. Die Einen kennen mich, die Anderen können mich.

    Konrad Adenauer

  • Das Signal iMain_aufrufen darf auch nicht statisch gesetzt sondern nur gepulst werden.

    Daher sollte man das eher so machen (oder so ähnlich), sonst ist das Ergebnis von der Pulslänge abhängig:

    Diese Methode hat aber m.M. den Nachteil, dass man da das Programm von der SPS her auch wieder starten muss, denn es läuft nach dem letzten CWRITE nicht automatisch los.

    Daher mache ich das normalerweise eher so:

    Da braucht die SPS nur einen Ausgang zu setzen, und das Programm läuft von vorne los.

  • Wenn das Signal in einer sub-routine abgefragt wird, ist die Signallänge eigentlich irrelevant. Da reicht ein Impuls von 200ms leicht aus.

    Daß die SPS das Startsignal durch z.B. drücken eines Taster wieder senden muss halte ich für sinnvoll.

    Gruß Roland


    Wie poste ich falsch?

    Nachdem ich die Suche und die FAQ erfolgreich ignoriert habe, erstelle ich das gleiche Thema in mehreren Unterforen, benutze einen sehr kreativen Titel wie "Hilfe", am Besten noch mit mehreren Ausrufezeichen, und veröffentliche einen so eindeutigen Text, dass sich jeder etwas Anderes darunter vorstellt.


    Ich bin wie ich bin. Die Einen kennen mich, die Anderen können mich.

    Konrad Adenauer

  • Wenn das Signal in einer sub-routine abgefragt wird, ist die Signallänge eigentlich irrelevant. Wenn das Signal in einer sub-routine abgefragt wird, ist die Signallänge eigentlich irrelevant. Da reicht ein Impuls von 200ms leicht aus.

    So ganz irrelevant ist die nicht, denn wenn ich mich nicht schwer irre, dann kann es in Deiner Version dazu kommen, dass wenn der Impuls zu lange ist, bzw. wenn der SPS.SUB innerhalb dieses Impuls mehrfach an der Stelle vorbeikommt (das kann in den vorgeschlagenen 200ms durchaus öfter als zwei mal passieren) diese CWRITE-Befehle mehrfach ausgeführt werden. Das wird zwar in den meisten Fällen funktionieren, ist aber nicht wirklich sauber. Denn wenn zwischen den CWRITE Befehlen der Startimpuls von der SPS kommt (und irgendwann passiert das), dann wird es zumindest holprig.

    Die Durchlaufzeit des SPS.SUB ist, wie wir alle wissen nicht wirklich genau vorhersehbar.

    Daß die SPS das Startsignal durch z.B. drücken eines Taster wieder senden muss halte ich für sinnvoll.

    Ja das ist auch sinnvoll, kann aber auch in der SPS schon entsprechend programmiert werden. Mein Hauptargument gegen diese CWRITE-Methode ist eher die Tatsache, dass die parallelen Prozesse deutlich schwerer zu durchschauen und zu debuggen sind (Sieht man schon an dem kleinen 'Problem' mit dem Impuls ;) ).

    Aber da soll jeder nach seiner Fasson glücklich werden.

  • Denn wenn zwischen den CWRITE Befehlen der Startimpuls von der SPS kommt (und irgendwann passiert das),

    Das ist ausgeschlossen. Der Startvorgang des Robis wird Vollautomatisch über eine Schrittkette gestartet. Sprich bevor per SPS der Startvorgang gepulst wird ist der iMain_aufrufen auf jeden fall zurück gesetzt.



    Zitat

    Ja das ist auch sinnvoll, kann aber auch in der SPS schon entsprechend programmiert werden. Mein Hauptargument gegen diese CWRITE-Methode ist eher die Tatsache, dass die parallelen Prozesse deutlich schwerer zu durchschauen und zu debuggen sind (Sieht man schon an dem kleinen 'Problem' mit dem Impuls ;) ).

    Was meinst du damit das die "Parallelen Prozesse" schwerer zu durchschauen sind? Tue ich hier was übersehen?

  • Es ist alles gut soweit.

    Wenn das in der Sps so abgefangen ist ist das ja ok, aber es sind halt Bedingungen, die unbedingt eingehalten werden müssen. Wenn man den Sps.Sub wie vorgeschlagen anpasst, dann kann im SPS Programm auch ein Fehler vorhanden sein, und "der Roboter spinnt" trotzdem nicht. Bei mir gilt das Prinzip: jeder Eingang muss irgendwann auf beide möglichen Zustände abgefragt werden.


    Und da "tust" du nicht unbedingt etwas übersehen, aber wie ich das schon schrieb: wenn dieser Impuls die vorgeschlagenen 200ms hat, dann werden diese cwrite Befehle in aller Regel mehrfach ausgeführt. Hier spielt das keine allzu grosse Rolle, da es trotzdem funktionieren wird, sofern sich das KSS wegen der schnell hintereinander folgenden An- Abwählen nicht irgendwann aufhängt. Allein die Tatsache, dass ich das jetzt schon zum dritten Mal erläutere zeigt, dass meine Einschätzung stimmen kann.

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