Grundstellungsfahrt funktioniert sporadisch nicht

  • Hallo zusammen,


    ich hab mein Programm (KSS8.7.1) bzw. Grundstellungsfahrt/Rückzugstrategie wie folgt aufgebaut:


    Im Main wird über Interrupt 9 das GST() aufgerufen:

    Code
    Main()
        SPTP Home
        INTERRUPT DECL 9 WHEN $IN[50] DO GST()
        INTERRUPT ON 9
    
        .. Aufrufe Unterprogramme
    END
    
    DEF GST()


    Die UP sind wie folgt aufgebaut:


    Das funktioniert soweit auch.

    Nur manchmal bleibt das UP1 aktiv wenn Eingang 50 kommt. :/


    Hängt es evtl. damit zusammen dass er im Programm bei BRAKE steht?


    Wie handhabt ihr sowas?

  • Schritt für Schritt zum Roboterprofi!
  • Da gibt es verschiedene Möglichkeiten…hab mal eins aus dem Forum rausgezogen…


    def main()

    INTERRUPT DECL 1 WHEN Grundstellungseingang DO ISR_home( )

    loop

    fahrtaufhome()

    maintask()

    endloop

    end



    def maintask()

    loop

    ; Abarbeitung der Aufgaben

    ; z.Bsp. immer nur eine Aufgabe

    Aufgabe1()

    endloop

    end



    def aufgabe1()

    Bla …bla

    end



    def isr_home()

    brake

    resume

    end



    def fahrtaufhome()

    grundstellungsfahrt…

    end

  • Warum schreibst du $IN[90] zuerst in ein CYCFLAG? Aber auch egal.

    Kann es sein, dass wenn du den Interrupt einschaltest die Bedingung bereits erfüllt ist? Sprich $CYCFLAG[10] ist schon TRUE? Dann würde der Interrupt nicht auslösen.


    Sollte also so aussehen:

    Code
    UP1()
        $CYCLEFLAG[10] = $IN[90] ; Fahrfreigabe
        INTERRUPT DECL 20 WHEN NOT CYCFLAG[10] DO Stop()
        WAIT FOR NOT $CYCFLAG[10] ;Warten bis Bedingung nicht erfüllt
        INTERRUPT ON 20

    Ist $IN[90] die Fahrfreigabe der AutExt-Schnittstelle?

    Greetings, Irrer Polterer!

    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.


    Life is a beta version. Full of bugs and no Manual.

  • Servus IrrerPolterer,


    das CycleFlag[10] steht als NOT würde passen. Aber wie du schon sagst würde ich den Eingang $IN[90] direkt nehmen ohne das Cycleflag.


    al3x:


    Schau mal ob der $IN[50] nicht gleichzeitig mit $IN[90] kommt. Als erstes würde ich $IN[90] direkt nehmen ohne CycleFlag und dann in der Steuerung erst den $IN[90] kommen lassen und ein Cyclus Später den $IN[50]. Am besten machst du in die Bedingung für den $IN[50] (in der SPS) den $IN[90] als UND mit rein dann müsste es passen.


    Gruß und schönes WE

  • Wozu soll diese Zeile in IN DEF STOP() denn gut sein? Cycflag[10] muss ja true sein, sonst würde der Interrupt ja gar nicht ausgelöst:


    WAIT FOR $CYCFLAG[10]


    Alles in allem finde ich deine Lösung sehr "unsauber". Ich mache das bei jeder Anlage ähnlich wie von Team Rosario beschrieben.

    Greetings, Irrer Polterer!

    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.


    Life is a beta version. Full of bugs and no Manual.

  • VIelen Dank schonmal für die vielen Antworten.

    Das CycleFlag hab ich gebildet um nur einmal pro Unterprogramm den Eingang anpassen zu müssen.
    Hab ich nun aber mal gelöscht und direkt den Eingang verwendet.


    IrrerPolterer: Die Fahrfreigabe soll nicht nur einmal Abgefragt werden, sondern über den ganzen Fahrweg, deshalb DEF Stop()


    Ich teste jetzt mal die Verzögerung vom Eingang 90 zum Eingang 50 ob das Problem dann immer noch besteht...

  • Ich bringen nun zuerst IN[90] und 1sec. später IN[50]. Funktioniert leider trotzdem nicht.

    Das eigentlich Programm läuft weiter und reagiert nicht auf den Interrupt 9, welcher 1sec. später kommt... :/

  • Ich bringen nun zuerst IN[90] und 1sec. später IN[50]. Funktioniert leider trotzdem nicht.

    Das eigentlich Programm läuft weiter und reagiert nicht auf den Interrupt 9, welcher 1sec. später kommt... :/

    Mal so aus dem bauch heraus.....

  • ich denke es liegt am Vorlaufzeiger. Hab es nun so probiert:

    Code
    UP1:
    CONTINUE
    INTERRUPT DECL 20 WHEN NOT $IN[90] DO StopMove()
    WAIT FOR  ( $IN[90] )
    INTERRUPT ON 20
    $ADVANCE=3
    Code
    DEF StopMove()
    INTERRUPT OFF 20
    BRAKE
    WAIT FOR  ( $IN[90] )
    INTERRUPT ON 20
    RESUME
    $ADVANCE=0
    END


    Er springt dann aber immer (obwohl IN 90) da ist in der StopMove und bleibt mit "Unzulässige Programmstruktur für RESUME" stehen.

  • Servus,


    die Deklaration des Interrupts muss eine Eben höher gemacht werden sonst Funktioniert der Resume nicht.

    D.h. du musst den Interrupt vor dem UP1 deklarieren, dann springst du in UP1, dann Funktioniert auch der Resume.


    Gruß

  • ich kapiers nicht. Im Vorschlag von woodys ist doch auch das DECLARE im Main und ganz unten in der gleichen Ebene das RESUME.

    Wenn ich im MAIN den Interrupt Deklariere mit dem Aufruf StopMove() muss ja StopMove auch im Main Programm vorhanden sein, und nicht im UP :|:?:

  • Servus,


    Main Programm:

    Code
    DEF MAIN()
    
    INTERRUPT DECL 20 WHEN NOT $IN[90] DO StopMove()
    INTERRUPT DECL 9 WHEN $IN[50] DO GST()
    WAIT FOR  ( $IN[90] )
    INTERRUPT ON 20
    INTERRUPT ON 9
    $ADVANCE=3
    UP1()
    END

    Das StopMove und GST machst du wie oben. Das funktioniert dann so.


  • ich kapiers nicht. Im Vorschlag von woodys ist doch auch das DECLARE im Main und ganz unten in der gleichen Ebene das RESUME.

    Wenn ich im MAIN den Interrupt Deklariere mit dem Aufruf StopMove() muss ja StopMove auch im Main Programm vorhanden sein, und nicht im UP :|:?:

    Nein das ist nicht die selbe ebene!

    Sobald du in ein UP drin bist…bsp.(Up1)…bist du eine ebene tiefer.

    Durch das resume brichst du die laufende UP ab ….beendest UP1 …


    Dann stehst du hier :


    UP1()

    Hier 🙋🏻‍♂️Da wo der interrupt definiert ist

    UP2

  • Nochmal langsam, ich glaub wir haben aneinander "vorbeigeredet".

    Ich möchte mit Interrupt 20 StopMove() das UP ja garnicht abbrechen sondern nur anhalten bis Fahrfreigabe wieder gesetzt ist. Dann fährt Roboter weiter.

    Das Funktioniert auch.


    Der Interrupt 9 GST() funktioniert soweit auch.


    Problem ist nur dass wenn Störung ist und Fahrfreigabe weg geht, steht Roboter in StopMove. Nur möchte ich aber von dort nicht weitermachen sondern über Interrupt 9 das GST() Programm aufrufen.

    Das müsste doch auch irgendwie funktionieren. Oder geht das gar nicht?

  • Wenn du von dort nicht weitermachen willst…wo dann?

    Probiere doch mal meinen code aus?


    Wenn dein Eingang 50 kommt und fahrfreigabe da ist in stoppmove kann man es doch ganz bequem aufrufen…


    Was genau dein Vorhaben ist…ist ja auch nicht ganz klar..

    Andere könnten vielleicht auch mal helfen wenn man mal einen kompletten code sehen könnte

  • ich hab deinen Code auch schon getestet, aber du hast bei StopMove auch RESUME drin. -> UP wird abgebrochen


    Mein Vorhaben ist eigentlich ganz einfach:

    Für jedes UP gibts eine Fahrfreigabe der SPS. Fehlt das Signal bleibt Roboter stehen. Kommt Signal wieder fährt Roboter weiter.

    Außerdem muss von jeder Position aus eine Grundstellungsfahrt möglich sein.

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