Marlin中IF&GOTO指令使用问题:按钮触发宏无法执行
Marlin 宏顺序跳转实现方案
问题根源
你之前的IF&GOTO写法无效,是因为Marlin的GOTO命令仅能在当前宏文件内跳转标签,无法直接跨宏(比如从M817跳转到M811的代码块)执行动作。所谓"选中宏却不执行",本质是跨宏跳转的逻辑不被Marlin解释器支持。
正确实现思路:用全局变量记录状态
通过Marlin的全局变量记录当前选中的位置,在前进/后退宏中根据变量值调用对应的位置宏(M810-M816),是最简洁且符合Marlin规则的方案。
步骤1:启用全局变量支持
在Marlin的Configuration_adv.h中开启以下配置:
#define ENABLE_GCODE_MACROS #define GCODE_MACROS_SLOTS 10 // 至少大于你的宏数量 #define ENABLE_GCODE_VARIABLES
编译并刷入固件后,即可使用全局变量功能。
步骤2:初始化状态变量
创建初始化宏(比如M819),用于设置初始位置状态:
; M819 - 初始化位置状态变量 ; VAR=1 为全局变量编号,VALUE=0 对应第一个位置M810(0-6对应M810-M816) SET_GCODE_VAR MACRO=0 VAR=1 VALUE=0
可以将此宏加入开机启动脚本,确保每次开机都初始化状态。
步骤3:编写前进宏(M817)
实现按顺序跳转到下一个位置,超出最后一个则循环到第一个:
; M817 - 顺序前进到下一个位置 ; 递增当前位置变量 SET_GCODE_VAR MACRO=0 VAR=1 VALUE={GET_GCODE_VAR(MACRO=0, VAR=1) + 1} ; 超出最大位置(6对应M816)则重置为0 IF {GET_GCODE_VAR(MACRO=0, VAR=1)} > 6 SET_GCODE_VAR MACRO=0 VAR=1 VALUE=0 ; 根据变量值调用对应位置宏 IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 0 M810 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 1 M811 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 2 M812 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 3 M813 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 4 M814 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 5 M815 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 6 M816
步骤4:编写后退宏(M818)
实现按顺序跳转到上一个位置,超出第一个则循环到最后一个:
; M818 - 顺序后退到上一个位置 ; 递减当前位置变量 SET_GCODE_VAR MACRO=0 VAR=1 VALUE={GET_GCODE_VAR(MACRO=0, VAR=1) - 1} ; 小于最小位置(0对应M810)则重置为6 IF {GET_GCODE_VAR(MACRO=0, VAR=1)} < 0 SET_GCODE_VAR MACRO=0 VAR=1 VALUE=6 ; 根据变量值调用对应位置宏 IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 0 M810 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 1 M811 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 2 M812 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 3 M813 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 4 M814 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 5 M815 ELSE IF {GET_GCODE_VAR(MACRO=0, VAR=1)} == 6 M816
替代方案:单宏内标签跳转(不推荐)
如果不想用全局变量,可以把所有位置的G代码整合到一个宏里,用GOTO跳转到内部标签,但这种方式会让代码冗余,维护性差,示例如下:
; M817 - 单宏内顺序前进 ; 需提前在宏内定义每个位置的标签 GOTO_POS{GET_GCODE_VAR(MACRO=0, VAR=1)} :POS0 ; 复制M810的代码内容 G1 X0 Y0 F6000 SET_GCODE_VAR MACRO=0 VAR=1 VALUE=1 M99 :POS1 ; 复制M811的代码内容 G1 X10 Y10 F6000 SET_GCODE_VAR MACRO=0 VAR=1 VALUE=2 M99 ; ...以此类推添加POS2-POS6
内容的提问来源于stack exchange,提问作者DanWil347
相关产品推荐
相关产品推荐

