Mausroboter von einem Anfänger

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
seavers
User
Beiträge: 11
Registriert: Donnerstag 31. Juli 2014, 11:46

Hallo ihr lieben,
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"


Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@seavers: der erste Schritt wäre, alles was sich unterscheidet als Parameter der zu schreibenden Funktion zu übergeben. Danach sieht man, wie was von was abhängt, es darf also auch kein "global" geben. Manche Parameter lassen sich dann eine bessere Struktur packen, z.B. Listen, wo jetzt noch die Namen durchnummeriert werden.

PS: Funktionen werden am Anfang des Moduls definiert und nicht innerhalb von while-Schleifen. Auf oberster Ebene sollte nichts ausgeführt werden, sondern alles in eine Main-Funktion wandern, die zum Schluss per

Code: Alles auswählen

if __name__ == '__main__':
    main()
aufgerufen wird.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Wenn der Code läuft, Glückwunsch!
Du hättest aber ziemliche Arbeit, wenn noch eine weitere Maus dazukommen würde.

Ein paar Tips:
Schau Dir die Syntax von Klassen an. Mach eine Klasse Maus und davon 4 Objekte. Die Klasse Maus hat dann Membervariablen wie gewicht und status (oder besser ort).
Mach aus den while Schleifen Funktionen oder Methoden (Methoden das sind die Funktionen von Objekten, das ist OO).
Packe sowas wie
sock.sendall('101 L01 1\n')
in eine Funktion mit einem sprechenden Namen (was bewirkt '101 L01 1\n').
Gruppiere sich wiederholende Befehlssequenzen
sock.sendall('101 ST03 0\n')
sock.sendall('101 L01 0\n')
sock.sendall('101 L02 0\n')
in eine Funktion mit einem sprechenden Namen.
a fool with a tool is still a fool, www.magben.de, YouTube
BlackJack

@seavers: Das Programm ist unvollständig, oder? Das kompiliert nämlich nicht, kann so also gar nicht laufen. Hast Du das überhaupt schon mal laufen lassen? Wenn man die syntaktisch falschen Zeilen mal auslässt, hast Du einmal `StatusWendy` falsch geschrieben und Du verwendest `WuschelbacktoHK` was aber nirgends definiert ist, das würde jeweils zu einem `NameError` führen. An anderer Stelle wird zum Beispiel `statusST04` ein Wert zugewiesen, der dann aber nirgends verwendet wird. Es gibt auch `StatusST04` — kann es also sein, das eigentlich *dem* Namen etwas zugewiesen werden sollte?

Eine Exceltabelle als Eingabeformat ist ziemlich unhandlich und sieht extrem überdimensioniert aus. Kann man da nichts einfacheres verwenden, wie eine CSV-Datei oder eine JSON-Datei wenn es strukturiertere Daten sind‽

Das anscheinend beim Rang das achte Zeichen als ASCII-Ziffer eine Bedeutung hat ist auch ziemlich magisch und sieht mir auch etwas fragil aus. Ich würde dieses einzige Zeichen was eine Bedingung hat auch gleich beim Einlesen der Daten isolieren und das nicht irgendwo im Programm in die Tests verschieben. ASCII-Ziffern als Zeichenketten auf ``<`` zu Vergleichen ist auch ein wenig komisch. Wenn das als Zahl betrachtet werden soll, dann sollte man auch einen Zahldatentyp verwenden. Sonst stoplert man irgendwann einmal über so etwas hier:

Code: Alles auswählen

In [11]: '10' < '3'
Out[11]: True
Diese Gefahr sehe ich auch bei der Waage wo anscheinend Gewichtsangaben als Zeichenketten verglichen werden. Da kann Murks bei heraus kommen!

``del`` um Namen zu löschen verwendet man eher selten und dann auch wirklich weil man den *Namen* löschen möchte, denn nichts anderes macht diese Anweisung. Da wird *nicht* das Objekt gelöscht! Das wird eventuell von der automatischen Speicherverwaltung freigegeben wenn es nicht mehr vom Programm aus erreichbar ist. Das ist das `Workbook` aber, weil das Programm immer noch einen Namen für das Arbeitsblatt-Objekt hat, und das hat seinerseits eine Referenz auf das Workbook zu dem es gehört. Das ``del`` in Zeile 29 ist also relativ sinnfrei.

