Datenstruktur Variable mit 2 Namen.
__blackjack__ hat geschrieben: ↑Donnerstag 23. September 2021, 11:46 @rob87: Da ist ein unbenutztes `input_richtung` auf Modulebene. Und was ist denn bei Dir Zeile 38? Bei mir ist das ``if input+add > 1.0:`` in der `simu_input()`-Funktion.
Code: Alles auswählen
print(self.alt_val)
Ok wird nach "return" kein Code mehr abgearbeitet? dann müsste man es so umschrieben:In `Flanke.pos()` und `Flanke.neg()` steht jeweils toter Code nach dem ``if``/``else``. Denn dort steht in beiden Zweigen ein ``return``, womit der Code danach nie ausgeführt werden kann.
Code: Alles auswählen
def pos(self,val,schwelle= 0.75):
if val > schwelle and self.alt_val<schwelle: # erstes mal die Schwelle überschritten
ret_val= True
else:
ret_valFalse
self.alt_val = val # aktuellen wert speichern
print(self.alt_val)
return ret_val
So funktionierts jetzt:
Code: Alles auswählen
import time
import random
class Flanke:
def __init__(self):
self.alt_val = 0.0
def pos(self,val,schwelle= 0.75):
if val >= schwelle and self.alt_val<schwelle:
ret_val= True
else:
ret_val= False
self.alt_val = val # aktuellen wert speichern
return ret_val
def neg(self,val,schwelle= 0.75):
if val<=schwelle and self.alt_val>schwelle:
ret_val= True
else:
ret_val= False
self.alt_val = val
return ret_val
class Toggle:
def __init__(self):
self.zustand= False
self.flanke = Flanke()
def status(self,val, schaltschwelle = 0.5):
if self.flanke.pos(val,schaltschwelle):
self.zustand = not self.zustand
return self.zustand
def simu_input(input): #input zwischen 0.4 und 1.0 schwingen lassen
input_richtung =1.0
add=(random.randint(1, 10))*0.01
if input+add > 0.88:
input_richtung =-1.0
elif input - add < 0.4:
input_richtung =1.0
return input + (add*input_richtung)
def main():
schalter= Toggle() # bistabiler Schalter
stick = 0.7 #eingabeelemnt von Hardware
while True:
if schalter.status(stick,0.8):
str = 'ON %s'%(stick)
else:
str = 'OFF %s'%(stick)
print(str)
stick=simu_input(stick)
time.sleep(0.2)
input_richtung=1.0
main()
@rob87: eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs. Wenn man eine if-Abfrage nur dazu benutzt, einer Variable True oder False zuzuweisen, dann kann man gleich die Bedinung der Variable zuweisen.
Benutze keine Abkürzungen, statt alt_val würde man alternative_value schreiben, oder sollte das alter_wert heißen? Die Mischung aus deutsch und englisch ist hier sehr verwirrend.
In simu_input ist der elif-Zeig unnötig, da darin input_richtung gar nicht verändert wird. Der Kommentar stimmt nicht damit überein, was die Funktion macht.
`str` ist der Name einer eingebauten Klasse und sollte nicht überschrieben werden.
Benutze keine Abkürzungen, statt alt_val würde man alternative_value schreiben, oder sollte das alter_wert heißen? Die Mischung aus deutsch und englisch ist hier sehr verwirrend.
In simu_input ist der elif-Zeig unnötig, da darin input_richtung gar nicht verändert wird. Der Kommentar stimmt nicht damit überein, was die Funktion macht.
`str` ist der Name einer eingebauten Klasse und sollte nicht überschrieben werden.
Code: Alles auswählen
import time
import random
class Flanke:
def __init__(self):
self.alter_wert = 0.0
def pos(self, wert, schwelle=0.75):
resultat = wert >= schwelle and self.alter_wert < schwelle
self.alter_wert = wert
return resultat
def neg(self, wert, schwelle=0.75):
resultat = wert <= schwelle and self.alter_wert > schwelle
self.alter_wert = wert
return resultat
class Toggle:
def __init__(self):
self.zustand = False
self.flanke = Flanke()
def status(self, wert, schaltschwelle=0.5):
if self.flanke.pos(wert, schaltschwelle):
self.zustand = not self.zustand
return self.zustand
def simuliere_eingabe():
""" input zwischen 0.4 und 1.0 schwingen lassen """
wert = 0.7
richtung = 1.0
while True:
add = random.randint(1, 10) * 0.01
if wert + add > 1.0:
richtung = -1.0
elif wert - add < 0.4:
richtung = 1.0
wert += add * richtung
yield wert
def main():
stick = simuliere_eingabe()
schalter = Toggle() # bistabiler Schalter
while True:
wert = next(stick)
if schalter.status(wert, 0.8):
text = f'{wert:.2f} ON'
else:
text = f'{wert:.2f} OFF'
print(text)
time.sleep(0.2)
if __name__ == "__main__":
main()