Vai al contenuto

Modelli di comandi

Questo documento fornisce informazioni sull'implementazione di sequenze di comandi G-Code nelle sezioni di configurazione gcode_macro (e simili).

Denominazione macro G-Code

Le maiuscole non sono importanti per il nome della macro G-Code: MY_MACRO e my_macro saranno considerate allo stesso modo e possono essere chiamati in maiuscolo o minuscolo. Se nel nome della macro vengono utilizzati dei numeri, devono trovarsi tutti alla fine del nome (ad es. TEST_MACRO25 è valido, ma MACRO25_TEST3 non lo è).

Formattazione di G-Code nel config

L'indentazione è importante quando si definisce una macro nel file di configurazione. Per specificare una sequenza G-Code su più righe è importante che ogni riga abbia un'indentazione adeguata. Per esempio:

[gcode_macro led_lampeggiante]
gcode:
  SET_PIN PIN=my_led VALUE=1
  G4 P2000
  SET_PIN PIN=my_led VALUE=0

Nota come l'opzione di configurazione gcode: inizia sempre all'inizio della riga e le righe successive nella macro G-Code non iniziano mai all'inizio.

Aggiungi una descrizione alla tua macro

Per aiutare a identificare la funzionalità è possibile aggiungere una breve descrizione. Aggiungi descrizione: con un breve testo per descrivere la funzionalità. L'impostazione predefinita è "Macro codice G" se non specificato. Per esempio:

[gcode_macro led_lampeggiante]
description: Esegue lampeggio del led una volta
gcode:
  SET_PIN PIN=my_led VALUE=1
  G4 P2000
  SET_PIN PIN=my_led VALUE=0

Il terminale visualizzerà la descrizione quando si utilizza il comando HELP o la funzione di completamento automatico.

Salva/ripristina lo stato per i movimenti G-Code

Sfortunatamente, il linguaggio di comando G-Code può essere difficile da usare. Il meccanismo standard per spostare la testa di stampa è tramite il comando G1 (il comando G0 è un alias per G1 e può essere usato in modo intercambiabile con esso). Tuttavia, questo comando si basa sull'impostazione dello "stato di analisi del codice G" da M82, M83, G90, G91, G92 e precedenti comandi G1. Quando si crea una macro G-Code è una buona idea impostare sempre in modo esplicito lo stato di analisi del G-Code prima di emettere un comando G1. (Altrimenti, c'è il rischio che il comando G1 faccia una richiesta indesiderabile.)

Un modo comune per farlo è avvolgere le mosse G1 in SAVE_GCODE_STATE, G91 e RESTORE_GCODE_STATE. Per esempio:

[gcode_macro MOVE_UP]
gcode:
  SAVE_GCODE_STATE NAME=my_move_up_state
  G91
  G1 Z10 F300
  RESTORE_GCODE_STATE NAME=my_move_up_state

Il comando G91 pone lo stato di analisi del codice G in "modalità di spostamento relativo" e il comando RESTORE_GCODE_STATE ripristina lo stato a quello che era prima di entrare nella macro. Assicurati di specificare una velocità esplicita (tramite il parametro F) sul primo comando G1.

Espansione del modello

La sezione di configurazione di gcode_macro gcode: viene valutata utilizzando il linguaggio del modello Jinja2. È possibile valutare le espressioni in fase di esecuzione racchiudendole in caratteri { } o utilizzando istruzioni condizionali racchiuse in {% %}. Vedere la documentazione Jinja2 per ulteriori informazioni sulla sintassi.

Un esempio di macro complessa:

[gcode_macro clean_nozzle]
gcode:
  {% set wipe_count = 8 %}
  SAVE_GCODE_STATE NAME=clean_nozzle_state
  G90
  G0 Z15 F300
  {% for wipe in range(wipe_count) %}
    {% for coordinate in [(275, 4),(235, 4)] %}
      G0 X{coordinate[0]} Y{coordinate[1] + 0.25 * wipe} Z9.7 F12000
    {% endfor %}
  {% endfor %}
  RESTORE_GCODE_STATE NAME=clean_nozzle_state

Parametri Macro

Spesso è utile controllare i parametri passati alla macro quando viene chiamata. Questi parametri sono disponibili tramite la pseudo-variabile params. Ad esempio, se la macro:

[gcode_macro SET_PERCENT]
gcode:
  M117 Now at { params.VALUE|float * 100 }%

