ich bin ein zimlicher Neuling was die Python Programmierung angeht. Eigentlich bin ich Biologiestudent und entwickle eine Anlage mit der ich 4 Mäuse in einen Testkäfig und wieder zurück schleusen muss (KEINE PANIK, den Tieren passiert dort nichts, sie machen nur ein paar Hörversuche mit positiver Verstärkung, also nichts mit bestrafung und Quälen).
Zu den Gegebenheiten ich habe zwei Heimatkäfige (HK) in denen jeweils 2 Tiere sind, einen Testkäfig(TK) und einen Warteraum (WR), diese Käfige sind durch Röhren mit einander verbunden. Weiterhin gibt es verschiedene Transponderleser (TL),automatische Tore (ST), LEDs (L) und Infrarotsensoren (PIR). Es dürfen sich nicht zwei Tiere gleichzeitig in den Röhren, im TK oder WR aufhalten. Die Anlage soll also 24/7 in Betrieb sein.
Als Beispiel: Alle Tiere sind im HK, Wuschel steht über TL03 und wird erkannt, dann öffnet sich ST03, Wuschel geht weiter zu TL04 und wird davon und von PIR02 erkannt, darauf hin öffnet sich ST04 und ST03 schließt sich. Dann geht Wuschel zum WR, wenn PIR03 eine Bewegung registriert wird ST04 geschlossen, es gibt eine Futterbelohnung (FG03) und der Status des Tiers wird geändert in "WR". Dann gibt es noch verschiedene Fälle das z.B. ein Tier schon im WR oder im TK ist und was dann passieren soll.
Ich habe schon fast alles fertig, nur ist mein Code viel zu lang. Ich weiß dass ich ihn kürzen kann, nur nicht wie. Am liebsten würde ich verschiedene Funktionen verwenden, nur habe ich da das Problem das sich da nicht alles wiederholt sondern es je nach Tier unterschiedliche Statusmeldungen gibt. Ausserdem habe ich gelesen, das Globale Variablen nicht gerne gesehen sind. Kann ich Funktionen ineinander verschachteln oder gibt es da bessere möglichkeiten?
Könnt ihr mir unter Umständen ein wenig Unterstützung geben?
Code: Alles auswählen
import socket
import time
import xlrd
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('192.168.1.12', 10000))
waag=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
waag.connect(('192.168.1.20', 9761))
# Status (HK= Heimatkäfig, WR= Warteraum, TK=Testkäfig) wo sich die Tiere aufhalten, wird im Laufe des Versuchs geändert.
StatusWuschel="HK"
StatusSimba="HK"
StatusAlex="HK"
StatusWendy="HK"
StatusTL01="TL01 0"
StatusTL03="TL03 0"
x=1
while x>=0:
#Abfrage eines Ranges ob ein Tier zum TK darf/soll
wb=xlrd.open_workbook("C:\Users\mausroboter\Desktop\Control\whitelist.xlsx")
sh=wb.sheet_by_name(u'Tabelle1')
RangWuschel=str(sh.cell(1,4))
RangSimba=str(sh.cell(2,4))
RangAlex=str(sh.cell(3,4))
RangWendy=str(sh.cell(4,4))
del wb
# Funktion ein Tier zum WR
def TierzumWR():
global StatusWuschel
global StatusSimba
global StatusAlex
global StatusWendy
StatusTL01="TL01 0"
StatusTL03="TL03 0"
#soll solange durch laufen wie alle Tiere im "HK" sind.
while StatusWuschel=="HK" and StatusSimba=="HK" and StatusAlex=="HK" and StatusWendy=="HK":
sock.sendall('101 L01 1\n')
sock.sendall('101 L02 1\n')
sock.sendall('102 TL01\n')
StatusTL01=sock.recv(1024)
sock.sendall('102 TL03\n')
StatusTL03=sock.recv(1024)
print StatusTL01
print StatusTL03[0:14]
if StatusTL01[0:6]!="TL01 0" or StatusTL03[0:6]!="TL03 0":
if StatusTL03[0:14]=="TL03 1 Wuschel":
#In Top3 Liste nachsehen ob das Tier draufsteht
if RangWuschel[7]<="3":
print StatusTL03[0:14]
sock.sendall('101 ST03 1\n')
sock.sendall('102 ST03\n')
StatusST03=sock.recv(1024)
print StatusST03
while StatusST03[0:6]=="ST03 1":
sock.sendall('102 TL04\n')
StatusTL04=sock.recv(1024)
sock.sendall('102 PIR02\n')
StatusPIR02=sock.recv(1024)
print StatusPIR02
if StatusTL04[0:14]=="TL04 1 Wuschel" and StatusPIR02[0:7]=="PIR02 1":
sock.sendall('101 ST03 0\n')
sock.sendall('101 L01 0\n')
sock.sendall('101 L02 0\n')
time.sleep(1)
sock.sendall('101 ST04 1\n')
waag.sendall('T\n')
sock.sendall('102 ST04\n')
StatusST04=sock.recv(1024)
print StatusST04
StatusPIR03="PIR03 0"
while StatusPIR03[0:7]=="PIR03 0":
sock.sendall('102 PIR03\n')
StatusPIR03=sock.recv(1024)
if StatusPIR03[0:7]=="PIR03 1":
sock.sendall('101 L03 1\n')
sock.sendall('101 FG03 1\n')
time.sleep(5)
sock.sendall('101 FG03 0\n')
sock.sendall('101 L03 0\n')
waag.sendall('SP\n')
global GewichtWuschel
GewichtWuschel=waag.recv(1024)
print (GewichtWuschel)
sock.sendall('101 ST04 0\n')
sock.sendall('102 ST04\n')
statusST04=sock.recv(1024)
StatusWuschel="WR"
time.sleep(5)
break
time.sleep(2)
elif StatusTL03[0:12]=="TL03 1 Simba":
if RangSimba[7]<="3":
sock.sendall('101 ST03 1\n')
sock.sendall('102 ST03\n')
StatusST03=sock.recv(1024)
print StatusST03
while StatusST03[0:6]=="ST03 1":
sock.sendall('102 TL04\n')
StatusTL04=sock.recv(1024)
sock.sendall('102 PIR02\n')
StatusPIR02=sock.recv(1024)
print StatusPIR02
if StatusTL04[0:12]=="TL04 1 Simba" and StatusPIR02[0:7]=="PIR02 1":
sock.sendall('101 ST03 0\n')
sock.sendall('101 L01 0\n')
sock.sendall('101 L02 0\n')
time.sleep(1)
sock.sendall('101 ST04 1\n')
waag.sendall('T\n')
sock.sendall('102 ST04\n')
StatusST04=sock.recv(1024)
print StatusST04
StatusPIR03="PIR03 0"
while StatusPIR03[0:7]=="PIR03 0":
sock.sendall('102 PIR03\n')
StatusPIR03=sock.recv(1024)
#print statusPIR03[0:7]
if StatusPIR03[0:7]=="PIR03 1":
sock.sendall('101 L03 1\n')
sock.sendall('101 FG03 1\n')
time.sleep(5)
sock.sendall('101 FG03 0\n')
sock.sendall('101 L03 0\n')
waag.sendall('SP\n')
global GewichtSimba
GewichtSimba=waag.recv(1024)
print (GewichtSimba)
sock.sendall('101 ST04 0\n')
sock.sendall('102 ST04\n')
statusST04=sock.recv(1024)
StatusSimba="WR"
time.sleep(5)
break
time.sleep(2)
elif StatusTL01[0:11]=="TL03 1 Alex":
if RangAlex[7]<="3":
sock.sendall('101 ST01 1\n')
sock.sendall('102 ST01\n')
StatusST01=sock.recv(1024)
print StatusST01
while StatusST03[0:6]=="ST01 1":
sock.sendall('102 TL02\n')
StatusTL02=sock.recv(1024)
sock.sendall('102 PIR01\n')
StatusPIR01=sock.recv(1024)
print StatusPIR01
if StatusTL02[0:11]=="TL02 1 Alex" and StatusPIR01[0:7]=="PIR01 1":
sock.sendall('101 ST01 0\n')
sock.sendall('101 L01 0\n')
sock.sendall('101 L02 0\n')
time.sleep(1)
sock.sendall('101 ST02 1\n')
waag.sendall('T\n')
sock.sendall('102 ST02\n')
StatusST02=sock.recv(1024)
print StatusST02
StatusPIR03="PIR03 0"
while StatusPIR03[0:7]=="PIR03 0":
sock.sendall('102 PIR03\n')
StatusPIR03=sock.recv(1024)
if StatusPIR03[0:7]=="PIR03 1":
sock.sendall('101 L03 1\n')
sock.sendall('101 FG03 1\n')
time.sleep(5)
sock.sendall('101 FG03 0\n')
sock.sendall('101 L03 0\n')
waag.sendall('SP\n')
global GewichtAlex
GewichtAlex=waag.recv(1024)
print (GewichtAlex)
sock.sendall('101 ST02 0\n')
sock.sendall('102 ST02\n')
statusST02=sock.recv(1024)
StatusAlex="WR"
time.sleep(5)
break
time.sleep(2)
elif StatusTL01[0:12]=="TL01 1 Wendy":
if RangWendy[7]<="3":
sock.sendall('101 ST01 1\n')
sock.sendall('102 ST01\n')
StatusST01=sock.recv(1024)
print StatusST01
while StatusST01[0:6]=="ST01 1":
sock.sendall('102 TL02\n')
StatusTL02=sock.recv(1024)
sock.sendall('102 PIR01\n')
StatusPIR01=sock.recv(1024)
print StatusPIR01
if StatusTL04[0:12]=="TL02 1 Wendy" and StatusPIR01[0:7]=="PIR01 1":
sock.sendall('101 ST01 0\n')
sock.sendall('101 L01 0\n')
sock.sendall('101 L02 0\n')
time.sleep(1)
sock.sendall('101 ST02 1\n')
waag.sendall('T\n')
sock.sendall('102 ST02\n')
StatusST02=sock.recv(1024)
print StatusST02
StatusPIR03="PIR03 0"
while StatusPIR03[0:7]=="PIR03 0":
sock.sendall('102 PIR03\n')
StatusPIR03=sock.recv(1024)
if StatusPIR03[0:7]=="PIR03 1":
sock.sendall('101 L03 1\n')
sock.sendall('101 FG03 1\n')
time.sleep(5)
sock.sendall('101 FG03 0\n')
sock.sendall('101 L03 0\n')
waag.sendall('SP\n')
global GewichtWendy
GewichtWendy=waag.recv(1024)
print (GewichtWendy)
sock.sendall('101 ST02 0\n')
sock.sendall('102 ST02\n')
statusST02=sock.recv(1024)
StatusWendy="WR"
time.sleep(5)
break
time.sleep(2)
time.sleep(10)
TierzumWR()
while StatusWuschel=="WR" or StatusSimba=="WR" or StatusAlex=="WR" or StatusWendy=="WR":
#Alle Tore geschlossen halten bis das "WR-Tier" im TK oder HK ist.
if StatusWuschel[0:2]=="WR":
if GewichtWuschel[0:3]<="80 g":
zeitWuschel=time.time()
while (zeitWuschel+120)>time.time(): #Tier soll max 30min im WR sein danach HK
if StatusSimba[0:2]=="TK" or StatusAlex[0:2]=="TK" or StatusWendy[0:2]=="TK":
#time.sleep(5)
zeitWR=time.time()
zeit_dif = (zeitWuschel - zeitWR)*-1
print "Ein Tier ist im Testkäfig. Wuschel ist ", zeit_dif, " sek. im Warteraum"
else:
sock.sendall('101 L04 1\n')
sock.sendall('101 ST05 1\n')
StatusPIR04="PIR04 0"
while StatusPIR04[0:7]=="PIR04 0":
sock.sendall('102 PIR04\n')
StatusPIR04=sock.recv(1024)
if StatusPIR04[0:7]=="PIR04 1":
sock.sendall('101 L04 0\n')
sock.sendall('101 ST05 0\n')
StatusWuschel="TK"
break
time.sleep(1)
break
time.sleep(9)
sock.sendall('101 L05 1\n')
sock.sendall('101 ST07 1\n')
StatusPIR05="PIR05 0"
while StatusPIR05[0:7]=="PIR05 0":
sock.sendall('102 PIR05\n')
StatusPIR05=sock.recv(1024)
if StatusPIR05[0:7]=="PIR05 1":
sock.sendall('101 L05 0\n')
sock.sendall('101 ST07 0\n')
sock.sendall('101 ST08 1\n')
StatusPIR06="PIR06 0"
while StatusPIR06[0:7]=="PIR06 0":
sock.sendall('102 PIR06\n')
StatusPIR06=sock.recv(1024)
if StatusPIR06[0:7]=="PIR06 1":
sock.sendall('101 ST08 0\n')
StatusWuschel="HK"
time.sleep(1)
time.sleep(1)
else:
sock.sendall('101 L05 1\n')
sock.sendall('101 ST07 1\n')
StatusPIR05="PIR05 0"
while StatusPIR05[0:7]=="PIR05 0":
sock.sendall('102 PIR05\n')
StatusPIR05=sock.recv(1024)
if StatusPIR05[0:7]=="PIR05 1":
sock.sendall('101 L05 0\n')
sock.sendall('101 ST07 0\n')
sock.sendall('101 ST08 1\n')
StatusPIR06="PIR06 0"
while StatusPIR06[0:7]=="PIR06 0":
sock.sendall('102 PIR06\n')
StatusPIR06=sock.recv(1024)
if StatusPIR06[0:7]=="PIR06 1":
sock.sendall('101 ST08 0\n')
StatusWuschel="HK"
time.sleep(1)
time.sleep(1)
elif StatusSimba=="WR":
if GewichtSimba[0:3]<="80 g":
zeitSimba=time.time()
while (zeitSimba+120)>time.time(): #Tier soll max 30min im WR sein danach HK
if StatusWuschel[0:2]=="TK" or StatusAlex[0:2]=="TK" or StatusWendy[0:2]=="TK":
#time.sleep(5)
zeitWR=time.time()
zeit_dif = (zeitSimba - zeitWR)*-1
print "Ein Tier ist im Testkäfig. Simba ist ", zeit_dif, " sek. im Warteraum"
else:
sock.sendall('101 L04 1\n')
sock.sendall('101 ST05 1\n')
StatusPIR04="PIR04 0"
while StatusPIR04[0:7]=="PIR04 0":
sock.sendall('102 PIR04\n')
StatusPIR04=sock.recv(1024)
if StatusPIR04[0:7]=="PIR04 1":
sock.sendall('101 L04 0\n')
sock.sendall('101 ST05 0\n')
StatusSimba="TK"
break
time.sleep(1)
break
time.sleep(9)
sock.sendall('101 L05 1\n')
sock.sendall('101 ST07 1\n')
StatusPIR05="PIR05 0"
while StatusPIR05[0:7]=="PIR05 0":
sock.sendall('102 PIR05\n')
StatusPIR05=sock.recv(1024)
if StatusPIR05[0:7]=="PIR05 1":
sock.sendall('101 L05 0\n')
sock.sendall('101 ST07 0\n')
sock.sendall('101 ST08 1\n')
StatusPIR06="PIR06 0"
while StatusPIR06[0:7]=="PIR06 0":
sock.sendall('102 PIR06\n')
StatusPIR06=sock.recv(1024)
if StatusPIR06[0:7]=="PIR06 1":
sock.sendall('101 ST08 0\n')
StatusSimba="HK"
time.sleep(1)
time.sleep(1)
else:
sock.sendall('101 L05 1\n')
sock.sendall('101 ST07 1\n')
StatusPIR05="PIR05 0"
while StatusPIR05[0:7]=="PIR05 0":
sock.sendall('102 PIR05\n')
StatusPIR05=sock.recv(1024)
if StatusPIR05[0:7]=="PIR05 1":
sock.sendall('101 L05 0\n')
sock.sendall('101 ST07 0\n')
sock.sendall('101 ST08 1\n')
StatusPIR06="PIR06 0"
while StatusPIR06[0:7]=="PIR06 0":
sock.sendall('102 PIR06\n')
StatusPIR06=sock.recv(1024)
if StatusPIR06[0:7]=="PIR06 1":
sock.sendall('101 ST08 0\n')
StatusSimba="HK"
time.sleep(1)
time.sleep(1)
elif StatusAlex=="WR":
if GewichtAlex[0:3]<="80 g":
zeitAlex=time.time()
while (zeitAlex+120)>time.time(): #Tier soll max 30min im WR sein danach HK
if StatusWuschel[0:2]=="TK" or StatusSimba[0:2]=="TK" or StatusWendy[0:2]=="TK":
#time.sleep(5)
zeitWR=time.time()
zeit_dif = (zeitAlex - zeitWR)*-1
print "Ein Tier ist im Testkäfig. Alex ist ", zeit_dif, " sek. im Warteraum"
else:
sock.sendall('101 L04 1\n')
sock.sendall('101 ST05 1\n')
StatusPIR04="PIR04 0"
while StatusPIR04[0:7]=="PIR04 0":
sock.sendall('102 PIR04\n')
StatusPIR04=sock.recv(1024)
if StatusPIR04[0:7]=="PIR04 1":
sock.sendall('101 L04 0\n')
sock.sendall('101 ST05 0\n')
StatusAlex="TK"
break
time.sleep(1)
break
time.sleep(9)
sock.sendall('101 L05 1\n')
sock.sendall('101 ST07 1\n')
StatusPIR05="PIR05 0"
while StatusPIR05[0:7]=="PIR05 0":
sock.sendall('102 PIR05\n')
StatusPIR05=sock.recv(1024)
if StatusPIR05[0:7]=="PIR05 1":
sock.sendall('101 L05 0\n')
sock.sendall('101 ST07 0\n')
sock.sendall('101 ST09 1\n')
StatusPIR07="PIR07 0"
while StatusPIR07[0:7]=="PIR07 0":
sock.sendall('102 PIR07\n')
StatusPIR07=sock.recv(1024)
if StatusPIR07[0:7]=="PIR07 1":
sock.sendall('101 ST09 0\n')
StatusAlex="HK"
time.sleep(1)
time.sleep(1)
else:
sock.sendall('101 L05 1\n')
sock.sendall('101 ST07 1\n')
StatusPIR05="PIR05 0"
while StatusPIR05[0:7]=="PIR05 0":
sock.sendall('102 PIR05\n')
StatusPIR05=sock.recv(1024)
if StatusPIR05[0:7]=="PIR05 1":
sock.sendall('101 L05 0\n')
sock.sendall('101 ST07 0\n')
sock.sendall('101 ST09 1\n')
StatusPIR07="PIR07 0"
while StatusPIR07[0:7]=="PIR07 0":
sock.sendall('102 PIR07\n')
StatusPIR07=sock.recv(1024)
if StatusPIR07[0:7]=="PIR07 1":
sock.sendall('101 ST09 0\n')
StatusAlexl="HK"
time.sleep(1)
time.sleep(1)
elif StatusWendy=="WR":
if GewichtWendy[0:3]<="80 g":
zeitWendy=time.time()
while (zeitWendy+120)>time.time(): #Tier soll max 30min im WR sein danach HK
if StatusWuschel[0:2]=="TK" or StatusSimba[0:2]=="TK" or StatusAlex[0:2]=="TK":
#time.sleep(5)
zeitWR=time.time()
zeit_dif = (zeitWendy - zeitWR)*-1
print "Ein Tier ist im Testkäfig. Wendy ist ", zeit_dif, " sek. im Warteraum"
else:
sock.sendall('101 L04 1\n')
sock.sendall('101 ST05 1\n')
StatusPIR04="PIR04 0"
while StatusPIR04[0:7]=="PIR04 0":
sock.sendall('102 PIR04\n')
StatusPIR04=sock.recv(1024)
if StatusPIR04[0:7]=="PIR04 1":
sock.sendall('101 L04 0\n')
sock.sendall('101 ST05 0\n')
StatusWendy="TK"
break
time.sleep(1)
break
time.sleep(9)
sock.sendall('101 L05 1\n')
sock.sendall('101 ST07 1\n')
StatusPIR05="PIR05 0"
while StatusPIR05[0:7]=="PIR05 0":
sock.sendall('102 PIR05\n')
StatusPIR05=sock.recv(1024)
if StatusPIR05[0:7]=="PIR05 1":
sock.sendall('101 L05 0\n')
sock.sendall('101 ST07 0\n')
sock.sendall('101 ST09 1\n')
StatusPIR07="PIR07 0"
while StatusPIR07[0:7]=="PIR07 0":
sock.sendall('102 PIR07\n')
StatusPIR07=sock.recv(1024)
if StatusPIR07[0:7]=="PIR07 1":
sock.sendall('101 ST09 0\n')
StatusWendy="HK"
time.sleep(1)
time.sleep(1)
else:
sock.sendall('101 L05 1\n')
sock.sendall('101 ST07 1\n')
StatusPIR05="PIR05 0"
while StatusPIR05[0:7]=="PIR05 0":
sock.sendall('102 PIR05\n')
StatusPIR05=sock.recv(1024)
if StatusPIR05[0:7]=="PIR05 1":
sock.sendall('101 L05 0\n')
sock.sendall('101 ST07 0\n')
sock.sendall('101 ST09 1\n')
StatusPIR07="PIR07 0"
while StatusPIR07[0:7]=="PIR07 0":
sock.sendall('102 PIR07\n')
StatusPIR07=sock.recv(1024)
if StatusPIR07[0:7]=="PIR07 1":
sock.sendall('101 ST09 0\n')
StatusWendy="HK"
time.sleep(1)
time.sleep(1)
time.sleep(10)
while StatusWuschel=="TK" or StatusSimba=="TK" or StatusAlex=="TK" or StatusWendy=="TK":
if StatusWuschel=="TK":
zeitWuschelTK=time.time()
#Abfrage starten ob Wuschel aus TK kann, muss noch eingebaut werden.
while (zeitWuschelTK+7200)>time.time(): #abfrage erfolgt alle 60 sek
#Wenn Wuschel aus Tk kann, dann
if WuschelbacktoHK:
sock.sendall('101 L06 1\n')
sock.sendall('101 ST06 1\n')
while StatusPIR05[0:7]=="PIR05 0":
sock.sendall('102 PIR05\n')
StatusPIR05=sock.recv(1024)
if StatusPIR05[0:7]=="PIR05 1":
sock.sendall('101 L06 0\n')
sock.sendall('101 ST06 0\n')
sock.sendall('101 ST08 1\n')
StatusPIR06="PIR06 0"
while StatusPIR06[0:7]=="PIR06 0":
sock.sendall('102 PIR06\n')
StatusPIR06=sock.recv(1024)
if StatusPIR06[0:7]=="PIR06 1":
sock.sendall('101 ST08 0\n')
StatusWuschel="HK"
time.sleep(1)
time.sleep(1)
else:
#Wenn Wuschel noch nicht aus TK kann, können schön andere Tiere in den WR
#Dafür muss aber erst geprüft werden ob kein Tier im WR ist.
TierzumWR()
if StatusSimba=="WR" or StatusAlex=="WR" or StatusWendy=="WR":
if StatusSimba=="WR":
print "Wuschel ist im TK und Simba im WR."
elif StatusAlex=="WR":
print "Wuschel ist im TK und Alex im WR."
elif StatuWendy=="WR":
print "Wuschel ist im TK und Wendy im WR."
time.sleep(60)
time.sleep(60)
if StatusSimba=="TK":
if StatusAlex=="TK":
if StatusWendy=="TK":
time.sleep(10)
x+=1
print (x)
print "Ende"