Vermutlich ein einfaches Thema
Will über einen Interrupt das programm rücksetzen.
Schreib ich da im aufgerufenen Programm einfach >Resume>
KRC2 Über Interrupt Programm zurücksetzen
- guste
- Erledigt
-
-
Hallo
Richtig. Das RESUME im aufgerufenen Interruptprogramm bewirkt den Rücksprung in die Aufrufebene.
Hier mal ein Beispiel für ein solches Programm:interrupt off 1 ; Interrupt ausschalten
brake ; Bewegung anhalten
wait sec 0 ; Vorlaufzeiger anhalten
resume ; RücksprungGruß,
Olaf -
Danke werd ich dann morgen mal testen.
Will einfach daß das aktuelle Programm mit dem Interrupt abebrochen wird.
So wie unter // Programm zurückstzen (taste ZitterGruß Guste
-
Ähh...ich glaube das geht nicht, wie von OHuuck beschrieben. Hier wird lediglich ein Interruptprogramm ausgeführt, welches ein Unterprogramm abbricht. Dabei wird aber nicht das Hauptprogramm zurückgesetzt!
Habe jetzt gerade keine Zeit. Falls ich nacheher noch Zeit habe poste ich mal was. -
Könnte so gehen. Kann's nicht testen - Hab keinen Robi da.
Hauptprogramm: $IN[1] soll das Programm zuruecksetzen
CodeINTERRUPT DECL 10 WHEN $IN[1] DO PRG_RESET() ;Interrupt deklarieren: Wenn Eingang 1 dann rufe Programm PRG_RESET auf WAIT FOR NOT $IN[1] ; Sicherstellen, das Interrupt-Bedingung nicht gegeben! INTERRUPT ON 10 ; Interrupt einschalten
Das Interruptprogramm (setzt FLAG[1], welcher später im Submit abgefragt wird)
CodeDEF PRG_RESET() INTERRUPT OFF 10 ; Interrupt ausschalten um Mehrfachaufruf zu verhindern BRAKE; Bewegung anhalten $FLAG[1]=TRUE ;Merker setzen für "Programm zuruecksetzen" WAIT FOR FALSE ;False wird nie true, Programm läuft nicht weiter END
Im Submit (Irgendwo im LOOP...ENDLOOP):
Code
Alles anzeigenIF ($FLAG[1]) AND ($PRO_STATE1==#P_ACTIVE) THEN ;Reset soll ausgeführt werden und Programm aktiv CWRITE($CMD,STAT,MODE,"STOP 1") ;Stoppen ENDIF IF ($FLAG[1]) AND ($PRO_STATE1==#P_STOP) THEN ;Reset soll ausgeführt werden und Programm gestopptr CWRITE($CMD,STAT,MODE,"RESET 1") ;Zuruecksetzen ENDIF IF ($PRO_STATE1==#P_FREE) OR ($PRO_STATE1==#P_RESET) THEN ;kein Programm angewählt oder Programm zurueckgesetzt $FLAG[1]=FALSE ;Reset wurde ausgeführt - Merker auf FALSE ENDIF
Evtl. noch ein wenig ausschmücken...
-
Danker Polterer da hab ich ja was zum tippseln. Aber denke das ist die Lösung.
-
Dann schreib mal, wenn's geklappt hat. Hab ich so aus'm Bauch raus gecoded. Wie gedagt, ob's so klappt weiß ich nicht.
-
So wie's der Polterer vorschlägt wird es wohl auch funktionieren, aber der erste Ansatz funktioniert ebenso. Wurde von mir schon in mehreren Anlagen (denke mal dürften deutlich über 100 sein) erfolgreich eingesetzt.
Entscheidend ist dabei wie man das Hauptprogramm aufbaut:
- Prozedur verwenden wie von OHuuck skizziert.
- Endlosschleife vor der man den Interrupt für den Reset deklariert,
- in dieser Endlosschleife ruft man nun das eigentliche Hauptprogramm auf, und fertig.
Mir ist diese Lösung lieber, da sie ohne globale Variable mit 'Seiteneffekten', die im Submit ausgelöst werden auskommt. -
-
Ahhh. Hab's kapiert. Einfach aber wirkungsvoll.
-
Also hier für die Begriffsstutzigen (hab' ich's so schlecht erklärt?)
Code
Alles anzeigenDEF haupt( ) INI INTERRUPT DECL 1 WHEN $in[E_RESET]==TRUE DO RESTART ( ) Loop ; falls man fähig ist sowas zu programmieren: GRUNDSTELLUNGSFAHRT() ; Hauptprogramm MAINLOOP ( ) ; Aufruf der Hauptschleife, wegen Interrupt 1 endloop END ; of hauptprogramm DEF MAINLOOP ( ) INTERRUPT ON 1 ; Hier das Hauptprogramm ; Meistens auch wieder eine Endlosschleife END DEF RESTART ( ) BRAKE ; Bewegung abbrechen INTERRUPT OFF 1 wait sec 0 RESUME ; Ruecksprung in das Aufrufende Programm (dort wo Interrupt 1 deklariert ist) END
-
...
Zitat; falls man fähig ist sowas zu programmieren:
??? ??? -
@titan72: Ich glaube er mein die Grundstellungsfahrt...ist ja nicht immer so einfach.
-
Jo genau,
man sieht oder hört manchmal von so seltsamen Dingen die sich Grundstellungsfahrt nennen, und beim näheren Hinsehen dann eher Crashfahrt oder Garnichtfahrt heissen sollten. War halt etwas Ironie oder Sarkasmus dabei, war niemand persönlich gemeint. -
... , !!!
-
-
Nun mal nicht gleich übertreiben. DAs Lehrbuch muss erst noch geschrieben werden.
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