Search

Register

Thanks for signing-up! You will receive an email with further instructions to activate your account!

username already taken
You already have an account? .

Login

Forgot password?
Don't have an account yet? Register now for using the UI-Designer and the forum or creating projects.
Login to create topics and posts!



switch ON - Python programmierung

#1 June 13, 2019 16:49:58 by PJanow4711

switch ON - Python programmierung

Hallo Zusammen,

ich benutze die Net-Io App seit einigen Jahren für meine Robotersteuerung via Raspi und Python. Alles funktioniert super und ich bin sehr zufrieden!

Wollte eine neue Funktion implementieren und stehe momentan etwas auf dem Schlauch. Vielleicht habt Ihr mal eine Idee … danke!

Wenn ich ein switch auf ON stelle dann wird in dem Python Programm dieses Event nur einmal getriggert. Das funktioniert wunderbar aber ich würde z.B. gerne eine Variable X so lange hochzählen bis der switch wieder auf OFF geht.

Parallel sollten aber alle anderen Tasten weiter funktionsfähig bleiben. Habe schon so etwas versucht in der Hauptschleife mit booleschen Variablen aber das hat auch nicht richtig funktioniert.

Hier wird die Boolesche Variable gesetzt:
        if line == 'switchOn':
global switchOn
self.send('off\n')
print 'Switch Ein'
switchOn = True

elif line == 'switchOff:
global switchOn
self.send('off\n')
print 'Switch Aus'
switchOn = False
Das ist die Hauptschleife:
if __name__ == "__main__":
pollster = EPoll()
pollster.register(Server(("",54321),pollster), select.EPOLLIN)

while True:
evt = pollster.poll()
for obj, flags in evt:
readwrite(obj, flags)

# switchOn ist eine Globale Variable die gesetzt wird, wenn der switch auf ON steht.
# diese if Abfrage müsste eigentlich ständig durchlaufen werden ... aber es passiert immer nur
# einmal wenn eine NetIo Taste betätigt wird

if switchOn:
x = x + 1
Hat jemand vielleicht eine Idee?

Viele Grüße und danke,
Peter

Edited PJanow4711 (June 13, 2019 20:32:42)

#2 June 15, 2019 12:14:33 by mcgiver0510

switch ON - Python programmierung

Hallo Peter,

das Problem steckt im Detail…

…der TCP-Client arbeitet blockierend ( blocking mode ) - das bedeutet - er wartet ständig auf Daten von NetIO…

…erhält er Daten - werden sie verarbeitet - danach wartet er wieder…

…dieses hast du ja oben bereits beschrieben…

… zuständig dafür ist diese Zeile :
receivedData = self.recv(1024) ##### hier kommen die Daten von NetIO an

Es gibt mehrere Lösungen…

…erstmal die Einfachste :

…du benutzt ein verstecktes Label…( einfach die Propertys so anpassen - das man es nicht sieht )

…dieses Label muss nun ein “Interval” und ein “SendAttribut” erhalten…

…dein “If/elif”-Konstruct muss nun so erweitert werden - das du das “SendAttribut” von dem Label auswerten kannst…


zum Beispiel :

NetIO - Label :

sends    : SwitchCounter
interval : 1000 <<<- 1000ms - kann auch kleiner gewählt werden - aber nicht kleiner 200

dein Client :


elif line == 'SwitchCounter':
--- hier dein Code -----

Dieses würde ich an deiner Stelle erstmal probieren - wenn das nicht zu einer Lösung beiträgt wird es schwieriger…

…dann musst du dich mit Threads auseinandersetzen…

Edit :

ja - super…

lg
kalli





Edited mcgiver0510 (June 18, 2019 09:02:15)

#3 June 15, 2019 16:48:17 by PJanow4711

switch ON - Python programmierung

Hallo Kalli,

Danke, das hat super funktioniert!

LG Peter

Edited PJanow4711 (June 18, 2019 07:52:48)