开源改变世界

点动取消 (0x85) 不起作用 [已解决] #837

推推 grbl 2年前 (2023-01-23) 210次浏览

打开
shaise 打开了这个问题 2020 年 3 月 23 日 · 11 条评论
打开

点动取消 (0x85) 不起作用 [已解决]#837

shaise 打开了这个问题 2020 年 3 月 23 日 · 11 条评论

注释

点动取消 (0x85) 不起作用 [已解决] #837
谢斯 评论了 2020 年 3 月 23 日  

你好,

我看到了 Issue #95线程并且我知道它已经关闭,但是这个问题仍然是一个问题(也发生在 Mega 版本中)
我想我有新的见解。它发生在一次点动取消时,没有发送进一步的点动命令。
这是发生了什么:当发送点动取消时,cnc 减速到停止然后再次开始走得比之前发送的单个点动段更远。
点动是通过连续发送 0.25mm 的运动来完成的,每次发送回“ok”。发送取消命令后,所有消息都将停止。
我已经对其进行了相当多的调查,这是我发现的:如果我在收到最后一个点动命令“ok”之前发送取消,它会触发问题。如果我等待确定,然后才发送取消,一切都很好。
看起来如果取消是在收到 ok 之前完成的,那么机器确实会停止并且所有活动缓冲区都被清除。然而,仍然有一个 pending planner command in the belly(可能在等待一个空缓冲区)执行并导致这个问题。
要重现该问题,请发送许多 0.25mm 的点动命令,直到没有返回 ok(缓冲区已满),然后立即发送取消。
我仍在研究 Grbl 代码,希望我能找到问题所在。

非常感谢这个伟大的项目!
晒。

点动取消 (0x85) 不起作用 [已解决] #837

这已经讨论过几次,旧的讨论很难理解,但听起来你自己找到了答案。开始发送点动命令后,需要完成发送并等待 OK 响应返回,然后才能安全地发送点动取消实时命令。否则可能会出现竞争条件,取消命令在收到后立即处理,然后不久之后 grbl 完成处理慢跑命令并再次开始慢跑。

点动取消 (0x85) 不起作用 [已解决] #837

我只记得还有一个慢跑怪癖需要注意。发送实时点动取消命令后,立即发送“G4P0”并等待它确定后再发送任何其他内容。我忘记了具体原因,但如果您不等待取消操作完成再发送新的移动命令,就会发生坏事。

点动取消 (0x85) 不起作用 [已解决] #837
作者

OK,我肯定是在motion_control.c,mc_line函数的代码中发现了bug:
缓冲区满时有一个忙等待函数:
do {
protocol_execute_realtime(); // 检查任何运行时命令
if (sys.abort) { return; } // 保释,如果系统中止。
如果 ( plan_check_full_buffer() ) { protocol_auto_cycle_start(); } // 当缓冲区满时自动循环开始。
否则{打破; }
} 而 (1);
一旦发送了取消命令,缓冲区就空闲了,mc_line 退出了这个忙等待并立即发出一个新行……
我会尝试修复它,但最好由所有者来完成。

点动取消 (0x85) 不起作用 [已解决] #837

@shaise:串行输入和块输入缓冲区都需要在点动取消时清除。可以在此处找到我为 Mega 版本修复它的尝试。

点动取消 (0x85) 不起作用 [已解决] #837
作者

@terjeio,

我已经解决了这个问题。清除串行输入和块缓冲区是不够的。代码只是等待所有缓冲区被清除,并立即发出挂起的命令——这个命令在代码中而不是在任何缓冲区中。这是跨线程同步问题。

点动取消 (0x85) 不起作用 [已解决] #837

我想出了如何在不使用 0x85 代码的情况下正确地慢跑:

  • 假设您希望点动进给率为 1000 毫米/分钟,您需要将其削减至 100 毫秒部分。
  • 每分钟 1000 是 1000/60 = 16.666 每秒
  • 100 毫秒是 1 秒/10
  • 16.666 / 10 = 1.666 每 100 毫秒(这是步进的值,它每 100 毫秒移动 1.666 毫米)。
  • 现在,当点动按钮仍被按住时,您每 100 毫秒发送一次这些步骤。
  • 当松开点动按钮时,移动将立即停止 cz 点动步长 (1.666) 和点动时间 (100ms) 与进给率值同步。
  • 100 毫秒的时间非常好,我不建议考虑更改它,但您可以使用进给率值并将公式应用于它。

