[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
timing-Probleme bei rcsh und mehreren Threads
Hallo Gemeinde, hallo Peer
Ich hab mich jetzt daran gemacht, ein wenig in rcsh
http://www.griebel-net.de/peer/rcsh.html
zu programmieren.
Die Rückmeldekontakte werden wunderbar eingelesen, und bedingte Kommandos
werden bei Passieren des entsprechenden Rückmelders sicher ausgeführt.
Wenn ich jedoch zwei Threads aufmache, werden die
Befehle immer ein Rückmeldesignal zu spät ausgeführt werden.
Hat jemand eine Idee, warum die Befehle so spät ausgeführt werden, und wie
man das ändern kann?
Jeder Hinweis ist hochwillkommen.
nochmals vielen Dank an die DDL-DDW-Aktivisten
Grüsse Thomas Wille
PS:
Als Beispiel folgt die Funktionsbeschreibung und der Output meines
Scripts thread2.py mit meiner Beschreibung, was wirklich passiert.
Danach folgt noch das Listing des erzeugenden Scripts, sowie die
include-Datei
Funktionsbeschreibung
In dem Programm sollen E10 und V60 in 5 Sekunden Abstand hinterherfahren.
3 Sekunden nachdem E10 den Rückmeldekontakt r überfährt, soll die
Fahrstrasse az für E10 geschaltet werden. 3 sekunden, nachdem V60 den
Kontakt r passiert hat, soll die Fahrstrasse ar geschaltet werden, sodass
V60 über a noch einmal über den Kontakt r fährt.
E10 fährt inzwischen über z und w nach t, wo sie den gleichnamigen
Rückmeldekontakt auslöst, die Fahrstrasse wv schaltet, und stoppt.
Durch Überfahren des Kontaktes r schaltet sich V60 den Weg az frei, der sie
über w nach v führt. Dort wird der gleichnamige Rückmeldekontakt ausgelöst,
der V60 stoppt.
Ausgabe des rcsh-Programmes Was passiert wirklich
Thread 1 gestartet
Thread 1: Rückmelder r aktiv
Thread 1: Fahrstrasse wt aktiviert passiert
Thread 2 gestartet
Thread 1: Fahrstrasse az aktiviert nichts, nada, niente
Thread 2: Rückmelder r aktiv
Thread 2: Fahrstrasse ar aktiviert Fahrstrasse az aktiviert
Thread 1: Rückmelder t aktiv
Thread 1: E10 gestoppt Fahrstrasse ar aktiviert
Thread 2: Rückmelder r aktiv (manuell)
Thread 2: Fahrstrasse az aktiviert E10 gestoppt
Thread 2: Fahrstrasse wv aktiviert passiert
Thread 2: Rückmelder v aktiv
Thread 2: V60 gestoppt fährt weiter
Das Programm ist beendet
==============================================================================
Ende Ausgabe und Kommentare
===============================================================================
Datei thread2.py
#!/usr/bin/python -O
from include import *
import threading
import sys
import time
Connect(host='stellwerk') # IP 192.168.1.6, mein Eisenbahn-Server
Power()
we()
we()
ar()
E10.setSpeed(6)
E10.setFunction(1)
E10.send() # Wir fahren schonmal los
time.sleep(5)
V60.setSpeed(7)
V60.setFunction(1)
V60.send() # 5 sekunden später...
def thread1():
print "Thread 1 gestartet"
rr = fr.wait(1,120)
if rr==1:
print "Thread 1: Rückmelder r aktiv"
wt()
wt() # zweimal ist sicherer
print "Thread 1: Fahrstrasse wt aktiviert"
time.sleep(1) # dies ist ein langer Rückmeldekontakt
threading.Thread(target=thread2).start()
time.sleep(2)
az()
print "Thread 1: Fahrstrasse az aktiviert"
rt = ft.wait(1,120)
if rt==1:
print "Thread 1: Rückmelder t aktiv"
wv()
E10.setFunction(0)
E10.setSpeed(0)
E10.send()
print "Thread 1: E10 gestoppt"
def thread2():
print "Thread 2 gestartet"
rr = fr.wait(1,120)
if rr==1:
print "Thread 2: Rückmelder r aktiv"
time.sleep(2)
ar()
print "Thread2: Fahrstrasse ar aktiviert"
rr = fr.wait(1,120)
if rr==1:
print "Thread 2: Rückmelder r aktiv"
az()
print "Thread 2: Fahrstrasse az aktiviert"
wv()
print "Thread 2: Fahrstrasse wv aktiviert"
rv = fv.wait(1,120)
if rv==1:
print "Thread 2: Rückmelder v aktiv"
V60.setSpeed(0)
V60.setFunction(0)
V60.send
print "Thread 2: V60 gestoppt"
threading.Thread(target=thread1).start()
==============================================================================
Ende der Datei thread2.py
==============================================================================
Listing der Datei Datei include.py
==============================================================================
#!/usr/bin/python
from rcsh import *
V60 = locoM5(77)
E10 = locoM1(42)
V218 = locoM5(78)
E151 = locoM1(10)
ft = feedbackS88(9)
fv = feedbackS88(10)
fr = feedbackS88(6)
def ap():
signalN(99).set()
def aq():
signalN(99).set()
signalN(230).set()
def ar():
signalN(99).set()
signalN(230).reset()
def az():
signalN(99).reset()
def er():
signalN(76).set()
signalN(248).reset()
def eq():
signalN(248).set()
signalN(247).set()
signalN(76).set()
def ez():
signalN(73).set()
signalN(75).set()
signalN(99).reset()
def pr():
signalN(230).reset()
def pq():
signalN(230).set()
def we():
signalN(231).set()
signalN(232).set()
def wt():
signalN(231).reset()
signalN(232).set()
def wv():
signalN(232).reset()
signalN(232).reset()