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"
运行与验证
- 配置加载:保存
printer.cfg后,在Klipper终端执行FIRMWARE_RESTART或通过网页界面点击“重启固件”,使配置生效。 - 测试默认值:在控制台发送
M400,观察终端返回Pausing for 500 ms,约0.5秒后返回Pause complete。 - 测试自定义参数:发送
M400 P200,终端应返回Pausing for 200 ms,约0.2秒后返回Pause complete。 - 判定通过:若两条命令均按预期延时并输出对应消息,说明参数传递与默认值机制工作正常。
关键说明
params.P|default(500)是Jinja2过滤器语法,default仅在参数缺失时生效;若传入非数字值(如M400 Pabc),float转换会报错,属于预期行为。- 使用
UPDATE_DELAYED_GCODE而非G4暂停,是因为前者允许Klipper在等待期间继续处理队列中的其他命令,避免阻塞主循环。 - 若需暂停更长时间(如分钟级),可传入毫秒值,例如
M400 P30000表示暂停30秒。