LukasRtM Geschrieben November 11, 2013 at 20:58 Geschrieben November 11, 2013 at 20:58 Servus Zusammen Ich habe einen kleinen Programmcode gebastelt. Nun habe ich gemerkt, dass das ganze Skript abgebrochen wird, sobald ein Sensor fehlt (z.B. wegen Wackelkontakt oder irgendwelchen Defekten). Das soll mir natürlich nicht passieren. Nun war meine Idee, eine if-Abfrage zu machen, ob die Bricklets anzusprechen sind, oder nicht. Aber wie mache ich das genau? Ich programmiere in Python und kann mir gerade nicht vorstellen, was für eine Bedingung mit dem IF abgefragt werden soll. Hier der Code: #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID_master = "######" UID_dist = "###" UID_temp = "###" UID_current ="###" from tinkerforge.ip_connection import IPConnection from tinkerforge.brick_master import Master from tinkerforge.bricklet_temperature import Temperature from tinkerforge.bricklet_distance_ir import DistanceIR from tinkerforge.bricklet_voltage_current import VoltageCurrent if __name__ == "__main__": ipcon = IPConnection() # Create IP connection master = Master(UID_master, ipcon) # Create device object temp = Temperature(UID_temp, ipcon) dist = DistanceIR(UID_dist, ipcon) # Create device object vc = VoltageCurrent(UID_current, ipcon) ipcon.connect(HOST, PORT) # Connect to brickd # Don't use device before ipcon is connected # Get voltage and current from stack (in mV/mA) voltage = master.get_stack_voltage()/1000.0 current = master.get_stack_current()/1000.0 chip_temp = master.get_chip_temperature()/10.0 # Get Temperature from Temp-Bricklet temperature = temp.get_temperature()/100.0 # Get Current and Voltage from Bricklet bricklet_current = vc.get_current()/1000.0 bricklet_voltage = vc.get_voltage()/1000.0 print(voltage) ipcon.disconnect() Danke für hilfreiche Kommentare, Lukas Zitieren
LukasRtM Geschrieben November 11, 2013 at 21:07 Autor Geschrieben November 11, 2013 at 21:07 Ich habe gerade eben diesen Beitrag gesehen. http://www.tinkerunity.org/forum/index.php/topic,1961.0.html Aber ich weiss nicht, was für einen Python-Code ich brauche, um den Status des Bricklets bei bekannter UID abzufragen. Schöne Grüße Lukas Zitieren
photron Geschrieben November 12, 2013 at 09:17 Geschrieben November 12, 2013 at 09:17 In diesem Programm erst zu fragen ob ein Brick(let) wirklich da ist, wobei dein Programm eigentlich davon ausgeht das es da ist, ist eigentlich nicht typisch Python. Typischer wäre es einfach die Getter aufzurufen und die Exception zu behandeln, die möglicherweise auftreten kann. Also z.B. so: try: voltage = master.get_stack_voltage()/1000.0 except Exception as e: print "get_stack_voltage() failed", str(e) Statt erst zu prüfen ob das Brick(let) vielleicht nicht da ist (wobei is_device_available() nicht in der Form existiert und nur der Verdeutlichung dient): if is_device_available(master): voltage = master.get_stack_voltage()/1000.0 Wenn davon auszugehen ist, dass meistens oder immer nicht alle Bricklets die dein Programm erwartet vorhanden sind, dann kann es sinnvoll sein zu erst per Enumerate zu erfragen was angeschlossen ist. Dann muss nur einmal kurz gewartet werden, statt bei jedem Aufruf einen möglichen Timeout abwarten zu müssen wenn ein erwartetes Brick(let) nicht vorhanden ist. Hier ein Beispiel, dass per Enumerate die Liste der bekannten UIDs aufbaut und aktuell hält (ungetestet): available_uids = set() def cb_enumerate(uid, connected_uid, position, hardware_version, firmware_version, device_identifier, enumeration_type): if enumeration_type == IPConnection.ENUMERATION_TYPE_DISCONNECTED: available_uids.remove(uid) else: available_uids.add(uid) if __name__ == "__main__": ipcon = IPConnection() ipcon.connect(HOST, PORT) ipcon.register_callback(IPConnection.CALLBACK_ENUMERATE, cb_enumerate) ipcon.enumerate() time.sleep(1) # wait a moment for enumerate callbacks print available_uids ipcon.disconnect() Du kannst jetzt prüfen ob deine erwartete UID in available_uids ist und dann entsprechend handeln. Dies kann aber nicht alle Fälle abdecken. Wenn dein Programm z.B. mittendrin die Verbindung zum Stack verliert werden die Funktionen der Brick(let) Objekte immer noch Exceptions werfen. Du kommst also um Fehlerbehandlung für ein robustes Programm nicht herum. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.