sono stati invocati come SET_PERCENT VALUE=.2 verrebbero valutati in M117 Now at 20%. Si noti che i nomi dei parametri sono sempre in maiuscolo quando vengono valutati nella macro e vengono sempre passati come stringhe. Se si eseguono calcoli matematici, devono essere convertiti esplicitamente in numeri interi o float.

È comune usare la direttiva Jinja2 set per usare un parametro predefinito e assegnare il risultato a un nome locale. Per esempio:

[gcode_macro SET_BED_TEMPERATURE]
gcode:
  {% set bed_temp = params.TEMPERATURE|default(40)|float %}
  M140 S{bed_temp

La variabile "rawparams"

È possibile accedere ai parametri completi non analizzati per la macro in esecuzione tramite la pseudo-variabile rawparams.

Nota che questo includerà tutti i commenti che facevano parte del comando originale.

Vedere il file sample-macros.cfg per un esempio che mostra come sovrascrivere il comando M117 usando rawparams.

La variabile "printer"

È possibile ispezionare (e modificare) lo stato corrente della stampante tramite la pseudo-variabile printer. Per esempio:

[gcode_macro slow_fan]
gcode:
  M106 S{ printer.fan.speed * 0.9 * 255}

I campi disponibili sono definiti nel documento Status Reference.

Importante! Le macro vengono prima valutate per intero e solo dopo vengono eseguiti i comandi risultanti. Se una macro emette un comando che altera lo stato della stampante, i risultati di tale cambiamento di stato non saranno visibili durante la valutazione della macro. Ciò può anche comportare un comportamento impercettibile quando una macro genera comandi che chiamano altre macro, poiché la macro chiamata viene valutata quando viene richiamata (che avviene dopo l'intera valutazione della macro chiamante).

Per convenzione, il nome immediatamente successivo a printer è il nome di una sezione di configurazione. Quindi, ad esempio, printer.fan si riferisce all'oggetto fan creato dalla sezione di configurazione [fan]. Ci sono alcune eccezioni a questa regola, in particolare gli oggetti gcode_move e toolhead. Se la sezione di configurazione contiene spazi, è possibile accedervi tramite l'accessor [ ], ad esempio: printer["generic_heater my_chamber_heater"].temperature.

Si noti che la direttiva Jinja2 set può assegnare un nome locale a un oggetto nella gerarchia printer. Ciò può rendere le macro più leggibili e ridurre la digitazione. Per esempio:

[gcode_macro QUERY_HTU21D]
gcode:
    {% set sensor = printer["htu21d my_sensor"] %}
    M117 Temp:{sensor.temperature} Humidity:{sensor.humidity}

Azioni

Sono disponibili alcuni comandi che possono alterare lo stato della stampante. Ad esempio, { action_emergency_stop() } provocherebbe l'arresto della stampante. Si noti che queste azioni vengono eseguite nel momento in cui viene valutata la macro, il che potrebbe richiedere un periodo di tempo significativo prima dell'esecuzione dei comandi g-code generati.

Comandi "azione" disponibili:

  • action_respond_info(msg): scrive il dato msg sullo pseudo-terminale /tmp/printer. Ogni riga di msg verrà inviata con un prefisso "//".
  • action_raise_error(msg): annulla la macro corrente (e qualsiasi macro chiamante) e scrivie il dato msg sullo pseudo-terminale /tmp/printer. La prima riga di msg verrà inviata con un prefisso "!!" e le righe successive avranno un prefisso "//".
  • action_emergency_stop(msg): fa passare la stampante a uno stato di spegnimento. Il parametro msg è opzionale, può essere utile per descrivere il motivo dell'arresto.
  • action_call_remote_method(method_name): chiama un metodo registrato da un client remoto. Se il metodo accetta parametri, questi dovrebbero essere forniti tramite argomenti chiave, ad esempio: action_call_remote_method("print_stuff", my_arg="hello_world")

Variabili

Il comando SET_GCODE_VARIABLE può essere utile per salvare lo stato tra le chiamate di macro. I nomi delle variabili non possono contenere caratteri maiuscoli. Per esempio:

[gcode_macro start_probe]
variable_bed_temp: 0
gcode:
  # Salva la temperatura target nella variabile bed_temp
  SET_GCODE_VARIABLE MACRO=start_probe VARIABLE=bed_temp VALUE={printer.heater_bed.target}
  # Disattiva il riscaldamento del piatto
  M140
  # Esegue sonda
  PROBE
  # Chiama la macro finish_probe al completamento
  finish_probe

[gcode_macro finish_probe]
gcode:
  # Ripristinare la temperatura del piatto
  M140 S{printer["gcode_macro start_probe"].bed_temp}

Assicurarsi di tenere in considerazione i tempi della valutazione della macro e dell'esecuzione dei comandi quando si utilizza SET_GCODE_VARIABLE.

Gcode ritardati

L'opzione di configurazione [delayed_gcode] può essere utilizzata per eseguire una sequenza gcode ritardata:

[delayed_gcode clear_display]
gcode:
  M117

[gcode_macro load_filament]
gcode:
 G91
 G1 E50
 G90
 M400
 M117 Load Complete!
 UPDATE_DELAYED_GCODE ID=clear_display DURATION=10

Quando viene eseguita la macro load_filament sopra, visualizzerà un "Load Complete!" messaggio al termine dell'estrusione. L'ultima riga di gcode abilita il delay_gcode "clear_display", impostato per essere eseguito in 10 secondi.

L'opzione di configurazione initial_duration può essere impostata per eseguire il delay_gcode all'avvio della stampante. Il conto alla rovescia inizia quando la stampante entra nello stato "ready". Ad esempio, il codice delay_g riportato di seguito verrà eseguito 5 secondi dopo che la stampante è pronta, inizializzando il display con un messaggio"Welcome!":

[delayed_gcode welcome]
initial_duration: 5.
gcode:
  M117 Welcome!

È possibile che un gcode ritardato si ripeta aggiornandosi nell'opzione gcode:

[delayed_gcode report_temp]
initial_duration: 2.
gcode:
  {action_respond_info("Extruder Temp: %.1f" % (printer.extruder0.temperature))}
  UPDATE_DELAYED_GCODE ID=report_temp DURATION=2

Il codice delayed_gcode sopra riportato invierà "// Extruder Temp: [ex0_temp]" a Octoprint ogni 2 secondi. Questo può essere annullato con il seguente gcode:

UPDATE_DELAYED_GCODE ID=report_temp DURATION=0

Modelli di menu

Se è abilitata una sezione di configurazione display, è possibile personalizzare il menu con le sezioni di configurazione menu.

I seguenti attributi di sola lettura sono disponibili nei modelli di menu:

  • menu.width - larghezza dell'elemento (numero di colonne di visualizzazione)
  • menu.ns - namespace del elemento
  • menu.event - nome dell'evento che ha attivato lo script
  • menu.input - valore di input, disponibile solo nel contesto dello script di input

Le seguenti azioni sono disponibili nei modelli di menu:

  • menu.back(force, update): eseguirà il comando menu back, parametri booleani opzionali <force> e <update>.
    • Quando <force> è impostato su True, interromperà anche la modifica. Il valore predefinito è False.
    • Quando <update> è impostato su False, gli elementi del contenitore padre non vengono aggiornati. Il valore predefinito è True.
  • menu.exit(force) - eseguirà il comando di uscita dal menu, parametro booleano opzionale <force> valore predefinito False.
    • Quando <force> è impostato su True, interromperà anche la modifica. Il valore predefinito è False.

Salvare variabili su disco

Se è stata abilitata una sezione di configurazione save_variables, SAVE_VARIABLE VARIABLE=<nome> VALUE=<valore> può essere utilizzato per salvare la variabile su disco in modo che possa essere utilizzata tra i riavvii. Tutte le variabili memorizzate vengono caricate nel dict printer.save_variables.variables all'avvio e possono essere utilizzate nelle macro gcode. per evitare righe troppo lunghe puoi aggiungere quanto segue nella parte superiore della macro:

{% set svv = printer.save_variables.variables %}

Ad esempio, potrebbe essere utilizzato per salvare lo stato dell'hotend 2-in-1-out e quando si avvia una stampa assicurarsi che venga utilizzato l'estrusore attivo, anziché T0:

[gcode_macro T1]
gcode:
  ACTIVATE_EXTRUDER extruder=extruder1
  SAVE_VARIABLE VARIABLE=currentextruder VALUE='"extruder1"'

[gcode_macro T0]
gcode:
  ACTIVATE_EXTRUDER extruder=extruder
  SAVE_VARIABLE VARIABLE=currentextruder VALUE='"extruder"'

[gcode_macro START_GCODE]
gcode:
  {% set svv = printer.save_variables.variables %}
  ACTIVATE_EXTRUDER extruder={svv.currentextruder}
Torna su