Anfängerfragen... Abbruchbedinung.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Ulrich

Freitag 22. August 2003, 21:52

Hi!

Ich bin immernoch blutiger Anfänger in Sachen Python, daher sorry für die triviale(n) Frage(n) :-)

Ziel ist es, eine automatische Zugsteuerung mittels rcsh zu schreiben, die relativ speziell auf eine (meine) Anlage abgestimmt ist.

Da die ganze Geschichte viele Rückmeldungen einliest, und erst auf diese Rückmeldungen entsprechend reagiert, suche ich eine Möglichkeit das Programm mit einer Taste (oder Ctrl-C) abzubrechen, aber dann als letzten Befehl Power(p=0) auszuführen, damit damit die komplette Anlage Stromlos wird.
Geschieht das nicht, laufen alle Loks mit der zuletzt gesendeten Geschwindigkeit absolut 'Kopflos' weiter, und man hechtet zur Steckdose um das Schlimmste zu verhinden:-)

Ich könnte eigentlich in jeder Rückmelde/Entscheidungsbfrage eine weitere Abfrage einbauen, die immerwieder aufs neue den Tastendruck zum Abbruch erwartet, aber das wird sehr schnell sehr unübersichtlich....

Hier mal ein Codeschnipsel für eine Rangierfahrt:

Code: Alles auswählen

from rcsh import *
import time

w1 = turnoutM(8)
k1 = feedbackS88(1)
k2 = feedbackS88(2)
k3 = feedbackS88(3)

Connect()

print k1.getState()
print k2.getState()
print k3.getState()

lok = locoM4(212)
lok.setDirection(1)
lok.send()
lok.setSpeed(0)
lok.send()
lok.setFunction(1)
lok.send()
lok.setF(1,1)
lok.send()
lok.setF(2,1)
lok.send()
lok.setF(3,0)
lok.send()
time.sleep(1)
lok.setSpeed(3)
lok.send()
w1.set()

r = k1.wait(1,50)
if r==1:
    lok.setSpeed(0)
    lok.send()
    time.sleep(1)
    lok.setDirection(0)
    lok.send()
    lok.setSpeed(0)
    lok.send()
    print "1.Halt Fahrtrichtung gewechselt - Stop"
    w1.reset()
    print "Weiche gesetzt (gerade)"
    time.sleep(1)
    lok.setSpeed(3)
    lok.send()
    
    y = k2.wait(1,50)
    if y==1:
	lok.setSpeed(0)
	lok.send()
	print "Halt nummer Zwei"
	lok.setDirection(1)
	lok.send()
	lok.setSpeed(0)
	lok.send()
	print "Fahrtrichtung gewechselt"
	time.sleep(3)
	lok.setSpeed(3)
	lok.send()
	print "Faehrt los"
        z = k1.wait(1,50)
	if z==1:
	    lok.setSpeed(0)
	    lok.send()
	    print "Angekommen Halt 3"
	    time.sleep(1)
	    lok.setDirection(0)
	    lok.send()
	    lok.setSpeed(0)
	    lok.send()
	    w1.set()
	    lok.setSpeed(3)
	    lok.send()
	    a = k3.wait(1,50)
	    if a==1:
		lok.setSpeed(0)
		lok.send()
		lok.setDirection(1)
		lok.send()
		lok.setSpeed(0)
		lok.send()
		print"Anfang"
    if y==0:
        print "Stop"
Hat irgendjemand eine Idee wie ich 'einfach' ein Notaus einbaue? Wie gesagt, der Aufruf Power(p=0) wäre gut...

Heissen Dank für Tips und Anregungen.

Bis denn,

Ulrich
Ulrich

Freitag 22. August 2003, 21:53

... Sorry, wieso ist denn das Ganze linksbündig? Naja, da muß man jetzt durch.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Freitag 22. August 2003, 23:07

Ulrich hat geschrieben:... Sorry, wieso ist denn das Ganze linksbündig? Naja, da muß man jetzt durch.
Du musst das ganze in [ code ] .... [ /code ] Tags einschließen (ohne die Leerzeichen), dann geht's. Ich habe dass mal für dich gemacht.

