Jump to content

Recommended Posts

Geschrieben

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

Geschrieben

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.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...