Zu den magischen Zeichenketten die da versendet, empfangen und `sclice`-weise verglichen werden würde ich auch sagen das sollte man verständlicher kodieren. Die Socket-Objekte jeweils in einer Klasse mit sinvoll benannten Methoden kapseln und die Rückgabewerte in sinvolle Werte oder Datenstrukturen parsen, statt da auf Zeichenketten zu operieren mit magischen Indexwerten und Zeichenkettenwerten.

Das Empfangen der Antworten ist durchweg fehlerhaft. `recv()` garantiert nicht besonders viel, nämlich nur das *mindestens* ein Byte pro Aufruf gelesen wird. Mehr nicht! Insbesondere nicht das alles was auf der Gegenseite ”auf einmal” gesendet wurde, auch mit einem `recv()`-Aufruf gelesen wird. Das sieht oft so aus als würde das so funktionieren, aber früher oder später wird einem das auf die Füsse fallen. Wenn man Nachrichten verschicken will, dann muss man sicherstellen, dass man a) `recv()` so oft aufruft bis man eine komplette Nachricht beisammen hat, und b) das man sich einen eventuell schon empfangenen Teil einer *nächsten* Nachricht merkt damit der nicht verloren geht. Fehlerfreier Empfangscode muss damit klar kommen können das die Nachricht Byte für Byte ankommt. Und wenn das Protokoll nicht garantiert Halbduplex ist, dann muss man auch mit dem anderen ”Extremfall” klarkommen: das ein `recv()` mehr als eine Nachricht empfängt.

Die Tiere als Objekte modellieren wurde ja schon genannt. Und den Rest des Versuchs vielleicht auch, so dass man nicht alle möglichen Kombinationen von Ortsangaben für Mäuse in ``if``-Anweisungen durchgehen muss um festzustellen welche Maus gerade in einem Raum ist, sondern dass man sich einfach in einer Datenstruktur für einen Raum merkt welche Maus sich darin befindet.

Man könnte auch versuchen den Zustandsautomaten mit den erlaubten Bewegungen und Abläufen als Daten zu modellieren. Das macht das ganze flexibler und sehr wahrscheinlich auch verständlicher, denn aus dem aktuellen Code dauert das sicher eine Weile bis man da diese Informationen herausgezogen hat. Dabei auch immer daran denken wie sich das für fremde Programmierer darstellt, *und* das *Du selbst* nach einem halben Jahr wahrscheinlich in der selben Situation bist. Sachen die jetzt noch gerade so überschaubar sind, weil Du Dich während des Schreibens intensiv mit dem Programm auseinander setzt, sind in ein paar Monaten für Dich selbst nicht mehr so leicht zu verstehen bei so einem Riesenhaufen kryptischem Quelltext.

Aus dem Grund sollte man auch Wert auf gute Namen legen. Und zum Beispiel Abkürzungen vermeiden die nicht allgemein bekannt sind. Hast Du tatsächlich `waage` als `waag` abgekürzt um das `e` zu sparen‽ Das gilt auch für die Orte und die Sensoren und andere Bauteile im Versuch.

Code nach einem `break` wird nicht mehr ausgeführt. Das `break` bricht die Schleife ja ab.

Bezüglich Namensschreibweisen und Quelltextformatierung lohnt sich auch ein Blick in den Style Guide for Python Code. Die Namen lesen sich alle etwas komisch für Pythonprogrammierer und spätestens wenn Du Klassen einsetzt, wird es schwierig sich zurechtzufinden.
seavers
User
Beiträge: 11
Registriert: Donnerstag 31. Juli 2014, 11:46

Also kompeliert habe ich das noch nicht, sondern nur im Debug Modus unter Spyder laufen lassen, leider sind im Debug-Modus nicht alle Tiere durch gelaufen, so dass mir nicht alle Tiere da durchgelaufen sind, deswegen ist das mit Wendy auch gar nicht auf gefallen.
Ich werde mal die angesprochenen Tipps ausprobieren und nachsehen ob das dann besser aussieht und funktioniert.
Vielen Dank bis hierhin und ich hoffe, dass bei weiteren Fragen wieder Posten darf.
BlackJack

@seavers: Das Testen sollte man mit Unittests machen und nicht ”live” und hoffen das die Tiere so nett sind möglichst viele Fälle abzudecken. Oder man trainiert die Mäuse *richtig* gut. :-)
seavers
User
Beiträge: 11
Registriert: Donnerstag 31. Juli 2014, 11:46

