Interrupts

  • Hallo,


    ich habe ein paar Fragen zum Thema "Interrupts":


    - Kann ich als Auslösekriterium für einen Interrupt etwas von der Form 'VAR1 OR VAR2 OR ... OR VARN' - also zusammengesetzte Boolsche Ausdrücke - verwenden?


    - Wie kann ich es anstellen, das nieder- oder gleichpriore Interrupts sich gegenseitig unterbrechen können, OHNE dass der bisherige Interrupt (und evtl. von diesem aufgerufene Unterfunktionen) beendet werden?
    Beispiel:
    gegeben Interrupt1, der ausgelöst wird, wenn Bedingung1 wahr wird.
    Folgender Ablauf:
    Hauptprogram -> Bedingung1 wird wahr -> Interrupt1Funktion wird aufgerufen -> evtl. Unterprogramme -> währenddessen wird Bedingung1 irgendwie wieder falsch -> und dann aber nochmal wahr (noch innerhalb des Interrupts) -> jetzt sollen alle evtl noch auszuführenden Bewegungen der Interrupt1Funktion abgebrochen und die Interrupt1Funktion von neuem von ganz vorne aufgerufen werden.


    Es wird so sein, dass das keine Endlosschleife ergibt!!! Wird die Bedingung1 irgendwann einmal nicht mehr wahr, dann kann die Interrupt1Funktion zuende bearbeitet werden. Danach gehts ins Hauptprogramm zurück.
    Angewendet soll das ganze hier:
    Arbeitsbereiche und Ausweichen


    Danke für eure Antworten

  • Schritt für Schritt zum Roboterprofi!
  • Hi,


    hier ein kurzer Auszug aus der Deklaration von Interrupts. Hier kann man sehen was zum Auslösen des Ereignisses benutzt werden darf und was nicht.
    Bei der anderen Frage kann ich dir leider nciht helfen.


    mfg
    Lubi


    GLOBAL INTERRUPT DECL Priorität WHEN Ereignis DO Unterprogramm


    Ereignis BOOL Logischer Ausdruck, der das Unterbrechungsereignis definiert. Zugelassen sind:
    • eine boolsche Konstante
    • eine boolsche Variable
    • ein Signalname
    • ein Vergleich
    • eine einfache logische Verknüpfung: NOT, OR, AND, oder EXOR
    Unzulässig sind
    • Strukturkomponenten
    Unterprogramm Name (und Parameter) des Interruptprogramms, das bei Auftreten des Ereignisses abgearbeitet werden soll

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Hallo,


    der erste Teil lässt sich mit $cycflag lösen. Einmal am Programmanfang die Zuweisung:
    $cycflag[1]=$Workspace[1].state OR .. $Workspace[n].State
    Die Zuweisung wird dann zyklisch ausgeführt.


    Zum Abbrechen gibt es nur den RESUME Befehl. Der bricht eine Bewegung ab und setzt de Satzzeiger in die Ebene mit der Interrupt Deklaration zurück, einen Satz weiter wie den letzen Absprung. Soweit ich mich erinnere kann der RESUME aber keine Interruptbewegungen unterbrechen, so das deine Ausweichstrategien in den normalen Hautlauf müssen. Dein Programm könnte könnte dann in etwa aussehen:


    Interrupt DECL 10 WHEN $CYCFLAG[1] DO ResumeUP()
    Interrupt ON 10


    NormaleBewegung()
    Ausweich()
    Ausweich()
    Ausweich()
    Ausweich()
    Ausweich()
    Ausweich()


    DEF ResumeUP()
    BRAKE
    RESUME
    END


    Unterwegs solltest du dir noch merken, in welcher Strategie du zuletzt warst, bzw. wenn eine Stratetegie zum Ende geführt hat.


    Gruss DiDi

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