Aktive Aktion unterbrechen

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
zazzou
User
Beiträge: 2
Registriert: Dienstag 2. Februar 2021, 12:30

Hallo zusammen,

ich suche nach einer Funktion, die es mir ermöglicht,
eine aktuell durchgeführte Aktion zu unterbrechen.
Also der Verlauf meiner Aktion sieht dabei so aus:

PumpeAbsenken.value() = True
time.sleep(2)
PumpeAbsenken.value() = False

Und ich möchte jetzt eine Funktion, die diesen Ablauf unterbrechen kann,
wenn der Endschalter an der Kette, an der die Pumpe hängt, ausgelöst und damit der Wert des Auslösers auf 1 gesetzt wird.

Sinn dahinter ist, dass die Pumpe mehrere Male abgesenkt werden soll,
bis ein Endschalter aktiviert wird.
Dieser wird während des Absenkens aktiviert, allerdings zu Beginn des 2-Sekunden-Intervalls.
Danach wird die Kette für die restliche Zeit weiter "abgesenkt", obwohl durch den Endschalter begrenzt.
Als Resultat wird der Endschalter durch die wirkende Kraft beschädigt.

Um dem Vorzubeugen, wäre es toll, wenn sich eine Funktion zwischenschalten könnte, sobald der Endschalter auslöst.
Ich dachte schon daran, eine While-Schleife mit einem sleep von unter einer Sekunde zu verwenden,
das grillt allerdings die CPU.

Ich hoffe, ihr habt Ideen, die mir weiterhelfen können.

Viele Grüße,
zazzou
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zazzou: Der gezeigte Quelltext ist syntaktisch falsch weil ein Aufruf nicht Ziel einer Zuweisung sein kann.

Das was Du willst geht so im allgemeinen nicht. Statt des `time.sleep()` könntest Du die zwei Sekunden lang auf den Endschalter warten. Beziehungsweise könntest Du Dir die Zeit eventuell auch ganz sparen und einfach auf den Endschalter warten. Mit `gpiozero` beispielsweise:

Code: Alles auswählen

    absenkpumpe.on()
    endschalter.wait_for_active()
    absenkpumpe.off()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
zazzou
User
Beiträge: 2
Registriert: Dienstag 2. Februar 2021, 12:30

Hallo __blackjack__,

das stimmt, der eigentliche Code lautet so:

rpi_master.io.PumpeAblassen.value = True
time.sleep(2)
rpi_master.io.PumpeAblassen.value = False

Ich hatte zum Zeitpunkt des Posts keinen Zugriff auf das Skript und hatte den Syntax nicht mehr im Kopf, daher habe ich mir so beholfen.

Die Pumpe wird schrittweise abgesenkt, bis sie einen bestimmten Trübungsgrad unterschreitet,
daher ist es nicht möglich, ohne Zeitvorgabe zu warten, damit in den Schritten vor Erreichen des Endschalters zwischengestoppt wird.

Wenn der Endschalter ausgelöst hat, sieht das so aus:
rpi_master.io.PumpeUnten.value = True

Wie würde dann die wait_for_active Funktion in meinem Fall lauten?
Ich konnte sie nicht mal eben bei einer Recherche finden.

Viele Grüße,
zazzou
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zazzou: Ich weiss ja gar nicht ob Du die Methode hast, weil Du soweit ich das sehe noch nicht verraten hast mit welcher Bibliothek Du da arbeitest. Bei `gpiozero` gäbe es bei der Methode aus meinem Beispiel auch ein `timeout`-Argument.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten