![]() |
|||
| HSG |
|

Realisierung eines Automaten in Python
class Automat(object):
def __init__(self):
self.zustaende = ('aus','Aan','Ban') # Zustände
self.eingaben = ('a','b','r') # Eingaben
self.ausgaben = ('Aan','Ban','ABaus') # Ausgaben
self.f = (((1,0),(2,1),(0,2)), # Automatentabelle
((1,0),(1,0),(0,2)),
((2,1),(2,1),(0,2)))
self.zustand = 0 # Anfangszustand
self.ausgabe = None # anfangs keine Ausgabe gespeichert
self.eingabe = None # anfangs keine Eingabe gespeichert
def verarbeiteEingabe(self,eingabe): # Arbeitsschritt
self.eingabe = eingabe
(self.zustand,self.ausgabe) = self.f[self.zustand][self.eingabe]
Testen von buzzer0.py z.B. auf der Shell, indem man eine Instanz erzeugt und die Eingabe testet. Bis hierher hat die serielle Schnittstelle noch nichts zu suchen.
# Hardware
import threading,time
class Timer(threading.Thread): # Timer für das Polling der Taster
def __init__(self,interval,routine):
threading.Thread.__init__(self)
self.interval = interval
self.routine = routine
def run(self):
time.sleep(self.interval)
self.routine()
import serial
class ComPort(serial.Serial):
def __init__(self,portnr):
serial.Serial.__init__(self,portnr)
def __del__(self): # wenn Referenz verloren
self.close() # Schnittstelle schließen
class SerialInterface(object):
def __init__(self,cba,cbb,cbr): # Callbacks für die Tasten a, b, r
# serielle Schnittstelle
self.s = ComPort(0)
# Callbacks
self.cba = cba
self.cbb = cbb
self.cbr = cbr
# + 12V
self.s.setBreak(1) # TxD als Spannungsversorgung für Taster
# Aktoren
self.s.setRTS(0) # RTS für Lampe A
self.s.setDTR(0) # DTR für Lampe B
# Sensoren
self.a = self.s.getRI() # RI für Taste a
self.aAlt = self.a
self.b = self.s.getDSR() # DSR für Taste b
self.bAlt = self.b
self.r = self.s.getCTS() # CTS für Taste r
self.rAlt = self.r
# Timer
self.timer = Timer(0.02,self.poll)
self.timer.start()
def __del__(self):
self.s.close()
del self.timer
print('Schnittstelle geschlossen') # DEBUG
def schalte(self,n):
if n == 0:
self.s.setRTS(1)
self.s.setDTR(0)
else:
if n == 1:
self.s.setRTS(0)
self.s.setDTR(1)
else:
self.s.setRTS(0)
self.s.setDTR(0)
def poll(self):
# Taster a
self.aAlt = self.a
self.a = self.s.getRI()
if not self.aAlt and self.a: # ansteigende Flanke
print('Taster a gedrückt') # DEBUG
if self.cba != None:
self.cba() # Callback cba aufrufen
# Taster b
self.bAlt = self.b
self.b = self.s.getDSR()
if not self.bAlt and self.b: # ansteigende Flanke
print('Taster b gedrückt') # DEBUG
if self.cbb != None:
self.cbb() # Callback cbb aufrufen
# Taster r
self.rAlt = self.r
self.r = self.s.getCTS()
if not self.rAlt and self.r: # ansteigende Flanke
print('Taster r gedrückt') # DEBUG
if self.cbr != None:
self.cbr() # Callback cbr aufrufen
# rekursiver Aufruf
self.timer = Timer(0.02,self.poll)
self.timer.start()

# controller
class Controller(object):
def __init__(self):
self.auto = Automat()
self.buzzer = SerialInterface(self.cba,self.cbb,self.cbr)
def cba(self):
self.auto.verarbeiteEingabe(0)
self.buzzer.schalte(self.auto.ausgabe)
def cbb(self):
self.auto.verarbeiteEingabe(1)
self.buzzer.schalte(self.auto.ausgabe)
def cbr(self):
self.auto.verarbeiteEingabe(2)
self.buzzer.schalte(self.auto.ausgabe)
# Hauptprogramm
c = Controller()
Vorschlag Transistorschaltstufen, bei Relais Löschdiode nicht vergessen.
Was würde sich verändern, wenn man 3 und mehr Teilnehmer hätte?