开源改变世界

执行每一行G代码 #683

推推 grbl 3年前 (2023-01-22) 210次浏览

关闭
vangalvin 打开了这个问题 2015 年 5 月 7 日 · 4条评论
关闭

执行每一行G代码#683

vangalvin 打开了这个问题 2015 年 5 月 7 日 · 4条评论

注释

执行每一行G代码 #683

我的自定义 M 代码终于可以与 Y 上的距离触发器/计数器一起工作,正如我所希望的那样,单个按钮保持/开始操作完美然而!M 代码一发送到 GRBL 就会立即执行,而不是等待上一个命令完成。

要解决这个问题,我认为我需要检查 STATE_IDLE 是正确的吗?这是在执行并完成 G 代码的每一行之后设置的吗?

ISR 就这样结束了。
ISR(CONTROL_INT_vect) { 如果 (!(WDTCSR & (1<<WDIE))) { WDTCSR |= (1<<WDIE); } }
ISR(WDT_vect) // 看门狗定时器 ISR
{
WDTCSR &= ~(1<<WDIE); // 禁用看门狗定时器。
uint8_t pin = (CONTROL_PIN & CONTROL_MASK);
#ifndef INVERT_CONTROL_PIN
引脚 ^= CONTROL_MASK;
#endif
// 仅当检测到任何控制引脚处于活动状态时才输入。
if (pin) {
// 从第一次点击开始设置定时器溢出 : vangalvin
if (bit_istrue(pin,bit(RESET_BIT))) {
mc_reset();
// 单击一次应该开始循环 需要某种形式的去抖动
}
if (bit_istrue(pin,bit(CYCLE_START_BIT)) && SUSPEND_FLAG == 1 ) {
位真(sys.rt_exec_state,EXEC_FEED_HOLD);
暂停标记 = 0;
}
//另一个点击应该暂停循环需要某种形式的去抖动
否则如果(bit_istrue(pin,bit(CYCLE_START_BIT))&& SUSPEND_FLAG == 0){
bit_true(sys.rt_exec_state,EXEC_CYCLE_START);
暂停标记 = 1;
}
if (bit_istrue(pin,bit(Y_COUNT_BIT)) && (gc_block.modal.dst_count == Y_COUNT_ENABLED)) {
Y_COUNT++;
if(Y_COUNT == gc_state.distance_counter){
printPgmString(PSTR(” Y-DST”));
printFloat_RateValue(gc_state.distance_counter);
Y_COUNT=0;
gc_state.distance_counter = 0;
gc_block.modal.dst_count = Y_COUNT_DISABLE;
位真(sys.rt_exec_state,EXEC_CYCLE_START);
}
}
}
}

我还在 gcode.c案例 66中为自定义 M66 命令添加了这个:
word_bit = MODAL_GROUP_M66;
switch(int_value) {
// 获取 M66,暂停机器,将 y 计数归零并开始计数直到达到值
case 66: gc_block.modal.dst_count = Y_COUNT_ENABLED;
gc_state.distance_counter = gc_block.values.s;
// 需要让最后一个命令在停止前完成
bit_true(sys.rt_exec_state, EXEC_FEED_HOLD);
休息;
}

当我使用 S var 传递所需的点击以等待恢复之前我还添加了这个
if (gc_state.distance_counter != gc_block.values.s
)
}

执行每一行G代码 #683
贡献者

嗯…是否可以将 gcode 缓冲区设置为 1?(不确定它是否在
设置中)

这样每个命令都需要在下一个命令运行之前完成……
在 2015 年 7 月 5 日上午 10:44,“vangalvin” notifications@github.com写道:

我的自定义 M 代码终于可以与
Y 上的距离触发器/计数器一起工作,正如我所希望的那样,单个按钮保持/开始操作
完美然而!M 代码一发送到
GRBL 就会立即执行,而不是等待上一个命令完成。

要解决这个问题,我认为我需要检查
STATE_IDLE 是正确的吗?这是在执行并
完成 G 代码的每一行之后设置的吗?

