[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()