Hallo noch Mal, ich habe mal ein paar von euren Tipps umgesetzt und konnte so den Code von 700 auf 400 Zeilen verkürzen, auch wenn ich noch nicht alles in Funktionen gepackt habe. Einige Sachen habe ich noch nicht umgesetzt, wie z.B. die recv()-Geschichten, die Abfrage des Ranges oder die Sachen, die Sirius geschrieben hat. Desweiteren habe ich mich mal mit Klassen beschäftigt und für die Mäuse eine angelegt. Wie ich den Ort oder das Gewicht verändern kann habe ich verstanden. Leider ist mir immer noch nicht klar, wie ich damit die IF-Verzweigungen vermeiden kann. :K
Vielleicht könnt ihr mir da noch mal helfen.

Code: Alles auswählen


class Gerbil():
    
    def __init__(self, Bez, Ort, Gew, Pri):    
        self.Bezeichnung = Bez
        self.Ort = Ort
        self.Gewicht = Gew
        self.Prioritat = Pri
        
        #Methode: Ausgabe wo sich ein Tier grade aufhält
    def __repr__(self):
        return self.Bezeichnung + " befindet sich im " + self.Ort + ", wiegt " + self.Gewicht + " und hat die Priorität " + self.Prioritat
        
    def ausgabeBez(self):
        print "Name:", self.Bezeichnung
        
    def ausgabeOrt(self):
        print "Ort:", self.Ort
        
    def ausgabeGew(self):
        print "Gewicht:", self.Gewicht
    
    def ausgabePri(self):
        print "Priorität:", self.Prioritat
    
Wuschel = Gerbil("Wuschel", "HK", "80g", "1")
Simba = Gerbil("Simba", "HK", "70g", "2")
Alex = Gerbil("Alex", "HK", "65g", "3")
Wendy = Gerbil("Wendy", "HK", "60g", "4")
    
print Wuschel

Wuschel.Ort="WR"

Hier noch mal der umgearbeitete Code ohne die Klasse "Gerbil"

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


def ST01offnen():
    print StatusTL03[0:14]
    sock.sendall('101 ST01 1\n')
    sock.sendall('102 ST01\n')
    StatusST01=sock.recv(1024)
    print StatusST01
    
def ST03offnen():
    print StatusTL03[0:14]
    sock.sendall('101 ST03 1\n')
    sock.sendall('102 ST03\n')
    StatusST03=sock.recv(1024)
    print StatusST03
    
def AbfrageTL02():
    sock.sendall('102 TL02\n')
    StatusTL02=sock.recv(1024)
    sock.sendall('102 PIR01\n')
    StatusPIR01=sock.recv(1024)
    #print StatusPIR01
    
def AbfrageTL04():
    sock.sendall('102 TL04\n')
    StatusTL04=sock.recv(1024)
    sock.sendall('102 PIR02\n')
    StatusPIR02=sock.recv(1024)
    #print StatusPIR02    
    
def JungsausSchleuse():
    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"    
    
def WeibchenausSchleuse():
    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"
    
def Gewichtnehmen():
    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')
    
def ST07offnen():
    sock.sendall('101 L05 1\n')
    sock.sendall('101 ST07 1\n')
    StatusPIR05="PIR05 0"
    
def JungsWRzumHK():
    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')
                    if OrtWuschel[0:2]=="WR":
                        OrtWuschel="HK"
                    elif OrtSimba[0:2]=="WR":
                        OrtSimba="HK"
                time.sleep(1)
        time.sleep(1)
        
def WeibchenWRzumHK():
    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')
                    if OrtAlex[0:2]=="WR":
                        OrtAlex="HK"
                    elif OrtWendy[0:2]=="WR":
                        OrtWendy="HK"
                time.sleep(1)
        time.sleep(1)
    
def TiervomWRzumTK():
    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')
            if OrtWuschel=="WR":
                OrtWuschel="TK"
            elif OrtSimba=="WR":
                OrtSimba="TK"
            elif OrtAlex=="WR":
                OrtAlex="TK"
            elif OrtWendy=="WR":
                OrtWendy="TK"
        break
        time.sleep(1)

def TierOrte():
    global OrtWuschel
    global OrtSimba
    global OrtAlex
    global OrtWendy 
    global GewichtWuschel
    global GewichtSimba
    global GewichtAlex
    global GewichtWendy

