Schleife: Wiederholen einer Abfrage im except

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
frannek
User
Beiträge: 33
Registriert: Dienstag 28. Januar 2014, 12:17

Hallo Zusammen,
ich stehe vielleicht vor einem einfachen Problem, komme jedoch nicht weiter.
Ich habe eine Schleife, welche im Modbus aus einem Sensor einen Wert auslesen soll. Leider kommt es hin und wieder zu Lesefehler (oder der Sensor ist schlicht kaputt), weswegen ich nach einer kleinen Pause den Sensor erneut auslesen lassen möchte.

Momentan wird so ausgelesen:

Code: Alles auswählen

    count = 1
    for x in floatinstrumentlist:
        try:
            float_list[count] = x.read_float(floatregister_list[count], functioncode=4, numberOfRegisters=2)
        except IOError as ex:
            float_list[count] = 99999

        except ValueError as ex:
            float_list[count] = -99999
        time.sleep(0.08) 
        count += 1
    time.sleep(0.06)
Da ich den Wert 99999 wirklich nur im absoluten Ausfall haben möchte, würde ich im ersten escept gerne nochmal auslesen und hatte das so probiert:

Code: Alles auswählen

count = 1
    for x in floatinstrumentlist:
        try:
            float_list[count] = x.read_float(floatregister_list[count], functioncode=4, numberOfRegisters=2)
        except IOError as ex:
            time.sleep(2.00)
            float_list[count] =  x.read_float(floatregister_list[count], functioncode=4, numberOfRegisters=2)
	    except IOError as ex:
                float_list[count] = 99999	
	    except ValueError as ex:
                float_list[count] = -99999
            time.sleep(0.08) 
            count += 1
    time.sleep(0.06)



Geht jedoch nicht. Und genau da liegt die Frage. Wie kann ich ein except aus dem ersten readout so nutzen, dass ich nochmals auslese und erst das zweite IOError nutze, um den Wert 99999 einzutragen?

Schöne Grüße

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

@frannek: mit einer Schleife. Außerdem solltest Du sinnvolle Variablennamen (nicht x) benutzen und der Type sollte auch nicht im Namen vorkommen (also floatinstruments statt floatinstrumentlist) und Du solltest eine neue Liste erstellen, statt die alte wiederzuverwenden. Zusammengehörige Werte wie Instrument und Register sollten in einer Liste gespeichert werden.:

Code: Alles auswählen

    float_values = []
    for instrument, register in zip(float_instruments, float_registers):
        try:
            for retry in range(2):
                try:
                    value = instrument.read_float(register, functioncode=4, numberOfRegisters=2)
                    break
                except IOError:
                    time.sleep(2)
            else:
                value = 99999
        except ValueError:
            value = -99999
        float_values.append(value)
        time.sleep(0.08) 
frannek
User
Beiträge: 33
Registriert: Dienstag 28. Januar 2014, 12:17

@Siriu3 Für mich bist du noch immer ein Gott ;-) Danke für die Tipps. Auf Grund der Bequemlichkeit habe ich es erstmal in meinem Code modifiziert. Die Auflistung und Bezeichnungen sind teilweise sehr suboptimal. Liegt wohl daran, dass ich den Anfangscode mal jemandem zum prüfen gegeben habe und dieser ihn auch modifiziert hat. Seither hat sich auch wieder einiges geändert. jetzt funktioniert das Auslesen sogar unter übelsten Bedingungen. Vielen Dank!
Antworten