ISR 就这样结束了。
ISR(CONTROL_INT_vect) { 如果 (!(WDTCSR & (1<<WDIE))) { WDTCSR |= (1<<WDIE);
} }
ISR(WDT_vect) // 看门狗定时器 ISR
{
WDTCSR &= ~(1<<WDIE); // 禁用看门狗定时器。
uint8_t pin = (CONTROL_PIN & CONTROL_MASK);
#ifndef INVERT_CONTROL_PIN
引脚 ^= CONTROL_MASK;
#endif
// 仅当检测到任何控制引脚处于活动状态时才输入。
if (pin) {
// 从第一次点击开始设置定时器溢出 : vangalvin

如果 (bit_istrue(pin,bit(RESET_BIT))) {
mc_reset();
// 一次点击应该开始循环需要某种形式 的 去
抖动 暂停标记 = 0; } //另一个点击应该暂停循环需要某种形式的去抖动 否则如果(bit_istrue(pin,bit(CYCLE_START_BIT))&& SUSPEND_FLAG == 0){ bit_true(sys.rt_exec_state,EXEC_CYCLE_START); 暂停标记 = 1; } if (bit_istrue(pin,bit(Y_COUNT_BIT)) && (gc_block.modal.dst_count == Y_COUNT_ENABLED)) { Y_COUNT++; if(Y_COUNT == gc_state.distance_counter){ printPgmString(PSTR(” Y-DST”));

printFloat_RateValue(gc_state.distance_counter);
Y_COUNT=0;
gc_state.distance_counter = 0;
gc_block.modal.dst_count = Y_COUNT_DISABLE;
位真(sys.rt_exec_state,EXEC_CYCLE_START);
}
}
}
}

我还在 gcode.c案例 66中为自定义 M66 命令添加了这个:
word_bit = MODAL_GROUP_M66;
switch(int_value) {
// 获取 M66,暂停机器,将 y 计数归零并开始计数
直到达到值
case 66: gc_block.modal.dst_count = Y_COUNT_ENABLED;
gc_state.distance_counter = gc_block.values.s;
// 需要让最后一个命令在停止前完成
bit_true(sys.rt_exec_state, EXEC_FEED_HOLD);
休息;
}

当我使用 S var 传递所需的点击以等待
恢复之前我还添加了这个
if (gc_state.distance_counter != gc_block.values.s
)
}


直接回复此电子邮件或在 GitHub
#683上查看。

执行每一行G代码 #683
作者

我会看一下,但看起来我可能在错误的地方工作,我所做的添加是为了实时执行,并且在 G 代码的正常执行期间监控这些内容。我怀疑我需要将它全部移动到非实时环境中。但是会尝试您的建议。我写的 Mach3 附加功能有一个功能,可以等到机器停止移动后再继续,所以这很容易,但似乎看不到这个 GRBL 中的任何东西可以使用相同的方式。

执行每一行G代码 #683

M 代码一发送到 GRBL 就会立即执行,而不是等待上一个命令完成。

在 gcode.c 中,大多数命令都被缓冲,并传递给规划器执行。如果要在前一个命令完成后才运行 gcode 命令,则需要等待缓冲区清空。首选模式似乎是protocol_buffer_synchronize()在执行操作之前调用。请参阅以供参考mc_probe_cyclecoolant_run

要解决这个问题,我认为我需要检查 STATE_IDLE 是正确的吗?这是在执行并完成 G 代码的每一行之后设置的吗?

STATE_IDLE当运动段缓冲区为空时设置。如果您流式传输多个运动命令,它不会在每个命令之间进入空闲状态。

执行每一行G代码 #683
作者

谢谢 ashelly,我昨天成功地完成了它,现在开始享受了。:) 我遇到的另一个问题是自定义 m 代码运行后它将执行下一个命令然后停止。添加 plan_cycle_reinitialize();对于 ISR 例程,计数器在为 Y 位置正确计数后终止,解决了这个问题。现在要自定义帖子并构建机器 :) 哦,我对 GRBL 的速度感到震惊,因为它坐在纳米上!2100 毫米/秒的进给速度还算不错

喜欢 (0)