Ungültige Programmstruktur für Resume

  • hi,


    in meinem roboterprogramm, welches schon fehlerfrei lief, taucht heute das erste und auch mehrere mal das problem auf, dass ich ein interupt aufrufe, diesen abarbeite und dann per "resume" wieder zurückspringen möchte, der roboter mir aber sagt - "unzulässige programmstruktur für resume" a) woran kann das liegen und b) wie kann ich abhilfe schaffen. bin grad beim produktionsstart und dies kommt mir sehr ungelegen.


    rob typ : kr 180-2 2000
    softwareversion 5.4.90

    Den Roboter "in seinem Lauf hält weder Ochs noch Esel auf!"

  • Schritt für Schritt zum Roboterprofi!
  • Meldungsbeschreibung für 1584:
    Als der Befehl 'RESUME' abgearbeitet wurde, verwies der Vorlaufzeiger auf die Ebene, in welcher der Interrupt deklariert wurde.


    Hinweis:
    - 'RESUME' darf nur mit der Unterprogrammtechnik verwendet werden.
    - Der Interrupt darf nicht in der Ebene ausgelöst werden, in welcher er deklariert wurde.
    - Bei Abarbeitung von RESUME muss $ADVANCE=0 sein.


    Abhilfe:
    - Programm Reset.
    - Programm entsprechend ändern.

    Wer nach allen Seiten offen ist kann nicht ganz dicht sein

  • ein wenig klugscheiss,weils mich selbst mal irritiert hat:
    bevor das interruptprogramm abgearbeitet wurde muss $advance=0 gesetzt werden.
    Also z.b in der letzten Zeile des Interruptprogramms.



    Um den Interrupt im Modul DoSomthing() nicht vorzeitig abzubrechen, bedarf es noch vor Interrupt Off 10
    eines Vorlaufstops
    zb: sowas wie Wait Sec 0 oder $advance=0


    So müsste es auf jeden Fall klappen....
    Hoffe ich...

  • herzlichen dank erstmal...


    hier mal der betreffende code:


    wenn ich soma richtig verstehe würde im unterprog soetwas wie "$ADVANCE=3" fehlen?! wenn dem so ist, frage ich mich warum das prog schon fehlerfrei lief?

    Den Roboter "in seinem Lauf hält weder Ochs noch Esel auf!"

  • Hallo,
    der Programmauszug ist jetzt mal nicht allzu erhellend, da fehlen die Interruptdeklaration,
    der Aufruf des Unterprogramms, die Bewegungsbefehle ...


    Aber: Interrupts können ja zu unterschiedlichen Zeiten auftauchen, also sind die Bedingungen
    auch unterschiedlich, daher kann es schon sein, dass die Geschichte eine Zeit lang gut geht.


    Entscheidend ist (wie schon gesagt wurde), dass der Vorlaufzeiger zum Zeitpunkt des Auftretens
    des Interrupts nicht in der Ebene steht, in der der Interrupt deklariert wurde.
    Daher ist meiner Meinung nach das $Advance=0 im Beispiel von Soma nicht ganz richtig. Das Beispiel
    funktioniert trotzdem, da VOR dem Rücksprung aus DoSomething() ein Vorlaufstop ausgelöst wird,
    dadurch wird sichergestellt, dass der Interrupt nur solange auftreten kann, wie der Vorlaufzeiger
    noch im DoSomething steht.


    Würde da eher zu sowas raten (oder falls vertretbar $advance in DoSomething gleich auf 0 setzen):



    Hermann

  • Hallo,


    ich würde prüfen, dass das Ereignis, z. B. Sensorpegel, bei scharfmachen des Interrupts nicht bereits den Zustand hat, auf den der Interrupt auslösen soll. Ich meine, mich zu erinnern, dass ich sowas früher mehrmals hatte. Das ist dann auch der Grund, warum das Programm bisher unauffällig lief. Bei Suchfunktionen z. B. Abfrage, ob Sensor o.ä. bereits geschaltet, und nur, wenn noch nicht geschaltet, den Interrupt ON, sonst Suchfunktion unterdrücken.


    Gruß


    PA

  • dank' euch... da hab ich jetzt schon ein paar ansätze. ich werde dem nachgehen. wenn ich es nicht vergesse, gebe ich auch noch rückmeldung!
    :danke:

    Den Roboter "in seinem Lauf hält weder Ochs noch Esel auf!"

  • Hallo.


    Habe das gleiche Problem mit Conveyor Tech. Robi erreicht maximalen Bandabstand und ist auf dem letzten Punkt auf dem Conveyor. Habe versucht den Vorlaufzeiger
    wie im Beispiel von Hermann zu stoppen ($ADVANCE=0).


    DEF Abbruch()
    INTERRUPT OFF 10
    BRAKE
    $ADVANCE=0
    RESUME
    END

    Kommt der Robi in die Abarbeitung des Interrupts bleibt er mit Fehlermeldung 1425
    "Anweisung unzulässig" stehen, weil Vorlaufzeiger schon im Hauptprogramm. WAIT
    SEC 0 funktionierte auch nicht.


    :kopfkratz:


    Hat vielleicht noch jemand einen Tipp ?

  • Hallo Robotnix,
    die Anmerkung von Herrmann bezog sich nicht auf $ADVANCE=0 im Unterprogramm Abbruch(), sondern darauf, dass in dem Unterprogramm, das nach der Interrupt-Deklaration aufgerufen wird (DoSomething() im Beispiel von Herrmann) am Ende des Unterprogramms ein Vorlaufstop ausgelöst werden muss, z.B. mit 'WAIT SEC 0' oder 'WAIT SEC 0.1'.

  • Hallo,
    genau so ist es.


    Das $advance=0 hatte ich nur vom Vorposter kopiert.
    Das kann man in der Interrupt-Routine getrost weglassen, da ist es
    nämlich viel zu spät dafür, denn da kann der Vorlaufzeiger
    schon lange über das Ende des Unterprogramms, in dem
    der Interrupt ausgelöst wird, hinausgewandert sein.
    Und zurückholen kann man den nicht mehr :(


    Hermann

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