def TierzumWR():        
    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":
                ST03offnen()
                while StatusST03[0:6]=="ST03 1":
                    AbfrageTL04()
                    if StatusTL04[0:14]=="TL04 1 Wuschel" and StatusPIR02[0:7]=="PIR02 1":
                        JungsausSchleuse()
                        while StatusPIR03[0:7]=="PIR03 0":   
                            sock.sendall('102 PIR03\n')
                            StatusPIR03=sock.recv(1024)
                            if StatusPIR03[0:7]=="PIR03 1":
                                Gewichtnehmen()
                                GewichtWuschel=waag.recv(1024)
                                print (GewichtWuschel)                        
                                sock.sendall('101 ST04 0\n')
                                sock.sendall('102 ST04\n')  
                                statusST04=sock.recv(1024)
                                OrtWuschel="WR"
                            time.sleep(5)
                        break
                    time.sleep(2)
        elif StatusTL03[0:12]=="TL03 1 Simba":
            if RangSimba[7]<="3":            
                ST03offnen()
                while StatusST03[0:6]=="ST03 1":
                    AbfrageTL04()
                    if StatusTL04[0:12]=="TL04 1 Simba" and StatusPIR02[0:7]=="PIR02 1":
                        JungsausSchleuse()
                        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":
                                Gewichtnehmen()
                                GewichtSimba=waag.recv(1024)
                                print (GewichtSimba)                        
                                sock.sendall('101 ST04 0\n')
                                sock.sendall('102 ST04\n')
                                statusST04=sock.recv(1024)
                                OrtSimba="WR"
                            time.sleep(5)
                        break                                
                    time.sleep(2)
        elif StatusTL01[0:11]=="TL01 1 Alex":
            if RangAlex[7]<="3":
                ST01offnen()
                while StatusST01[0:6]=="ST01 1":
                    AbfrageTL02()
                    if StatusTL02[0:11]=="TL02 1 Alex" and StatusPIR01[0:7]=="PIR01 1":
                        WeibchenausSchleuse()
                        while StatusPIR03[0:7]=="PIR03 0": 
                            sock.sendall('102 PIR03\n')
                            StatusPIR03=sock.recv(1024)
                            if StatusPIR03[0:7]=="PIR03 1":
                                Gewichtnehmen()
                                GewichtAlex=waag.recv(1024)
                                print (GewichtAlex)
                                sock.sendall('101 ST02 0\n')
                                sock.sendall('102 ST02\n')
                                statusST02=sock.recv(1024)
                                OrtAlex="WR"
                            time.sleep(5)
                        break                                
                    time.sleep(2)
        elif StatusTL01[0:12]=="TL01 1 Wendy":
            if RangWendy[7]<="3":            
                ST01offnen()
                while StatusST01[0:6]=="ST01 1":
                    AbfrageTL02()
                    if StatusTL02[0:12]=="TL02 1 Wendy" and StatusPIR01[0:7]=="PIR01 1":
                        WeibchenausSchleuse()
                        while StatusPIR03[0:7]=="PIR03 0":
                            sock.sendall('102 PIR03\n')
                            StatusPIR03=sock.recv(1024)
                            if StatusPIR03[0:7]=="PIR03 1":
                                Gewichtnehmen()
                                GewichtWendy=waag.recv(1024)
                                print (GewichtWendy)                        
                                sock.sendall('101 ST02 0\n')
                                sock.sendall('102 ST02\n')
                                statusST02=sock.recv(1024)
                                OrtWendy="WR"
                            time.sleep(5)
                        break                                
                    time.sleep(2)
                                 
# Ort HK= Heimatkäfig, WR= Warteraum, TK=Testkäfig
OrtWuschel="HK"
OrtSimba="HK"
OrtAlex="HK"
OrtWendy="HK"
StatusTL01="TL01 0"
StatusTL03="TL03 0"

