Die von mir vorgestellte Konfiguration beinhaltet noch einen Makel: Sollte der smarte Filament Runout Sensor ein Problem melden, wird der Druck unterbrochen. Das ist soweit richtig. Weniger schön ist aber, dass sich der Druck nicht fortsetzen lässt. Meldungen, die beispielsweise in dieser Situation zum Homing auffordern, sind nicht hilfreich, wenn der Druckraum bereits durch ein Objekt belegt ist. Ein unvollständiges Homing, das nur X und Y zurücksetzt, ist auch nicht sinnvoll. Durch längeres Suchen im Netz bin ich dann auf diese Lösung gekommen:
Nachtrag vom 03.08.2023:
Gegenüber dem ursprünglichen Beitrag ist noch ein weiterer kleiner Eintrag in der printer.cfg notwendig, weil Klipper den Drucker sonst aufgrund eines default-Wertes in den Standby schickt. Mehr dazu am Ende des Beitrags.
Das Problem beginnt damit, dass eine Anweisung in der printer.cfg steht, die ich auch ungefragt akzeptiert und daher von der Dokumentation übernommen habe. Ob die Anweisung nur nicht funktioniert oder anders zu interpretieren ist, habe ich nicht weiter untersucht. Tatsache ist, dass sie genau zu der Meldung führt: must home axis first.
[filament_switch_sensor my_sensor] #pause_on_runout: True # When set to True, a PAUSE will execute immediately after a runout # is detected. Note that if pause_on_runout is False and the # runout_gcode is omitted then runout detection is disabled. Default # is True. #runout_gcode: # A list of G-Code commands to execute after a filament runout is # detected. See docs/Command_Templates.md for G-Code format. If # pause_on_runout is set to True this G-Code will run after the # PAUSE is complete. The default is not to run any G-Code commands. [...]
Die pause_on_runout Anweisung verursacht das Problem. Leider signalisiert sie eben keinen PAUSE-Status. Obendrein ist die Anweisung auch aktiv, wenn sie gar nicht in der printer.cfg steht, denn im Default ist dafür TRUE gesetzt.
Gerade mal eine Seite im Netz brachte mich auf dieses Verhalten. Diverse andere Seiten haben nur mehr oder weniger erfolgreich das Problem umfahren. In meiner neuen printer.cfg steht jetzt das Folgende:
[filament_motion_sensor encoder_sensor] detection_length: 25 # The minimum length of filament pulled through the sensor to trigger # a state change on the switch_pin # Default is 7 mm. extruder: extruder # The name of the extruder section this sensor is associated with. # This parameter must be provided. switch_pin: ~PC5 # Pulldown resistor laut Bigtreetech Anleitung # Anschluss J40 unten rechts neben den Endstopps # die folgenden Parameter sollten im Default nicht belegt werden pause_on_runout: False runout_gcode: PAUSE #runout_gcode: M600 #insert_gcode: #event_delay: 3.0 #pause_delay: 0.5
Die ursprüngliche M600-Anweisung an dieser Stelle führte zu einem Macro, das widerum das Klipper-Macro PAUSE ausführt. Ich habe es jetzt hier direkt ausgeschrieben.
Diese „kleine“ Änderung war sofort von Erfolg gekrönt. Der absichtlich herbeigeführte Fehler aufgrund Filamentmangel führt natürlich wieder zur Unterbrechung des Drucks und zum Parken des Druckkopfs. Jetzt ist aber über den Resume-Knopf im KlipperScreen der Weiterdruck möglich. Die lästige Homing-Meldung unterbleibt, da die Positionsdaten gespeichert wurden.
Meist ist es jedoch mit dem einfachen Fortsetzen des Drucks nicht getan, denn die Pause hatte ja einen Grund. Der wohl überwiegende Fehler dürfte das Ausgehen des Filaments sein. Also muss gegebenenfalls der Filamentrest ausgegeben werden, neues Filament muss geladen werden und dann muss meist noch etwas nachgedrückt werden, damit das Hotend bis zur Spitze gefüllt ist. Das kann man natürlich alles mit Konsolenkommandos in GCODE-Format erledigen. Eleganter sind Makros. Zwei der Wichtigsten sind sogar schon in meiner printer.cfg enthalten:
[gcode_macro UNLOAD_FILAMENT] gcode: M117 Filament wird ausgeworfen G91 G92 E0 G1 E15 F240 G92 E0 G1 E-10 F2100 G92 E0 G1 E-50 F1800 G92 E0 G1 E-10 F900 G90 [gcode_macro LOAD_FILAMENT] gcode: M117 Filament wird geladen G91 G92 E0 G1 E75 F120 G92 E0 G90 [gcode_macro PURGE_FILAMENT] gcode: G91 G92 E0 G1 E10 F200
UNLOAD_FILAMENT und LOAD_FILAMENT sind schon enthalten. Neu dazugekommen ist noch PURGE_FILAMENT. Die ersten beiden brauche ich wohl kaum zu erklären. Letzteres Makro ist neu und dient dazu, das Hotend komplett mit Kunststoff zu befüllen, falls das mit dem LOAD-Kommando noch nicht gereicht hat.
Eine kleine wichtige Erkenntnis in diesem Zusammenhang.: Man sieht immer als Einleitung G91, G92 E0. Hiermit wird auf relative Positionierung umgeschaltet und dann wird die Nullposition für den Extruder festgelegt. Vielleicht hat es der eine oder andere schon mal versucht, nach dem Druckabbruch mit einem G1 E-Kommando Filament zu fördern. Meist endet das mit einer Fehlermeldung, was daran liegt, dass das System noch im absoluten Positioniermodus ist. Übrigens muss man nicht zurückschalten. Das erledigt sich allein durch die Fortführung des Drucks.
Mit den Makros allein ist der Komfort aber noch nicht komplett. Schön wären Buttons auf der KlipperScreen-Obefläche, die diese Makros ausführen. Das geht in KlipperScreen sehr einfach:
[menu __print macroP] name: Macro Thomas icon: heat-up [menu __print macroP entladen] name: Filament entladen icon: heat-up method: printer.gcode.script params: {"script":"UNLOAD_FILAMENT"} #enable: {{ printer.power_devices.count > 0 }} [menu __print macroP laden] name: Filament laden icon: heat-up method: printer.gcode.script params: {"script":"LOAD_FILAMENT"} #enable: {{ printer.power_devices.count > 0 }} [menu __print macroP purgeF] name: purge Filament icon: heat-up method: printer.gcode.script params: {"script":"PURGE_FILAMENT"} #enable: {{ printer.power_devices.count > 0 }}
Dieser Abschnitt wurde in die KlipperScree.conf aufgenommen und sorgt für eine Menüerweiterung. Die Anleitung dazu findet sich in der Dokumentation von KlipperScreen. Der erste Abschnitt erzeugt im Hauptmenü des Printdialogs, deshalb __print (im Hauptmenü wäre es dann __main), einen zusätzlichen Button (Macro Thomas). Sogar das Icon (heat-up) könnte man auswählen, wozu ich bis zur Erstellung dieses Beitrags zu faul war.
Die drei nächsten Abschnitte erzeugen in dem Untermenü „Macro Thomas“ drei weitere Buttons, hinter denen die eigentlichen Macros stecken, die in der printer.cfg beschrieben sind. Die Methode heisst deshalb printer.gcode.script. In den Parametern wird dann genau auf das gewünschte Makro verwiesen. Die jeweils letzte Zeile (#enable: {{ printer.power_devices.count > 0 }}) würde, – sofern nicht auskommentiert -, eine Steuerung zur Sichtbarkeit erlauben.
Das Ergebnis der Bemühungen sieht man dann hier hinter dem Einstellungen-Button im Print-Dialog:
Das gleiche Menü habe ich mir im Hauptmenü auch angelegt um auch dort diese Funktionen nutzen zu können.
Nachtrag vom 03.08.2023:
Wider Erwarten war das Problem mit den oben durchgeführten Maßnahmen doch nicht vollständig behoben. Ein default-Wert aus Klipper sorgt dafür, dass nach genau 10 Minuten keine Wiederaufnahme des Druckes möglich ist.
Es geht um den Wert SET_IDLE_TIMEOUT, der in der Konfiguration normalerweise überhaupt nicht zu sehen ist. Er ist mit 10 Minuten vorbelegt. Das heißt im Umkehrschluss, dass nach 10 Minuten alle Heizungen abgeschaltet werden und der Drucker auch die gespeicherte Position vergisst. Aufheizen wäre gar kein Problem. Die Position wiederzufinden und sogar ein Homing bei belegtem Druckraum durchzuführen aber schon. Es gibt aber eine Lösung:
In der printer.cfg muss im PAUSE-Ablauf der oben genannte Wert neu belegt werden:
SET_IDLE_TIMEOUT TIMEOUT=43200 ; set timeout to 12 hours
Klar, 12 Stunden sind schon recht hoch gewählt. Auf der anderen Seite möchte ich aber auch wirklich sichergehen. Der Eintrag muss in der PAUSE-Funktion gesetzt werden, könnte aber wohl auch im Start-Kommando aufgeführt werden. Ein Beispiel für die PAUSE-Funktion ist hier:
[gcode_macro PAUSE] description: Pause the actual running print rename_existing: PAUSE_BASE gcode: PAUSE_BASE _TOOLHEAD_PARK_PAUSE_CANCEL
Als Erstes wird die interne PAUSE-Funktion durch ein eigenes Makro überschrieben. Zwar wird dann doch wieder das ursprüngliche Makro PAUSE_BASE Teil des neuen Makros, aber es kommt noch etwas hinzu. Ich will mich hier gar nicht mit fremden Federn schmücken. Die Makros habe ich prinzipiell hier gefunden.
Erst ganz am Schluss wird der neue Eintrag in das _TOOLHEAD_PARK_PAUSE_CANCEL Makro eingefügt:
[gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] description: Helper: park toolhead used in PAUSE and CANCEL_PRINT variable_extrude: 1.0 gcode: ##### set park positon for x and y ##### # default is your max posion from your printer.cfg [hier steht noch Einiges dazwischen, siehe Link] {% else %} {action_respond_info("Printer not homed")} {% endif %} SET_IDLE_TIMEOUT TIMEOUT=43200 ; set timeout to 12 hours
Kleine Anmerkung noch dazu: Ich hatte zurerst TIMEOUT = 43200 geschrieben. Das nimmt Klipper nicht an. Links und rechts des Gleichheitszeichens darf kein Blank stehen!
Nach Abspeichern und Neustart der Firmware sollte das jetzt endlich zumindest für 12 Stunden funktionieren. Bei mir ließ sich der Druck nach über 40 Minuten fortsetzen.
Dem Druckabbruch ist somit der Schrecken genommen. Mit dieser PAUSE-Funktion kann man jetzt schon sehr gut arbeiten. Die Änderungen in der printer.cfg und in der KlipperScreen.conf wurden alle in der Mainsail-Oberfläche auf dem PC durchgeführt. Die Oberfläche erreicht man über die Eingabe der IP-Adresse des Kleinrechners auf dem Klipper installiert ist.