You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:05:15