x=1
while x>=0:    
    
    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))
    
    #Tiere werden zum WR geleitet
    while OrtWuschel=="HK" and OrtSimba=="HK" and OrtAlex=="HK" and OrtWendy=="HK":
        TierzumWR()
        time.sleep(10)
        
    #Hier werden Tiere vom WR entweder zum TK oder wieder zum HK geleitet        
    while OrtWuschel=="WR" or OrtSimba=="WR" or OrtAlex=="WR" or OrtWendy=="WR":
        #Alle Tore geschlossen halten bis das "WR-Tier" im TK oder HK ist.
        if OrtWuschel[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 OrtSimba[0:2]=="TK" or OrtAlex[0:2]=="TK" or OrtWendy[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:
                        TiervomWRzumTK()
                    time.sleep(9)
                    ST07offnen()
                JungsWRzumHK()
            else:  
                ST07offnen()
                JungsWRzumHK()
        elif OrtSimba=="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 OrtWuschel[0:2]=="TK" or OrtAlex[0:2]=="TK" or OrtWendy[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:
                        TiervomWRzumTK()                        
                    time.sleep(9)
                    ST07offnen()
                JungsWRzumHK()
            else:  
                ST07offnen()
                JungsWRzumHK()
        elif OrtAlex=="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 OrtWuschel[0:2]=="TK" or OrtSimba[0:2]=="TK" or OrtWendy[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:
                        TiervomWRzumTK()                
                    time.sleep(9)
                    ST07offnen()
                WeibchenWRzumHK()
            else:  
                ST07offnen()
                WeibchenWRzumHK()
        elif OrtWendy=="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 OrtWuschel[0:2]=="TK" or OrtSimba[0:2]=="TK" or OrtAlex[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:
                        TiervomWRzumTK()                
                    time.sleep(9)
                    ST07offnen()
                WeibchenWRzumHK()
            else:  
                ST07offnen()
                WeibchenWRzumHK()
        time.sleep(10)
        
    #Tier aus TK entlassen
    while OrtWuschel=="TK" or OrtSimba=="TK" or OrtAlex=="TK" or OrtWendy=="TK":
        if OrtWuschel=="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... WuschelbacktoHK muss noch definiert werden
                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')
                                    OrtWuschel="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.
                    if OrtSimba=="WR" or OrtAlex=="WR" or OrtWendy=="WR":
                        if OrtSimba=="WR":                            
                            print "Wuschel ist im TK und Simba im WR."
                        elif OrtAlex=="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)
                    else:                        
                        TierzumWR()
                time.sleep(60)
        #if OrtSimba=="TK":
        #if OrtAlex=="TK":
        #if OrtWendy=="TK":
        time.sleep(10)
        
    x+=1        
    print (x)
    print "Ende"

Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

seavers hat geschrieben:Leider ist mir immer noch nicht klar, wie ich damit die IF-Verzweigungen vermeiden kann.
Du benutzt die Gerbil Klasse ja gar nicht. Ersetze für den Anfang Deine Variablen die Du in der Funktion TierOrte() einführst durch Maus-Objekte.
Bei vielen Deiner if-Abfragen geht es einfach nur darum herauszufinden welche Maus z.B. am Ort "WR" ist. Wenn Du den Ort WR auch als Objekt modelieren würdest (eigene Klasse oder einfach eine Liste), dann könntest Du einfach dort nachschauen welches Maus-Objekt dort drin ist.

Deine Gewichtsabfrage ist übrigens ziemlich fehleranfällig:

Code: Alles auswählen

GewichtWendy = "120 g"
print(GewichtWendy[0:3]<="80 g") # True
a fool with a tool is still a fool, www.magben.de, YouTube
seavers
User
Beiträge: 11
Registriert: Donnerstag 31. Juli 2014, 11:46

Ich muss mich da jetzt mal gaaaanz langsam reinfuchsen. Sorry. Die Tutorials auf den einzelnen Webseiten helfen mir einfach nicht weiter. Die Gewichtsabfrage ist noch nicht final, werde das aber im Hinterkopf behalten, ist für mich momentan das kleinere Problem. Wichtiger ist für mich wie ich die Klasse Gerbil einsetzen kann.
Ersetze für den Anfang Deine Variablen die Du in der Funktion TierOrte() einführst durch Maus-Objekte.
Meinst du das so?
ALT

Code: Alles auswählen

def TierOrte():
    global OrtWuschel
    global OrtSimba
    global OrtAlex
    global OrtWendy 
NEU

Code: Alles auswählen

Ort =["HK", "WR", "TK"]

def TierOrte():
    Wuschel.Ort=Ort[0]
    Simba.Ort=Ort[0]
    Alex.Ort=Ort[0]
    Wendy.Ort=Ort[0]
BlackJack

@seavers: Nein das ist genau das gleiche was Du bisher machst mit einer unnötigen zusätzlichen Indirektion. Und es hat auch mit Funktion die Du als ALT gekennzeichnet hast *gar nichts* zu tun, denn das ist einfach nur eine sinnfreie, leere Funktion die überhaupt nichts bewirkt wenn man sie aufruft. Insgesamt funktioniert das Programm in der letzten Fassung nicht weil Du da keine einzige Funktion hast. Du definierst formal Funktionen, aber semantisch sind das keine. Das sind einfach nur benannte Code-Abschnitte. In einigen werden lokale Namen definiert von denen Du anscheinen annimmst die wären global sichtbar — das funktioniert so nicht. Insgesamt ist es keine gute Idee so eine riesenmenge an Quelltext zu schreiben und umzustellen ohne überhaupt zu wissen ob da irgendetwas davon das macht was es eigentlich machen soll. Unter dem Aspekt ist auch die Einstellung zur Gewichtsabfrage nicht gut — normalerweise entwickelt man so dass man jederzeit ein funktionierendes, möglichst auch testbares Programm hat, denn nur dann kann man sich ja auch nur Ansatzweise sicher sein, dass das wirklich das tut was man möchte. So etwas wie die Gewichte programmiert man deshalb entweder zuerst, beziehungsweise davor alles was man *dafür* braucht, oder man setzt dafür ”funktionierende” Dummyfunktionen ein, die nicht vorhandene Funktionalität zumindest hinreichend vortäuschen.

Zurück zum konkreten Problem: Du brauchst keine Datenstruktur in der alle Orte als Zeichenketten gespeichert sind, sondern für jeden Ort eine Datenstruktur in der gespeichert ist welche Tiere da gerade sind. Also ``hauptkammer = [wuschel, simba]``. Dann kann man testen wie viele Tiere sich an einem Ort befinden (`len()`), ob ein bestimmtes Tier an dem Ort ist (``in``), und so weiter. Und wenn ein Tier von einem Ort zum anderen Wechselt, dann nimmt man das entsprechende `Gerbil`-Exemplar aus der Struktur für den einen Ort heraus und steckt es in den anderen hinein. Und schon hat man das was Du mit vielen ``if``\s im Code modelliert hast in einer Datenstruktur.

Aber wie gesagt, man würde eigentlich erst einmal mit den ”untersten” Funktionen/Klassen anfangen und die implementieren und testen. Also eine Funktion schreiben, die Testen, und erst wenn die funktioniert wie erwartet, die nächste Funktion implementieren und testen. Mehrere hundert Zeilen Quelltext runterzuschreiben bevor man da überhaupt einmal probiert ob das auch nur ansatzweise funktioniert und dann ewig in dem ganzen Programm den Fehlern hinterfixen und hoffen das man alle erwischt hat, nur um dann vielleicht irgendwann zu dem Schluss zu kommen das der Ansatz nicht gut war und man mit der gleichen Arbeitsweise dann das halbe Programm umbaut, um danach dann wieder Fehlern hinterherzulaufen, ist ein eher frustrierendes Erlebnis.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Du könntest in Deinem Programm das Messen (Ort, Gewicht) erstmal unabhängig von den Aktionen (Türen öffenen/schließen?) implementieren. Dann kannst Du erstmal beobachten ob Dein Programm in der Lage ist den Ortswechsel der Mäuse mitzukriegen. Die Aktionen hängen ja von den Messungen ab, aber der Code der Messungen sollte nicht vom Code der Aktionen abhängen. Das Ergebnis der Messung Wiegen wird natürlich irgendwann von der Aktion Füttern abhängen, aber eben nicht der Python Code.
a fool with a tool is still a fool, www.magben.de, YouTube
seavers
User
Beiträge: 11
Registriert: Donnerstag 31. Juli 2014, 11:46

Boah, vielen Dank für die Tipps, aber irgendwie helfen die mir nicht weiter. Ich habe anscheinend ein grundsätzliches Problem eure Tipps bezüglich der Maus-Klasse/Objekte und Datenstruktur umzusetzen. Ich werde noch versuchen ein wenig mehr aus euern Antworten rauszuholen, auch was die Fehleranfällige Gewichtsabfrage betrifft und dann muss ich mal sehen wie es weitergeht.

Euer hoffnungslos überforderter Seavers
Antworten