Variabler Interrupt

  • Hallo,


    der Roboter soll, je nach Position, durch ein anderes Signal interruptet werden (immer das gleiche Programm). Meine erste Idee war:


    Code
    config:
    SIGNAL Interruptsensor[1] $IN[11]
    SIGNAL Interruptsensor[2] $IN[12]
    SIGNAL Bereich $IN[1] TO $IN[8]
    
    im Programm:
    INTERRUPT DECL 15 WHEN Interruptsensor[Bereich] DO stop()

    So lassen sich die Signale aber leider nicht definieren.

    Zweite Idee war nur das benötigte Signal zu "vereinbaren":

    Code
    SWITCH Bereich
       CASE 1
          GLOBAL SIGNAL Interruptsensor $IN[11]
       CASE 2 
          GLOBAL SIGNAL Interruptsensor $IN[12]
       DEFAULT
          GLOBAL SIGNAL Interruptsensor FALSE
    ENDSWITCH

    Jedoch schließen sich die Orte, an denen man SIGNAL-Vereinbarungen und Switch/Cases nutzen kann ja aus, korrekt?

    Und ein Switch/Case mit den Interrupts selbst zu programmieren funktioniert genauso wenig.

    Das einzige was funktionieren könnte ist die erste Idee jedoch ohne Signalzuweisung:

    Code
    INTERRUPT DECL 15 WHEN $IN[10+Bereich] DO stop()

    Habt ihr eine andere Idee?


    Gruß

  • Schritt für Schritt zum Roboterprofi!
  • Versuch mal sowas :

    Code
    ;im dat:
    SIGNAL isensor1 $IN[11]
    SIGNAL isensor2 $IN[12] 
    
    ; im src
    $cycflag[1]=(isensor1 and (bereich==1)) or (isensor2 and (bereich==2))
    
    INTERRUPT DECL 15 WHEN $cycflag[1] DO stop()
  • Danke für den Hinweis. Hatte ich ganz vergessen.

    Gibt es eine zugehörige Doku? Suche hautsächlich die Aktualisierungsrate dieser Flags bzw. mit welchem .sub bzw. Interpreter diese aktualisiert werden. Könnte das KO Kriterium sein.

  • Die CYCFLAGs werden im IPO-Takt (12ms) aktualisiert. Somit hätte ich durch ein CYCFLAG (wenn ich es richtig sehe) eine Verzögerung von bis zu 12ms im Gegensatz zur Verwendung eines $INs. Somit versuche ich es erst hiermit:

    Code
    INTERRUPT DECL 15 WHEN $IN[10+Bereich] DO stop()

    Es sei denn es gibt noch eine Andere Idee eurerseits.

    Gruß

  • in DAT file:


    SIGNAL Bereich $IN[1] TO $IN[8]

    DECL INT Bereich_Alt = 0


    in SRC file:


    INTERRUPT DECL 15 WHEN Bereich<>Bereich_Alt DO Stop()

    ;....


    DEF Stop()

    ; bearbeite Bereich

    IF Bereich ....

    ;STOP...!

    ELSE

    ; CONTINUE....!

    ENDIF


    ; update

    Bereich_Alt = Bereich


    END



    oder


    SIGNAL Bereich $IN[1] TO $IN[8]


    INTERRUPT DECL 15 WHEN Bereich<>0 DO Stop()


    DEF Stop()

    ; bearbeite Bereich

    SWITCH Bereich

    CASE 'B000000001'

    ;STOP...!

    CASE 'B000000010'

    ;

    CASE 'B000000100'

    ;.....


    ENDSWITCH

    END

    Einmal editiert, zuletzt von panic mode ()

  • wie Panic mode schon geschrieben hat kannst dann auch mit B_AND auf jedes bit reagieren




    Gruß Loipe

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