CELL AUFRUF aus SPS.sub

  • Hallo zusammen,


    habe schon etliche Beiträge zum Thema gelesen aber leider ohne wirklichen Erfolg/Bestätigung dass ich richtig liege.


    zum Problem:

    Die SPS soll über das sps.sub meine CELL aufrufen.

    Klar über sowas wie:

    Code
    IF ($MODE_OP==#EX) OR ($MODE_OP==#AUT) THEN       
    CWRITE($CMD,STAT,MODE,"RUN /R1/CELL()")
    ENDIF 


    Diese Änderung übertrage ich in der BA T1 und wechsle auf EXT.

    -> kein automatischer Programmaufruf von CELL.src


    Die Vermutung war dann, dass der "Vorlaufzeiger" in sps.sub schon darüber gesprungen ist, ehe ich in EXT wechsle


    Habe dann den Code geändert auf:


    Code
    WAIT FOR ($MODE_OP==#EX) OR ($MODE_OP==#AUT) 
    IF ($MODE_OP==#EX) OR ($MODE_OP==#AUT) THEN   
        CWRITE($CMD,STAT,MODE,"RUN /R1/CELL()")     
        $OV_PRO=giOverride  ;einstellbar durch SPS
    ENDIF

    Damit funktioniert der CELL.src - Aufruf wenn ich mit den Schalter auf EXT wechsel.




    Nun die eigentliche Frage:

    Ist das so OK oder hintere ich den Programmzeiger an irgendetwas?

    Also bekomme ich im späteren Ablauf damit Probleme?


    Was auch funktioniert hat:

    Wenn ich den ersten Quellcode in den LOOP der sps.sub packe funktioniert es auch.

    ...aber das wäre gegen alle bisher gelesenen Beiträge und gegen die Vorgehensweise der Doku von KUKA



    PS: Hoffe dass ich keinen neuen unnötigen Thread erstellt habe und alle Richtlinien des Forums genüge tue - ich bitte um Nachsicht :S

  • Schritt für Schritt zum Roboterprofi!
  • Erste Frage:

    Warum musstest Du das einfügen? Standardmäßig ist dieser Aufruf in der sps.sub vorhanden.


    Ich würde definitiv keine Warteanweisung in ein zyklisch ablaufendes Programm einbinden!


    Als nächstes wird der Programmzeiger nicht auf Cell gesetzt durch deine übergeordnete SPS sondern durch den Zustand des Roboters. $OP_Mode fragt die Betriebsart des Roboters ab.


    Zweite Frage:


    Was hat das setzen des Override durch einen Gruppeneingang mit dem Thema zu tun?

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • 1. die Standardmäßige Syntax im Ordner "AUTOEXT INIT" habe ich gesehen aber der Aufruf hat nicht stattgefunden... deswegen das zusätzliche Einfügen, dann ging's


    1.1 ich dachte dass er dann erst durch die IF - Anweisung in Cell springt wenn eben die BA EXT ausgewählt ist



    2. den Gruppeneingang haben wir gewählt um von SPS - Seite aus den Override einstellen zu können - das funktioniert



    Aktuell sieht der Code so aus:

    Das Wait ist rausgelöscht (dachte schon dass das Probleme verursachen könnte.


    Nur mein CELL Aufruf steht eben in dem LOOP ... was ja laut Dokus nicht so sein soll?! ?(

  • JoLa


    Ich habe während des Ablauf's mal den Not-Aus am KCP gedrückt, nach dem lösen vom Not-Aus hing das Programm in der Schleife des SPS.sub fest -> das KCP hat sich regelrecht überschlagen im Anzeige-Bildschirm 8|



    Mit dem einfügen von $PERI_RDY hat auch der Not-Aus funktioniert...


    Oder gibt's da eine elegantere Lösung? :)

  • Ein Sub ist ein Programm, das zyklisch abgearbeitet werden soll (wie eine SPS), das ist der Sinn dahinter..

    Deswegen sollen da auch keine Waitbefehle etc rein, dass sich das submit Programm "überschlägt" ist also gewollt

  • Das ist ein ganz normales Verhalten für eine zyklische Abarbeitung.

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • Das ist klar wegen LOOP



    Jedoch noch die offene Frage ob, das hier alles so zulässig ist was ich hier betreibe?

    Also gemeint ist besagter Code:


  • Naja, je nachdem was dein gewünschter Effekt sein soll kannst du dich dort austoben.


    Gibt nur eine Reglementierung und die gibt dir die Funktion welche du erzielen möchtest vor. ;)

    Wer nichts macht, macht keine Fehler!

    Wer keine Fehler macht, kann nichts daraus lernen!

    Wer nichts lernen kann, kann sich nicht weiterentwickeln!

    Wer sich nicht entwickelt, geht unter!

  • Das überschlagen kommt daher, weil Cell dann in jedem sub-Zyklus aufgerufen wird.


    Ich habe es folgendermaßen gelöst:


    Code
       ;Beim wechseln in den Automatik-Extern Betriebsmodus wird CELL aufgerufen
       IF ($MODE_OP == #EX) AND (b_Cell_Aufruf == TRUE) THEN
          CWRITE($CMD,STAT,MODE,"RUN/R1/CELL()")
          b_Cell_Aufruf = FALSE
       ENDIF
       IF $MODE_OP <> #EX THEN
          b_Cell_Aufruf = TRUE
       ENDIF

    so wird cell nur einmal beim wechsel auf Auto extern aufgerufen und danach nicht mehr.

  • chrisfriedo : wenn Du einfach nur willst, dass bei Bedarf nach dem Umschalten das CELL-Programm angewählt wird, WENN NICHTS ANGEWÄHLT IST, sieht der Code im Loop-Teil so aus:

    Code
      IF (($MODE_OP==#EX) and ($pro_state1==#p_free)) THEN
        CWRITE($CMD,STAT,MODE,"RUN /R1/CELL()")
      ENDIF

    Die zweite Bedingung guckt, ob ein Programm angewählt ist, und wenn nicht, wählt er cell an.

    Da braucht man weiter auch keine Bedingungen und Verrenkungen.


    WENN ein Programm angewählt ist, bleibt es freilich drin. Das ist normalerweise das erwünschte Verhalten: wenn im Ablauf irgendwas schiefgeht, kann man auf Hand und wieder zurück, ohne den Programmzeiger zu verlieren.

    Was natürlich nichts hilft, wenn Du mit dem Code verhindern willst, dass irgendein Trottel eine andere Routine oder dergl. angewählt hat und dann startet. Aber wie tief soll man das treiben?


    Was ich auch gelegentlich mache: bei schweren Fehlern das Programm selbsttätig ABwählen mit

    Code
      if (kill_task AND (NOT($pro_state1==#p_free))) then
             CWRITE($CMD,STAT,MODE,"CANCEL")
             kill_task=FALSE
      endif

    direkt drunter. Muss man kill_task halt im Fehlerfall irgendwo setzen.




  • Vielleicht hilft dir das?

  • Karlo Danke, mir ging's ja aber um die Struktur im sps.sub und den Aufruf darin von cell.src :)

    Also meine cell.src sieht genauso aus.


    Programmiersklave das hilft mir sehr weiter.

    wollte im Prinzip nur eine Bestätigung ob der cell Aufruf einfach so im Loop stehen darf (eben weil ich es überall vor dem Loop gesehen hab).

    Deine Codes werde ich auch mal testen, insofern das erlaubt ist ^^


    Also mittlerweile hat die Kommunikation zwischen SPS und Robi auch gut funktioniert....jetzt stehen schon die nächsten Probleme an, wie richtiger Überschleif und Taktzeit Optimierung :S

    Danke allen schon mal wieder für die Hilfe - bin echt begeistert vom Forum!! <3

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account
Sign up for a new account in our community. It's easy!
Register a new account
Sign in
Already have an account? Sign in here.
Sign in Now