automatische SAK Fahrt

  • Hallo Leute,
    ich lese schon länger als Gast mit so wurden mir hier schon viele Fragen beantwortet. Jetzt ist es allerdings soweit das ich keine passende Antwort gefunden habe :-/


    Es geht um die automatische SAK-Fahrt. Es soll so sein das der Bediener das KCP nicht anfassen muss.
    Ich kann nur leider nicht einfach "ptp $pos_act" ausführen da das Programm garnicht aufgerufen wird wenn ich keine SAK Fahrt in T1 durchführe.


    Ich muss dazu sagen das wir nicht die Cell.src nutzen sondern einen eigenen "Main_Job" den wir in der SPS.sub aufrufen.


    Kann ich schon in der sps.sub eine Sak Fahrt durchführen? Wird SPS.sub überhaupt aufgerufen? Ich kann es zumindest nicht sehen das irgendwas aufgerufen wird bevor ich keine SAK Fahrt gemacht habe...


    Wie macht Ihr das?


    Ich bin dankbar für jeden Ratschlag :)

    Einmal editiert, zuletzt von SJX ()

  • Schritt für Schritt zum Roboterprofi!
  • Hallo,
    warum bist Du denn der Meinung, dass das Programm gar nicht aufgerufen wird ohne SAK-Fahrt im T1?
    Habt ihr das von eurer Software-Seite aus so geregelt?
    Wenn nicht -> Du kannst direkt im SPS.SUB keine Fahrbewegungen machen (Ausnahmen bestätigen die Regel, z.B. asyncrone externe Achsen). Ein Programm kann auch ohne SAK gestartet werden (Auch im Auto oder EXT) - nur muss die erste Bewegung eine PTP-Bewegung sein und dort gibt es dann ggf. die SAK-Fahrt (Die soweit ich weiß auch im AUTO funktioniert. Wenn Du dort PTP $POS_ACT machst solltest Du safe sein (Abgesehen von den Themen weshalb es die SAK-Fahrt gibt, aber ich denke das wirst Du bedacht haben).
    Wenn ihr es verhindert -> Warum? Vielleicht solltet ihr das überdenken.

  • Ich müsste alles abgedeckt haben. Der Roboter hat recht komplizierte Wege weshalb ich jeder Position einen Wert gegeben habe. Beim anfahren der Pos wird der Wert in ein Variable geschrieben. Die Grundstellungsfahrt ist eine Case-struktur wo ich anhand der Variable die den passenden weg wähle. Bei der Grundstellungsfahrt wird die Variable wieder überschrieben falls bei der Fahrt ein Abbruch oder nothalt kommt...
    Die Variable wird gelöscht wenn die Betriebsart von Ext in T1 gewechselt wird. T2 und AUT habe ich deaktiviert.
    Falls der Roboter also per KCP verfahren wird, muss auch ein manuelles Homing durchgeführt werden um einen crash zu vermeiden.


    Ich denke damit ist das ganze ziemlich sicher.


    Mein Ablauf zum starten des Roboters ist der folgende:



    //**********************
    // Meldungen quittieren
    //**********************
    s004: SET
    // Das folgende habe ich mal zum testen gemacht... Hat leider nichts gebracht :-/
    S "DB342 Kommunikation KUKA".OUT."a ROB_Conf_Mess"
    S #TimerNr[2].Start
    SPA inc1



    //*********************
    // Fahrfreigabe setzen
    //*********************
    s005: U #TimerNr[2].Ende
    SPBN end
    R "DB342 Kommunikation KUKA".OUT."a ROB_Conf_Mess"
    R "DB342 Kommunikation KUKA".OUT."a ROB Abort Program"
    S "DB342 Kommunikation KUKA".OUT."a ROB_Drives_Off(Invers)"
    S "DB342 Kommunikation KUKA".OUT."a ROB_Move_Enable"
    S "DB342 Kommunikation KUKA".OUT."a ROB_I_O_Act"
    SPA inc1



    //**********************
    // Antriebe einschalten
    //**********************
    s006: SET
    S "DB342 Kommunikation KUKA".OUT."a ROB_Drives_On"


    SPA inc1



    //****************************
    // Roboter Antriebe nicht ein
    //****************************
    s007: U "DB342 Kommunikation KUKA".IN."e ROB_Peri_RDY"
    SPBN end
    S #TimerNr[2].Start
    R "DB342 Kommunikation KUKA".OUT."a ROB_Drives_On"
    R "DB342 Kommunikation KUKA".OUT."a ROB_Conf_Mess"
    SPA inc1



    //**********************
    // Meldungen quittieren
    //**********************
    s008: UN "DB342 Kommunikation KUKA".IN."e ROB_STOPMESS"
    SPB inc2


    U "DB342 Kommunikation KUKA".IN."e ROB_STOPMESS"
    U #TimerNr[2].Ende
    SPBN end
    S "DB342 Kommunikation KUKA".OUT."a ROB_Conf_Mess"
    SPA inc1



    //***********************************************
    // Rob Fehlermeldung kann nicht quittiert werden
    //***********************************************
    s009: UN "DB342 Kommunikation KUKA".IN."e ROB_STOPMESS"
    SPBN end
    R "DB342 Kommunikation KUKA".OUT."a ROB_Conf_Mess"
    SPA inc1





    edit:


    Was ich meinte mit "Das Programm wird nicht angewählt" ist, das ich nicht weiter als Pery_Ready komme wenn ich nicht zufor eine SAK fahrt durchgeführt habe. Das Programm einfach vorher starten funktioniert auch nicht.


  • Inwiefern und bei welchen Aktionen soll der Bediener das KCP/Smartpad nicht anfassen müssen?
    Ist es eine KRC4 oder KRC2? Da unterscheidet sich das Verhalten des Signals $pery_rdy.
    Irgendwelche Meldungen am KCP/Smartpad?
    Status des Programms: Steht, Abgewählt, Angewählt, auf INI-Zeile .... ?


    Häufiges Problem ist, dass nicht beachtet wird, dass "Conf_mess", "Motor_on" und "Start" Flanken sein müssen.


    Das mit Cell, oder eigenem Programm spielt keine Rolle. Das Cell.src ist eh nur bedingt verwendbar, und m.E. nach nur als Programmiervorschlag zu betrachten, den man am besten nicht weiter beachtet.

  • Es handelt sich um die KRC4 und im besten Fall müsste der Bediener das Panel nie anfassen müssen.


    So wie oben zu erkennen ist setzen wir die genannten Bits immer zurück sobald die passende Antwort da ist. So wie im Ablaufschema von Kuka gezeigt.

  • Hallo Master_Override,

    Zitat


    Hat keiner mehr eine Idee?


    Poste bitte mal eure sps.sub und mindestens mal der erste Teil Eurer Hauptroutine.
    Dein SPS-Code sagt vielen nichts. Signalablauf seitens SPS würde mehr zeigen.
    Ohne richtiges "Futter" Deinerseits wird's schwierig, durchzublicken. :denk: :kopfkratz:


    Weiter hat Dir Herrmann Fragen gestellt, die Du nicht beantwortet hast.


    Zitat


    [size=1][font=verdana,sans-serif]Was ich meinte mit "Das Programm wird nicht angewählt" ist, das ich nicht weiter als Pery_Ready komme wenn ich nicht zufor eine SAK fahrt durchgeführt habe. Das Programm einfach vorher starten funktioniert auch nicht. [/font][/size]


    [size=3]Kannst Du dies im Detail erleutern mit aktuellen Status seite SPS, Seite Roboter (Autoext. I/O's, Programm angewählt, [/size][size=3]Wo stehst Du im Ablaufdiagramm KUKA, etc....)[/size]


    [size=3]Gruss SJX[/size]

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

    Einmal editiert, zuletzt von SJX ()

  • Der SPS-code würde wahrscheinlich vielen was sagen (unter anderem mir), wenn er vollständig wäre. Da fehlen aber viele Sprungmarken und bei vorhandenen sieht man nicht wie und wann da hingesprungen wird.
    Abgesehen davon ist dieses AWL-Zeug eh so 'übersichtlich' wie meine Assemblerprogramme von vor 30 Jahren (die verstehe ich heute auch nicht mehr) und sollte verboten werden. (Kleine Anmerkung, die ich jedem AWL-Benutzer unter die Nase reiben muss :mrgreen: :biggrins: )

  • So endlich finde ich mal wieder Zeit zum Antworten :)
    Also dass Phänomen das ich eine SAK fahrt machen muss tritt immer dann auf, wenn der Bedienerschutz offen war.
    Ich gehe Seitens der SPS so vor wie im Diagramm von Kuka beschrieben. Ich hänge die Grafik an.
    Das funktioniert auch so. Nur leider nicht nach dem öffnen des Bedeinerschutzes. Dann ist die SAK fahrt nötig im T1.


    SPS.sub:
    &ACCESS RVO
    &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
    $LOOP_MSG[]=" "
    MODE=#SYNC
    $H_POS=$H_POS
    ;Automatik extern
    IF $MODE_OP==#EX THEN
    CWRITE($CMD,STAT,MODE,"RUN /R1/main()")
    ENDIF
    ;ENDFOLD (AUTOEXT INIT)
    ;FOLD TOUCHSENSE INIT
    TS_SubmitInit ( )
    ;ENDFOLD (TOUCHSENSE INIT)
    ;FOLD BACKUPMANAGER PLC INIT
    BM_ENABLED = FALSE
    BM_OUTPUTVALUE = 0
    ;ENDFOLD (BACKUPMANAGER PLC INIT)
    ;FOLD TQM_INIT
    TorqueDefinitions()
    ;ENDFOLD (TQM_INIT)
    ;FOLD USER INIT
    ; Please insert user defined initialization commands


    ;ENDFOLD (USER INIT)
    ;ENDFOLD (INI)


    LOOP
    WAIT FOR NOT($POWER_FAIL)
    TORQUE_MONITORING()
    ;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)
    ;FOLD TOUCHSENSE LOOP
    TS_SubmitLoop ( )
    ;ENDFOLD (TOUCHSENSE LOOP)
    ;FOLD USER PLC
    ;FOLD Runup
    IFNOT $EXT_START THEN
    B_EXT_START=TRUE
    ENDIF
    IF $EXT AND $EXT_START AND $PERI_RDY AND $I_O_ACTCONF AND ($PRO_STATE1==#P_FREE) AND B_EXT_START THEN
    CWRITE($CMD,STAT,MODE,"RUN /R1/main()")
    B_EXT_START=FALSE
    ENDIF
    ;Program cancel bei Verlassen von AUT EXT
    IFNOT $EXT THEN
    B_PROGRAM_CANCEL=FALSE ; Programm cancel nicht aktiv
    ; B_PROGRAM_CANCEL=TRUE ; Programm cancel aktiv
    ENDIF


    IF $EXT ANDNOT ($PRO_STATE1==#P_ACTIVE) AND B_PROGRAM_CANCEL OR I_PLC_ABORT_PROGRAM THEN
    CWRITE($CMD,STAT,MODE,"CANCEL 1")
    B_PROGRAM_CANCEL=FALSE
    ENDIF
    ;ENDFOLD Runup

    ;Limit Override to max. 75%
    ;IF $T2 OR $EXT OR $AUT THEN
    ;IF $OV_PRO>=11 THEN
    ;$OV_PRO=10
    ;ENDIF
    ;ENDIF

    ;ENDFOLD (USER PLC)
    ENDLOOP
    ;FOLD ;%{H}
    ;FOLD
    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


    ;FOLD USER SUBROUTINE
    ; Integrate your user defined subroutines


    ;ENDFOLD (USER SUBROUTINE)
    ;ENDFOLD











    Hier unsere Hauptroutine:


    &ACCESS RVP
    &REL 1
    &PARAM EDITMASK = *
    &PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
    &PARAM DISKPATH = KRC:\R1
    DEF main( )
    ;FOLD INI
    ;FOLD BASISTECH INI
    GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
    INTERRUPT ON 3
    BAS (#INITMOV,0 )
    ;ENDFOLD (BASISTECH INI)
    ;FOLD USER INI
    ;Make your modifications here


    ;ENDFOLD (USER INI)
    ;ENDFOLD (INI)
    ;--- Grundstellungsfahrt starten ---
    INIT ( )

    LOOP

    ; Refernzierung und Bremsentest durchführen
    if I_PLC_Greifer_leer and ($IN_HOME1 or $IN_HOME2 or $IN_HOME3 or $IN_HOME4 or $IN_HOME5) then
    MasRef_Main()
    IF $BRAKETEST_REQ_INT then
    BRAKETESTREQ()
    endif
    ENDIF

    ;FOLD WAIT FOR ( IN 41 'New Command' ) CONT;%{PE}%R 5.5.32,%MKUKATPBASIS,%CEXT_WAIT_FOR,%VEXT_WAIT_FOR,%P 2:, 4:, 5:$IN, 6:41, 7:New Command, 9:CONTINUE
    CONTINUE
    WAIT FOR( $IN[41] )
    ;ENDFOLD

    CONTINUE
    SWITCH I_PLC_Command_Nr
    ........





    Im Ablauf bleibe ich hängen bei der Abfrage nach Pery_Ready



    Ich hoffe Ihr könnt damit etwas Anfangen.

  • Sorry den oben aufgerufenen "INIT()" habe ich vergessen:


    &ACCESS RVO1
    &REL 200
    &PARAM EDITMASK = *
    &PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
    DEF INIT( )
    ;**************************************************
    ; Diese Routine wird bei jeder Initialisierung
    ; der Anlage aufgerufen.
    ; Ohne Initialisierung kann der Roboter nicht
    ; im Automatikmodus verfahren
    ;**************************************************

    Z_InitZaehler=1

    REPEAT

    SWITCH Z_InitZaehler

    CASE 1
    ;--- Check Robot in Home ---

    IF (NOT $IN_HOME1 and not $IN_HOME2 and not $IN_HOME3) THEN
    O_PLC_Message_Nr=7 ;"Robot not in Home"
    HOMING ( )
    ELSE
    O_PLC_Message_Nr=0 ;
    Schrittzaehler=0
    ENDIF
    Z_InitZaehler=2

    CASE 2
    ;--- Initialisieren von Variablen ---

    Z_InitZaehler=3

    CASE 3
    ;--- Initialisierung Kommunikation ---

    O_PLC_Command_Nr_Back=0
    O_PLC_Rdy_For_Operation=FALSE ;Out[33]

    O_PLC_Command_Active=FALSE ;Out [57]

    O_PLC_Command_Nr_Back=0
    O_PLC_Message_Nr=0

    Z_InitZaehler=4

    CASE 4
    ;--- Initialisierung Greifer ---

    Z_InitZaehler=5

    ENDSWITCH

    UNTIL Z_InitZaehler==5

    END


  • Also das Phänomen dass ich eine SAK fahrt machen muss tritt immer dann auf, wenn der Bedienerschutz offen war.
    Ich gehe seitens der SPS so vor wie im Diagramm von Kuka beschrieben.
    Das funktioniert auch so. Nur leider nicht nach dem Öffnen des Bedienerschutzes. Dann ist die SAK fahrt nötig im T1.


    Das heißt also, nach Tür auf und Tür zu ohne das Smartpad angefasst zu haben bleibt der SPS-Ablauf beim Warten auf $peri_rdy=1 hängen?
    Dann vermute ich stark, dass das Signal $drives_on keine steigende Flanke liefert, oder sie kommt zu früh. Das Signal darf erst nach "Schutzzaun zu", also nachdem die Bedienerschutzsignale auf 1 stehen auch auf 1 gehen.

  • Hallo Master_Override,
    Hast Du dich mal geachtet auf den Status des Antriebes und auch mal das Fenster "Motion Conditions" angeschaut im Falle, wenn es nicht weitergeht / hängen bleibst bei Peri_rdy? (s. Attachments)
    Speziell Punkt "Drives Enabled from Safety"?
    Stehen noch Quittiermeldungen am Smartpad an nach Schliessen der Tür? Startest Du mit diesen anstehenden Meldungen extern?
    Kein $Conf_mess zum Quittieren dieser Meldungen bevor Du normalen Ablauf startest?
    Ohne Safety Controller kein $PERI_RDY.


    Gruss SJX

  • Erstmal Danke für die Antworten.


    @ Hermann
    Ich kann die Grundstellungsfahrt erst starten wenn der Bedienerschutz quittiert ist seitens der SPS.
    Bei einem Abbruch, und am Anfang meiner Schrittkette setze ich alle Ausgänge die die Extren Schnittstelle betreffen zurück.
    Auch Drives_on.


    SJX
    Wo kann ich denn die "Motion Conditions" anschauen? Im Handbuch habe ich nichts davon gefunden.


    Es steht Quitt. Fahrfreigabe gesamt an. Normalerweise lässt diese Meldung sich mit Conf. Mess quittieren. Im Fall des offenen Bedienerschutzes allerdings nicht auf Anhieb. Erst wenn ich es zwei mal quittiere. Aber auch dann lassen sich die Antriebe nicht Einschalten.



    @All
    Was mir noch aufgefallen isst, dass wenn ich in Diagnose -> Sicherheitsschnittstellen gehen, Profisafe ein Ausrufezeichen trägt. Hängt wohl mit den Melderäumen zusammen. Einige haben kein grünes Häckchen, sondern ein Fragezeichen.


    Was mir gerade beim Anschauen der Externen Schnittstelle aufgefallel ist, ist dass Antriebe aus (Invers) und Antriebe ein garnicht kommen. Auch nach der SAK fahrt nicht. komischerweise fährt der Roboter aber dann.
    SPS seitig sind meine Ausgänge die folgenden:
    Drives off invers a 20.3
    Drives on a 20.4



    Außerdem steht im von mir geposteten Ablaufdiagramm oben rechts etwas von PGNO-Valid. Was hat es damit auf sich? Ich benutze ja die Cell.src nicht :/


    Vielen Dank im Vorraus für eure Bemühungen!

  • Es wird immer wirrer.


    Ich kann die Grundstellungsfahrt erst starten wenn der Bedienerschutz quittiert ist seitens der SPS.
    Bei einem Abbruch, und am Anfang meiner Schrittkette setze ich alle Ausgänge die die Extren Schnittstelle betreffen zurück.
    Auch Drives_on.


    Ist ja schön und gut, aber entscheidend ist wann das Motor_on auf 1 geht.



    Wo kann ich denn die "Motion Conditions" anschauen? Im Handbuch habe ich nichts davon gefunden.


    Oben auf eines der Kästchen neben dem grünen 'S' tippen. Welches genau weiss ich grad nicht, einfach durchprobieren.



    Na da sieht man doch schon, dass im SPS-Programm ein Bock drin ist, wenn die Ausgänge nicht kommen. Es gilt zu beachten, dass bei der KRC4 das Signal $peri_rdy nicht den wirlichen Zustand der Antriebe angibt, sondern die Zwischenkreisspannung. Das stört häufig.


    Die Ausgangsnummern auf deiner SPS haben hier leider Null Aussagekraft.
    Das mit PGNO-Valid kann ich nicht im kompletten Thread nicht finden.
    Für das Einschalten der Antriebe, das hier anscheinend nicht funktioniert sind die Roboterprogramme komplett irrelevant. Da kann man programmieren was man will, am Verhalten für das Einschalten der Motoren ändert sich nichts.


    An Deiner Stelle würde ich mal das SPS-Programm für das Anstarten lahmlegen, und die Signale von Hand setzen/rücksetzen. Dann siehst Du das besser, wie die Sache funktioniert.

  • Hallo,
    einem der beiden Posts von gestern hatte ich doch das Ablaufdiagramm angehangen. Auf dieser Grafik steht ganz oben etwas zu PGNO_Valid.


    Diese von mir genannten SPS Ausgänge müssten zum Mapping der Kuka Schnittstelle passen (Profisafe).
    Also Byte 20 Bit 2 und 3. Die müssten doch schon gleich sein. Es sind nicht meine wirklichen Ausgänge.
    Die wären dann 520.2 und 520.3


    Und diese Ausgänge kommen schon, wenn ich sie beobachte (Seitens der SPS). Nur halt die Eingänge des Kuka nicht.


    Ich hatte die Schnittstelle schon mal von "Hand" aus Initialisiert. Ich kam zum gleichen Ergebnis. Ich werde es später aber nochmal probieren und die Motion Conditions beobachten. Jetzt wird gerade produziert....



    Vielen Dank für die bisherigen Mühen!


  • Das Signal ist nicht gemappt. Deswegen steht in der EA Übersicht auch kein SYS.


    Edit: Das Signal liegt auf $IN[113].


    Vermutete "verwendete Logik", dass "alle" Systemeingänge hintereinander liegen bei Ihm, würde aber sagen, in Autoext. Konfiguration müsste für $DRIVES_OFF Eingang 100 rein, nicht 113. Langtext in der E/A Liste hat er ja auch so genannt..


    @Master_Override: Wie kam die 113 da rein? Oder was ist Eingang 113?

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

    Einmal editiert, zuletzt von SJX ()

  • HEUREKA!!!! :biggrins:
    Das wars!! Habe den Eingang auf IN100 umgestellt und es geht! Freue mich schon darauf das nächste mal ohne schlechtes Gewissen die Türen öffnen zu können :ylsuper:


    Seit Monaten ärgere ich mich damit rum und es war nur so eine Kleinigkeit... :wallbash:


    Ein Gutes hat das ganze: Ich führe schneller SAK-Fahrten durch als ein Cowboy seinen Revolver ziehen kann :D


    Es wundert mich allerdings sehr das ich ohne Drives_off_invers fahren konnte :kopfkratz:



    Vielen lieben Dank Leute! Ihr habt mir WIRKLICH SEHR geholfen! Ein Hoch auf das Forum! :applaus::danke:

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