2. 宏参数传递与默认值

任务目标

创建一个Klipper宏,接受用户传入的参数并支持默认值。以暂停宏为例:调用M400 P200时,宏读取参数P的值200作为暂停时间(毫秒);若调用时不带参数(如直接执行M400),则使用默认值500毫秒。

实现方案

在Klipper的gcode_macro配置中,通过params对象读取传入参数,使用Python的get方法设置默认值。核心逻辑为:将P参数转换为浮点数,调用UPDATE_DELAYED_GCODE实现非阻塞延时暂停。

关键完整代码

将以下内容添加到printer.cfg文件中:

[gcode_macro M400]
description: Pause for P milliseconds (default 500ms)
gcode:
    # 读取P参数,若未提供则使用默认值500
    {% set pause_ms = params.P|default(500)|float %}
    # 将毫秒转换为秒
    {% set pause_s = pause_ms / 1000.0 %}
    # 创建延迟暂停(非阻塞,允许其他命令排队)
    RESPOND TYPE=command MSG="Pausing for {pause_ms:.0f} ms"
    UPDATE_DELAYED_GCODE ID=pause_hold DURATION={pause_s}
    # 等待暂停完成
    WAIT_DELAYED_GCODE ID=pause_hold

[delayed_gcode pause_hold]
gcode:
    RESPOND TYPE=command MSG="Pause complete"

运行与验证

  1. 配置加载:保存printer.cfg后,在Klipper终端执行FIRMWARE_RESTART或通过网页界面点击“重启固件”,使配置生效。
  2. 测试默认值:在控制台发送M400,观察终端返回Pausing for 500 ms,约0.5秒后返回Pause complete。
  3. 测试自定义参数:发送M400 P200,终端应返回Pausing for 200 ms,约0.2秒后返回Pause complete。
  4. 判定通过:若两条命令均按预期延时并输出对应消息,说明参数传递与默认值机制工作正常。

关键说明

  • params.P|default(500)是Jinja2过滤器语法,default仅在参数缺失时生效;若传入非数字值(如M400 Pabc),float转换会报错,属于预期行为。
  • 使用UPDATE_DELAYED_GCODE而非G4暂停,是因为前者允许Klipper在等待期间继续处理队列中的其他命令,避免阻塞主循环。
  • 若需暂停更长时间(如分钟级),可传入毫秒值,例如M400 P30000表示暂停30秒。