4. 条件判断与分支逻辑
任务目标
编写一个Klipper宏M500,读取当前喷嘴温度,根据温度区间自动选择不同的加热策略(低温快速预热、中温保温、高温直接进入待机),并通过条件分支控制风扇状态。
环境依赖
需要Klipper固件环境,宏文件放置在~/printer_data/config/目录下,通过[gcode_macro]配置节定义。无需额外安装依赖。
完整实现
[gcode_macro M500]
description: 根据喷嘴温度选择加热策略
gcode:
# 读取当前喷嘴实际温度
{% set nozzle_temp = printer.extruder.temperature %}
# 读取目标温度(若无设定则默认200)
{% set target_temp = printer.extruder.target if printer.extruder.target > 0 else 200 %}
# 分支逻辑:根据当前温度与目标温度的差值选择策略
{% if nozzle_temp < target_temp - 40 %}
# 策略A:低温快速预热,全速加热并开启风扇辅助散热
M104 S{target_temp}
M106 S255
RESPOND TYPE=command MSG="[M500] 低温状态,全速预热至 {target_temp}°C"
{% elif nozzle_temp < target_temp - 10 %}
# 策略B:中温保温,降低加热功率并关闭风扇
M104 S{target_temp}
M107
RESPOND TYPE=command MSG="[M500] 中温状态,保温加热至 {target_temp}°C"
{% else %}
# 策略C:已达或接近目标温度,进入待机恒温
M104 S{target_temp - 5}
M107
RESPOND TYPE=command MSG="[M500] 高温状态,待机恒温于 {target_temp - 5}°C"
{% endif %}
# 状态上报:显示当前温度与执行结果
RESPOND TYPE=command MSG="当前喷嘴温度: {nozzle_temp:.1f}°C | 目标温度: {target_temp}°C"
运行与调用方式
- 将上述配置追加到
printer.cfg文件末尾(或通过[include]引入独立宏文件)。 - 保存配置后,在Klipper终端执行
FIRMWARE_RESTART使配置生效。 - 在控制台或G代码发送窗口输入
M500即可调用。
验证方法与判定标准
- 配置加载验证:执行
FIRMWARE_RESTART后,Klipper日志无报错,且控制台输入M500能收到RESPOND消息回传。 - 低温分支验证:将喷嘴冷却至室温(如25°C),设定目标温度200°C后执行
M500,观察回传消息为“低温状态”,风扇转速变为255,喷嘴开始加热。 - 中温分支验证:当温度升至160°C附近时再次执行
M500,回传消息应为“中温状态”,风扇关闭,继续加热。 - 高温分支验证:当温度达到190°C以上时执行
M500,回传消息应为“高温状态”,目标温度被设为195°C(200-5),进入恒温待机。 - 判定通过条件:上述三个温度区间均能触发对应分支,且回传消息中的温度数值与
printer.extruder.temperature实时读数一致,即判定宏逻辑正确。
关键说明
宏中printer.extruder.temperature为Klipper实时读取的传感器值,printer.extruder.target为当前设定目标温度。条件判断使用Jinja2模板语法,M104设定加热目标,M106/M107控制风扇开关。若打印机有多个挤出机,需将extruder替换为实际名称(如extruder_stepper或自定义名称)。