代码中最终的公式为:
feedRate = 1000;
jogStep = feedRate / 600;
Serial.println(“$J = G91 G21 X” + jogStep + ” F” + feedRate);
延迟(100);

这在我的机器上就像一个魅力。

点动取消 (0x85) 不起作用 [已解决] #837

我忘了问:
你们如何从 grbl 读取“ok”状态?任何代码示例?

点动取消 (0x85) 不起作用 [已解决] #837
作者

对于任何有兴趣的人,这是我的解决方法
@abdset这是我最初的解决方案,确实已经足够好了。但我确实希望有一个选项可以取消任何动议。

点动取消 (0x85) 不起作用 [已解决] #837 shaise 更改了标题 点动取消 (0x85) 有时不起作用 点动取消 (0x85) somnot 工作 [已解决] 2020 年 3 月 23 日
点动取消 (0x85) 不起作用 [已解决] #837 shaise 更改了标题 点动取消 (0x85) somnot 工作 [已解决] 点动取消 (0x85) 不起作用 [已解决] 2020 年 3 月 23 日
点动取消 (0x85) 不起作用 [已解决] #837

对于任何有兴趣的人,这是我的解决方法
@abdset这是我最初的解决方案,确实已经足够好了。但我确实希望有一个选项可以取消任何动议。

谢谢你的主意。
机器的性能有所提高。但问题并没有完全解决。

点动取消 (0x85) 不起作用 [已解决] #837
特雷弗泰格 评论了 2021 年 3 月 29 日  

在我的 UGS 版本收到 OK 之前,我可以确认正在发送取消文件传输。
通用 Gcode 平台 20201202
在 Windows 10 上,64 位机器
Grbl 1.1h [‘$’ 寻求帮助]

这是发送的最后几个点动命令的两个示例

当我松开慢跑按钮时,这导致慢跑在停止后继续慢跑

ok
>>> $J=G21G91Y-8F4000
ok
>>> $J=G21G91Y-8F4000
**** Canceling file transfer. ****
ok 

这个正确停止的地方

ok
>>> $J=G21G91Y-8F4000
ok

**** Canceling file transfer. ****

因此,GRBL 似乎存在取消可能导致不可预测状态的问题。
此外,也许 UGS 应该在发送取消之前等待更长的时间以等待 OK。

超程通常仅在长距离和高进给率下按住点动按钮时才会发生。
但有时它可能会在短暂的慢跑中发生。

在长距离慢跑中,这个问题大约有五分之一发生。

是否有新版本的 GRBL 或 UGS 可以修复此问题?
当路由器停止但在我松开点动按钮后继续运行时,这非常令人不安。

点动取消 (0x85) 不起作用 [已解决] #837
abdset 评论了 2021 年 4 月 5 日  

我在发送 0x85 命令之前添加了 6 毫秒的延迟,它确实为我解决了问题,再也没有发生过,
你必须在释放操纵杆后放置延迟,这样它就不会循环。

如果欢乐不居中
发送点动命令
否则
发送延迟
发送 0x85

(我使用 ESP32 驱动操纵杆,通过板的串行连接器向 arduino uno 发送命令,这允许我使用操纵杆并通过蓝牙发送作业,grbl 1.1h 在 arduino 上,操纵杆和数据的自定义代码桥接 PC/Arduino 在 ESP32 上)。
机器 <–> arduino uno <–> ESP32 (Joy & BT/serial bridge) <–> PC

如果有人感兴趣,我附上我的 esp32 代码(IDE 是安装在 Visual Studio 代码上的 PlatformIO)
main.txt

PS:使用notepad++查看,如果你还没有安装任何IDE的话,在language选项卡上选择C。

PlatformIO 安装的有用链接:https ://www.youtube.com/watch?v=JmvMvIphMnY&ab_channel=DroneBotWorkshop

希望这可以帮助。

喜欢 (0)