time.sleep() geht auf einmal nicht mehr

Alles rund um TX(T) und RoboPro, mit ft-Hard- und Software
Computing using original ft hard- and software
Forumsregeln
Bitte beachte die Forumsregeln!
Antworten
BobbyWander
Beiträge: 8
Registriert: 21 Aug 2025, 15:07

time.sleep() geht auf einmal nicht mehr

Beitrag von BobbyWander » 20 Feb 2026, 21:09

Hallo Torsten,

ich versuche eine Box auf meinen Plotter zu zeichnen. Wenn der Plotter versucht zu plotten, dann geht der Stift von der Geraden ab und zeichnet eine Kurve, wo er eigentlich einen Strich zeichnen sollte und ingnoriert den time.sleep(). Ich habe die neueste Version von Python 3.14.3, TX2013 firmware version 4.7.0 und ftrobopy 2.0.2 installiert. Vor zwei Tagen ging noch alles einwandfrei.

Code: Alles auswählen

def move_to_line(dx, dy, speed=340):
    dx_l = to_counts(dx / 10, 'x')
    dy_l = to_counts(dy / 10, 'y')
    
    mg = justagecheck(dx, dy)
    if mg:
        return mg
    else:
        try:
            if dx < 0 and dy == 0:
                motorX.setDistance(-dx_l)
                motorX.setSpeed(-speed)
            elif dx > 0 and dy == 0:
                motorX.setDistance(dx_l)
                motorX.setSpeed(speed)
            elif dy < 0 and dx == 0:
                motorY.setDistance(-dy_l)
                motorY.setSpeed(-speed)
            elif dy > 0 and dx == 0:
                motorY.setDistance(dy_l)
                motorY.setSpeed(speed)
            print(dx_l, dy_l)
            # Warte bis beide fertig sind
            while not motorX.finished() or not motorY.finished():
                if motorX.finished():
                    motorX.stop()
                    break
                if motorY.finished():
                    motorY.stop()
                    break
            txt.updateWait()
             
        except Exception:
            print("Fallback-Synchronisation: setDistance nicht verfügbar, fahre getrennt.")
            motorX.setSpeed(speed if dx_l>0 else -speed)
            motorY.setSpeed(speed if dy_l>0 else -speed)
            est = max(abs(dx_l), abs(dy_l)) / 100.0
            time.sleep(est)
            motorX.setSpeed(0)
            motorY.setSpeed(0)
 
Jetzt kommt die Box-Funktion:

Code: Alles auswählen

def box(xa, xe, ya, ye):
    """
      Box zeichnen:
      xa, ya: Wo geplottet werden soll
      xe, ye: Einzelne Striche zeichnen
    """      
    tv = 0.9
    move(xa, ya)
    mg_on()
    print("Box wird gezeichnet...", xa, xe, ya, ye)
    move_to_line(xe, 0)
    time.sleep(tv)
    move_to_line(0, ye)
    time.sleep(tv)
    move_to_line(-xe, 0)
    move_to_line(0, -ye)
    mg_off()
    print("Fertig!")
    print()
Kannst Du mir bitte weiterhelfen? Was ist an diesem Code falsch? Ich hoffe auf eine baldige Antwort und verbleibe

Mit freundlichen Grüßen
BobbyWander

jona2004
Beiträge: 178
Registriert: 10 Jun 2011, 22:30

Re: time.sleep() geht auf einmal nicht mehr

Beitrag von jona2004 » 21 Feb 2026, 15:43

Hallo BobbyWanderer,
Nur ein kleiner HInweis.
Der Kommentar im ersten Listing passt nicht zu der Funktion des Codes.
Dort steht:

Code: Alles auswählen

# Warte bis beide fertig sind
Aber der code wartet nur bis der erste Motor "finished"stopped diesen und verlässt dann per break die while Schleife.

Code: Alles auswählen

            while not motorX.finished() or not motorY.finished():
                if motorX.finished():
                    motorX.stop()
                    break
                if motorY.finished():
                    motorY.stop()
                    break
 
Grüße Joachim

BobbyWander
Beiträge: 8
Registriert: 21 Aug 2025, 15:07

Re: time.sleep() geht auf einmal nicht mehr

Beitrag von BobbyWander » 21 Feb 2026, 18:40

Hallo Joachim,

vielen Dank für den Hinweis. Entschuldigung! Ich habe es versäumt, den Kommentar zu ändern. Mein Aufruf zur Hilfe geht übrigens über Torsten hinaus. Wenn der Rest der Community irgendetwas über mein Problem zu sagen hat, dann redet frei heraus. Ich bin für alle Lösungsmöglichkeiten offen.

Viel Grüße
BobbyWander

jona2004
Beiträge: 178
Registriert: 10 Jun 2011, 22:30

Re: time.sleep() geht auf einmal nicht mehr

Beitrag von jona2004 » 23 Feb 2026, 19:55

Hallo BobbyWander,
Ob der Code falsch ist oder nicht kann ich nicht sagen aber das sind ein paar Stellen die ich merkwürdig finde.
1- der Titel "time.sleep() geht nicht mehr" ist komisch. AEs könnte ja auch sein, dass im zweiten Listing der code mit time.sleep(tv) gar nicht ausgeführt wird. Könnte man testen indem man tv mal auf 5 (sekunden) setzt und z.B. eine Lampe vor sleep an- und nachher ausschaltet
oder ein print statement einbauen.

Der Code in Listing 1 is knifflig.
1 - Was ist der return wert von justagecheck?
wenn der z.B None oder ein value ist sollte der code danach heissen if mg not None:, ist sauberer, das python auch 0, 0.0, "" usw als False betrachtet.
2 - Was to_counts macht wäre evtl interressant
3 - in dem try block finde ich komisch, dass wenn weder dx also auch dy nicht 0 sind passiert gar nichts ausser einem

Code: Alles auswählen

print(dx, dy)
4 - Achtung python ist als nicht typisierte Sprache schonmal knifflig. wenn dx, dy aus brechnungen stammen könnten das floating point werte sein.
Ein == Vergleich mit floating kann üble Nebenwirkungen haben.
5 - Warum mit try/except gearbeitet wird ist mir unklar. Ich nehme das nur für Fehlerbehandlungen und wo könnte hier ein Fehler auftreten?!?
6 - Im except block werden die motoren erst mit speed angeworfen aber anch einer Zeit

Code: Alles auswählen

time.sleep(est)
die von der maximalen Entfernung abhängig ist abgeschaltet. Unklar wofür das gut sein soll ein Motor kann viel länger fahren als aus seiner d_l Entfernung hervorgehen sollte.

Als Hinweis für klareren code: Es wäre u.,U. einfacher zwei funktionen zu bauen move_x für x-dir und move y-für y-dir weil das wären jeweils 4 Zeiler.
Mehr Fragen als Antworten :-)
Grüße Joachim

Antworten