Hmm, schon mal daran gedacht, so ein schickes grafisches Frontend darüber zu stülpen? Muß ja nicht viel sein. Ein Textfeld für die Messages und ein Button mit dem man das ganze stoppen kann. Sollte in ein bis zwei Stunden Fertig sein.

Übrigens, mit was für einem Betriebssystem arbeitest du?

Hans
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Freitag 22. August 2003, 23:34

Hi Ulrich,

schau Dir mal das Modul atexit an. http://www.python.org/doc/current/lib/m ... texit.html

Gruß

Dookie
Gast

Samstag 23. August 2003, 10:50

hans hat geschrieben:
Ulrich hat geschrieben:... Sorry, wieso ist denn das Ganze linksbündig? Naja, da muß man jetzt durch.
Du musst das ganze in [ code ] .... [ /code ] Tags einschließen (ohne die Leerzeichen), dann geht's. Ich habe dass mal für dich gemacht.

Hmm, schon mal daran gedacht, so ein schickes grafisches Frontend darüber zu stülpen? Muß ja nicht viel sein. Ein Textfeld für die Messages und ein Button mit dem man das ganze stoppen kann. Sollte in ein bis zwei Stunden Fertig sein.

Übrigens, mit was für einem Betriebssystem arbeitest du?

Hans
Über das grafische Frontend könnte man später nochmal nachdenken. Wenn dann sollte es nur auf ncurses beschränkt sein, da ich möglichst dort nicht unter X arbeiten möchte.
Betriebssystem ist Linux auf Debian Basis.

Was mir gerade als Stichwort eingefallen ist, und noch keine Ahnung habe WIE man das realisiert:
Könnte man nicht einen Thread im hintergrund starten, der nur auf eine Tastatureingabe wartet, dann sofort an den Server Power'null' sendet, den ausgeführten Code stoppt und anschliessend evt. den Urspungszustand (der Anlage) herstellt?

Bis denn,

Ulrich
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Samstag 23. August 2003, 12:55

Hallo,
eine simple Lösung ist folgende:

Code: Alles auswählen

import sys, time
try:
    for i in range(10):
        print i
        time.sleep(1)
except KeyboardInterrupt:
    print 'aborted!'
    sys.exit(1)
print 'done!'
Die for-Schleife simuliert hier das Hauptprogramm, für "print 'aborted!'" kannst Du eigenen Aufräum-Code reinschieben.

Abbrechen tust Du unter UNIX mit CTRL-C, Windows weiß ich jetzt gerade nicht.

Der Nachteil ist, daß diese Methode mit GUIs sicher nicht funktionieren wird.

Viel Glück
Jörg
"Sie sind nicht berechtigt, unrechtmäßige Kopien dieses Datenträgers zu erstellen." - Microsoft-Weisheit auf einer CD von MS-VisualC++-6.0
Ulrich
User
Beiträge: 1
Registriert: Samstag 23. August 2003, 10:52
Wohnort: Ostwestfalen/Lippe
Kontaktdaten:

Samstag 23. August 2003, 17:40

joerg hat geschrieben:Hallo,
eine simple Lösung ist folgende:

Code: Alles auswählen

import sys, time
try:
    for i in range(10):
        print i
        time.sleep(1)
except KeyboardInterrupt:
    print 'aborted!'
    sys.exit(1)
print 'done!'
Die for-Schleife simuliert hier das Hauptprogramm, für "print 'aborted!'" kannst Du eigenen Aufräum-Code reinschieben.

Abbrechen tust Du unter UNIX mit CTRL-C, Windows weiß ich jetzt gerade nicht.

Der Nachteil ist, daß diese Methode mit GUIs sicher nicht funktionieren wird.

Viel Glück
Jörg
Das es mit Guis nicht geht, wäre egal. Muß ich gleich mal testen. Vielen Dank!

Bis denn,

Ulrich
Bis denn,

Ulrich
Antworten