Unterprogramme mit CWRITE anwählen.

  • Hallo Zusammen,


    folgendes steht in meiner SPS.SUB


    IF $MODE_OP==#EX THEN


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


    ENDIF


    diese 3 Zeilen bewirken, das wenn ich in EXT schalte mein HPxxxxxR01() angewählt wird. Funktioniert.


    Aber....


    IF $FLAG[10]==TRUE THEN

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

    ENDIF


    funktioniert nicht.


    Ich möchte mir ein Graphisches Interface (CustomView) bauen, um Programme anzuwählen. Dafür möchte ich Variablen oder Flags benutzen die dann, wenn man den Button drückt, auf TRUE

    gehen und in der SPS.SUB das CWRITE abfeuern.


    Hat da irgendwer ne Ahnung warum das eine geht und das andere nicht. Oder ob das überhaupt möglich ist?



    Grüße

  • Schritt für Schritt zum Roboterprofi!
  • Evtl. sollte Du da noch ein 'cancel' vorausschicken, weil schon ein Programm angewählt ist.

    Ausserdem solltest nach dem 'run' das flag zurücksetzen, damit der Befehl nur Ein einziges Mal ausgeführt wird, ansonsten gibt es eh seltsame Effekte.

  • Nein tut nicht.


    Wenn ich versuche ein anders UP aufzurufen wird immer nur das Hauptprogramm aufgerufen.



    IF $MODE_OP==#EX THEN

    CWRITE($CMD,STAT,MODE,"RUN /R1/Program/Unterprogramme/XXX_XXX1()")

    ENDIF


    Komisch vielleicht fällt jemanden noch was dazu ein.


    Danke Hermann für deine Antwort


    Grüße

  • Bitte poste komplette sps.sub.


    Wieso nicht Proganwahl in Schlaufe in Hauptprog und Deine Progs aufrufen als UP's a la cell.src?

    Kannst Dir das gefummel mit der sps.sub sparen.


    CWrite falsch angewendet kann zum totalabsturz führen.

    Manche Maenner bemuehen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitaetstheorie.

  • IF $MODE_OP==#EX THEN

    CWRITE($CMD,STAT,MODE,"RUN /R1/Program/Unterprogramme/XXX_XXX1()")

    ENDIF

    Auch hier vermisse ich den OneShot. Also das Verhindern des dauerhaften Auslösens des CWRITE. So wie es hier aussieht wird der Befehl in der Betriebsart EXT ständig in ca 24ms Abständen ausgeführt, das kann eigentlich auch nicht wirklich funktionieren. Plädiere auch dafür mal das komplette SPS.SUB hier zu zeigen, da muss noch mehr faul sein. Das Anwählen von anderen Programmen funktioniert normalerweise tadellos.

  • Hallo


    Das ist jetzt mal die ganze SPS.SUB.


    Wenn ich den Schlüsselschalter umlege und auf EXT schalte startet mein HP.

    Dann wieder auf T1 und gut ist.


    Grüße



    &ACCESS RVO


    &REL 13


    &COMMENT PLC on control


    DEF  SPS ( )


       ;FOLD DECLARATIONS


          ;FOLD BASISTECH DECL


             ;Automatik extern


             DECL STATE_T STAT


             DECL MODUS_T MODE


          ;ENDFOLD (BASISTECH DECL)


          ;FOLD USER DECL


             ; Please insert user defined declarations



          ;ENDFOLD (USER DECL)


       ;ENDFOLD (DECLARATIONS)


       ;FOLD INI


          ;FOLD AUTOEXT INIT


             INTERRUPT DECL 91 WHEN $PRO_STATE1==#P_FREE DO RESET_OUT ()


             INTERRUPT ON 91


             INTERRUPT DECL 92 WHEN $PRO_MOVE==TRUE DO RESET_LINESEL()


             INTERRUPT ON 92


    $LOOP_MSG[]=" "


    MODE=#SYNC


    $H_POS=$H_POS


             ;Automatik extern


             ;REMOVED AUTOGENERATED -- DO NOT CHANGE -- DAI_POWERTRAIN_V86_S7-1500 sps SpsSub_Block_Del.add InsertSpsSubInit


          ;ENDFOLD (AUTOEXT INIT)


          ;FOLD BACKUPMANAGER PLC INIT


    BM_ENABLED = FALSE


    BM_OUTPUTVALUE = 0


          ;ENDFOLD (BACKUPMANAGER PLC INIT)


          ;START AUTOGENERATED -- DO NOT CHANGE -- DAI_POWERTRAIN_V86_S7-1500 sps SpsSub_Block_Init.add InsertSpsSubInit


          ;FOLD DAI_SPS_INI



             ;Automatik extern


             IF $MODE_OP==#EX THEN


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


             ENDIF



          ;ENDFOLD (DAI_SPS_INI)


          ;END AUTOGENERATED -- DO NOT CHANGE -- (DAI_POWERTRAIN_V86_S7-1500 sps SpsSub_Block_Init.add InsertSpsSubInit)


          ;FOLD USER INIT


             ;START AUTOGENERATED -- DO NOT CHANGE -- DAI_TRMD sps TRMD_sps.sub.add InsertDAI_TRMD


             ;FOLD INIT Fuer_Transfermodul_PT


                dai_sps_init( )


             ;ENDFOLD INIT Fuer_Transfermodul_PT


             ;END AUTOGENERATED -- DO NOT CHANGE -- (DAI_TRMD sps TRMD_sps.sub.add InsertDAI_TRMD)


             ; Please insert user defined initialization commands



          ;ENDFOLD (USER INIT)


       ;ENDFOLD (INI)



       LOOP


          WAIT FOR NOT($POWER_FAIL)


          ;FOLD BACKUPMANAGER PLC


             IF BM_ENABLED THEN


    BM_OUTPUTSIGNAL = BM_OUTPUTVALUE


             ENDIF


          ;ENDFOLD (BACKUPMANAGER PLC)


          ;START AUTOGENERATED -- DO NOT CHANGE -- GripperSpotTech sps SpsSub.add InsertGripperTechGlobals


          ;FOLD GRIPPERTECH LOOP


             GRPg_ChkSetStatePLC()


          ;ENDFOLD (GRIPPERTECH LOOP)


          ;END AUTOGENERATED -- DO NOT CHANGE -- (GripperSpotTech sps SpsSub.add InsertGripperTechGlobals)


          ;START AUTOGENERATED -- DO NOT CHANGE -- DAI_POWERTRAIN_V86_S7-1500 sps SpsSub_Block_Loop.add InsertSpsSubLoop


          ;FOLD DAI_SPS_LOOP



             dai_system_sps()


             dai_user_sps()



          ;ENDFOLD (DAI_SPS_LOOP)


          ;END AUTOGENERATED -- DO NOT CHANGE -- (DAI_POWERTRAIN_V86_S7-1500 sps SpsSub_Block_Loop.add InsertSpsSubLoop)


          ;START AUTOGENERATED -- DO NOT CHANGE -- DAI_CollDetect Sps spssub.add InsertSPSFold


          ;FOLD DAI_CollDetect


             DAI_CollDetect()


          ;ENDFOLD (DAI_CollDetect)


          ;END AUTOGENERATED -- DO NOT CHANGE -- (DAI_CollDetect Sps spssub.add InsertSPSFold)


          ;FOLD USER PLC


             ;Make your modifications here



             IF NOT diKollisionsschutz_545 AND $T2 THEN


    $OV_PRO=0


             ENDIF



    doKollSchutzIO_258 = diKollisionsschutz_545


          ;ENDFOLD (USER PLC)


       ENDLOOP


    END



    ;ENDFOLD



    DEF  RESET_OUT ( )


       INT N


       MsgLoop(" ")


       IF REFLECT_PROG_NR == 1 THEN


          FOR N = 0 TO PGNO_LENGTH - 1


    $OUT[PGNO_FBIT_REFL + N] = FALSE


          ENDFOR


       ENDIF


       IF (PGNO_REQ>0) THEN


    $OUT[PGNO_REQ]=FALSE


       ELSE


          IF (PGNO_REQ<0) THEN


    $OUT[-PGNO_REQ]=TRUE


          ENDIF


       ENDIF


    END



    DEF RESET_LINESEL()


    $LINE_SEL_OK=FALSE


    END



    ;FOLD USER SUBROUTINE


       ; Integrate your user defined subroutines



    ;ENDFOLD (USER SUBROUTINE)


    ;ENDFOLD

  • IF $MODE_OP==#EX  THEN

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

    ENDIF


    Das was da steht bewirkt nur wenn die Steuerung hochfährt und der Schlüsselschalter auf ex steht…dann wird das beschriebene Programm automatisch angewählt . Einmalig……


    In der loop schleife steht ja nix….


    D.h du musst dafür sorgen den Interpreter abzufragen in welchem Zustand er gerade ist …wenn aktiv dann mit cancel1 abwählen…

    Mit deinem Flag abfragen dann das betreffene Programm anwählen..usw…flag wieder zurücksetzen….


    Nimm doch einfach einen Sprungverteiler oder ähnliches…

    Geht viel schneller

  • Hallo Woodys,


    danke für die Info. Aber jetzt halt dich fest.


    Das HP wird auch aufgerufen, wenn ich zb. in T1 in irgendeinem UP stehe und den Schlüsselschalter betätige und auf ext schalte und wieder zurück auf T1 gehe. Dann bin ich im HP. Egal wo ich vorher war.

    Und um dem ganzen noch eins drauf zu setzen.


    IF $MODE_OP==#EX  THEN

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

    ENDIF


    egal welches UP ich da eintrage, ich komme immer wieder nur ins HP.


    Und das das nicht in der LOOP steht macht die Sache nur Mysteriöser. =O8|:D


    Grüße

  • Da steht ne ganze Menge drin. Ich werde die beiden morgen mal auskommentieren. Und dann das ganze noch mal probieren. Wenn dann das Verhalten noch gleich ist. Dann liegt es wohl nicht an den beiden.


    Tschüß

  • Dass das ein Roboter nach einem Daimler Standard ist, hättest ja gleich sagen können.

    Die Programmanwahl wird genau in dem Unterprogramm DAI_SYSTEM_SPS() gemacht.


    Wenn der Roboter zu Daimler gehen soll, dann sollte man sich auch deren Standard halten, je nach Abnehmer bekommt man sonst massive Probleme und darf von vorne anfangen.


    Wenn der Roboter nicht zu Daimler (oder einer angegliederten Firma, die sich auch an den Standard hält) geht, dann wirf das ganze Daimler Zeug raus, lohnt sich nicht unbedingt sich da einzuarbeiten, zumal da auch ein passendes SPS-Programm mit großem Siemens HMI-Display dazugehört.

  • Der Robi steht bei Daimler und Produziert auch schon. Alles Gut.


    Ich versuche die Frage noch einmal ganz einfach zu fassen.


    Ich möchte im T1 Betrieb ein beliebiges UP Anwählen und zwar über eine Eingabemaske, welche ich mir selbst erstellt habe(CustomView). In dieser Eingabemaske gibt es einen Button der heist von mir aus ANWAHL UP1. Wenn ich auf diesen Knopf drücke wird das UP angewählt..


    Jetzt kommt die Frage!!! Es ist auch vollkommen egal wo der Robi steht. Es ist eine Allgemeine Frage.


    Was muss ich tun, damit der Knopf, wenn ich ihn drücke, das UP Anwählt.

    Wie CustomView verwendet wird gehört nicht zur Frage.



    Grüße

  • Jetzt kommt die Frage!!! Es ist auch vollkommen egal wo der Robi steht. Es ist eine Allgemeine Frage.

    Da bin anderer Meinung. Das ist eben nicht egal, wenn es kein Roboter von der Stange ist, mit Kuka Standard Konfiguration, sondern ein bereits inbetriebgenommener Roboter mit essentiellen Änderungen an nahezu allen Ecken und Enden der Standard Anwenderprogramme.


    In einem 'jungfräulichen' Roboter von KUKA frisch ausgeliefert:

    Setze eine globale Variable über den Button auf TRUE (nenne wir sie mal bStart)

    Dann im SPS.sub innerhalb des Loop / Endloop:

    Code
    IF bStart  THEN
    
     CWRITE($CMD,STAT,MODE,"RUN /R1/Program/UP_xxx_yyy()")
     bStart=false
    ENDIF

    Falls Du das auf dem Roboter bei Daimler machst kann es zu Problemen kommen, denn die bereits bestehende Logik für die Programmanwahl kann da zwischenfunken. Bringt halt nix, wenn an zwei verschiedenen Stellen die Programmanwahl erfolgt.


    Edit:

    Bin nicht unbedingt der Oberverfechter von Standards, aber die grossen Konzerne haben schon Ihre Gründe einen Standard vorzuschreiben. Wenn da jeder macht was er will, dann haben die Betreiber und Instandhalter es sauschwer die Anlagen am Laufen zu halten. Also sollte man sich schon an den Standard halten, soweit es irgendwie geht, wenn es auch manchmal schwerfällt. Jm2c.

  • Ok Versteh jetzt was du meinst.

    Ich probiere das mal an einem nackten Robi, wenn ich einen in die Finger bekomme.

    Ich wollte das ja auch nicht einfach hier in die Robi´s einpflegen, sondern ich wollte nur wissen ob das grundsätzlich mit CWRITE möglich ist. Wir haben ja auch manchmal kleinere Projekte wo es keinen Standard gibt und da kann man sich dann so richtig schön auslassen.:) Kunden lieben doch one Button Solutions.

    Bringt halt nix, wenn an zwei verschiedenen Stellen die Programmanwahl erfolgt.

    Wenn der Robi in EXT steht dann kann der Anwahlbutton nicht in Automatik funktionieren, weil höchste Betriebsart T1 ist. Das sollte doch ausreichen um eine doppelte Anwahl zu verhindern?

  • Wenn der Robi in EXT steht dann kann der Anwahlbutton nicht in Automatik funktionieren, weil höchste Betriebsart T1 ist. Das sollte doch ausreichen um eine doppelte Anwahl zu verhindern?

    Im Prinzip vermutlich ja.

    Ist aber doch wurscht, wenn es nicht zum Daimler-Zeugs hinzugefrickelt werden soll. Für einen Test einfach die Daimler-Aufrufe im SPS.SUB auskommentieren. Halt nicht vergessen es wieder rückgängig zu machen.

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