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"

运行与调用方式

  1. 将上述配置追加到printer.cfg文件末尾(或通过[include]引入独立宏文件)。
  2. 保存配置后,在Klipper终端执行FIRMWARE_RESTART使配置生效。
  3. 在控制台或G代码发送窗口输入M500即可调用。

验证方法与判定标准

  1. 配置加载验证:执行FIRMWARE_RESTART后,Klipper日志无报错,且控制台输入M500能收到RESPOND消息回传。
  2. 低温分支验证:将喷嘴冷却至室温(如25°C),设定目标温度200°C后执行M500,观察回传消息为“低温状态”,风扇转速变为255,喷嘴开始加热。
  3. 中温分支验证:当温度升至160°C附近时再次执行M500,回传消息应为“中温状态”,风扇关闭,继续加热。
  4. 高温分支验证:当温度达到190°C以上时执行M500,回传消息应为“高温状态”,目标温度被设为195°C(200-5),进入恒温待机。
  5. 判定通过条件:上述三个温度区间均能触发对应分支,且回传消息中的温度数值与printer.extruder.temperature实时读数一致,即判定宏逻辑正确。

关键说明

宏中printer.extruder.temperature为Klipper实时读取的传感器值,printer.extruder.target为当前设定目标温度。条件判断使用Jinja2模板语法,M104设定加热目标,M106/M107控制风扇开关。若打印机有多个挤出机,需将extruder替换为实际名称(如extruder_stepper或自定义名称)。