Contact me: hankecnc@gmail.com

流式传输 G 代码时的其他命令 #1116

推推 grbl 3年前 (2023-01-23) 247次浏览

打开
Breman33 打开了这个问题 2016 年 10 月 21 日 · 6条评论
打开

流式传输 G 代码时的其他命令#1116

Breman33 打开了这个问题 2016 年 10 月 21 日 · 6条评论

注释

流式传输 G 代码时的其他命令 #1116
布雷曼33 评论了 2016 年 10 月 21 日  

大家好,

首先,我是新来的,我不会说一口流利的英语,所以如果您不明白我的问题的一部分,请随时告诉我。这个问题是 – IMO – 链接到 USB 连接,但我不能 100% 确定。问题是 GRBL 似乎冻结在“随机”位置(运动的开始或结束,从不在运动中)我会尽可能清楚地解释我的问题:

  1. 背景:我是一名工程师学徒,自 2015 年起负责一个 CNC 项目。所以我开发了一年基于 Processing(Java 环境)的 G 代码流应用程序。使用 GRBL 主页上描述的“ok”响应协议,它可以正常工作。这意味着在我们从 GRBL 收到“ok”之前不会发送新命令。

布线:我们在一台 Windows 7 PC 上有处理应用程序,一个 Arduino MEGA(包含 GRBL)和一个 Arduino UNO(命令 3 个分别命令的电机,以快速恢复:

  • “Blade Rise/Descent”(当执行 G0 时上升,当其他命令时下降)
  • “切割头旋转”(跟随切割路线)
  • “Blade On”(为了在 G1/G2/G3 命令时切割)
  1. 当前行为当我只等待 GRBL 的“确定”时,流式应用程序已在 15 日完成 15 次尝试。但是,当我在等待一个新角度(由 Arduino Uno 的 Processing 应用程序接收)时取消注释该部分时,它似乎导致随机冻结(在 15 次尝试中,只有 6 或 7 次完成)。我准备给你所有你需要的代码来帮助我,当然,不要犹豫。我真的希望这个项目能成功。

  2. 问题可能的原因是我在 Google 上搜索了太多次,以至于我目前被屏蔽了。我只是想知道一些事情,比如:

  • GRBL 似乎在我发送新命令后就冻结了。“ok”永远不会出现,无论是 G0、G1、G2 还是 G3。完全随机…我知道电磁干扰、电噪声等…
    但我真的不认为问题来自于此,因为当我添加旋转功能时行为发生了变化。
  • 如何在文件流传输期间“干净地”读取 GRBL 位置反馈?是否存在任何通信冲突?事实上,添加反馈读数会导致随机冻结……
  • 我注意到,如果我用 delay() 或空 while{} 替换“等待 UNO 的新角度”以进行临时化,这也会导致冻结。
  • 在 GRBL 中发送的 2 个命令之间是否有等待时间?更一般地说,两个 USB 操作(读取或写入)之间是否存在延迟?

要恢复,只要我需要在继续流式传输之前等待某些东西,应用程序或 GRBL 就会冻结。我不确定真正的原因……

我真的需要为我的流媒体程序添加功能,否则 GRBL 解决方案对我们来说可能没有好处……这意味着我这一年的工作没有用:(

请帮我!提前感谢任何可以给我一些想法的人。
最好的祝福

流式传输 G 代码时的其他命令 #1116

是否有可能因为不等待“确定”响应而导致 GRBL 中的接收缓冲区溢出?
溢出此缓冲区可能会导致 sw 崩溃。
解释了几种防止溢出的机制,其中之一是在发送新命令之前等待“ok”。但是,如果您不等待“确定”,您应该应用另一种策略来管理接收缓冲区。

流式传输 G 代码时的其他命令 #1116
作者
布雷曼33 评论了 2016 年 10 月 21 日  

我明白,但在发送另一个命令之前我已经在使用“等待确定”协议。可能我没说清楚,抱歉。

在流式传输期间,我可以在处理控制台上看到(感谢我放在代码上的一些 println() )在每个命令之后收到响应“ok”,直到阻塞命令(随机)。这就是为什么我找不到原因的原因,我认为我正在正确地等待“确定”…

当我在旋转计算(旋转方向、步数、旋转频率)和命令发送之间添加延迟时,就会发生冻结问题。

但是你对 GRBL 中的接收缓冲区是正确的。我认为它在某些“随机”时间不会自行清除……但目前无法检测到原因……

我知道我的解释并不完美,所以我会尝试为您开发我的 Processing streaming 的算法:

WHILE (line < file.length)
..{
detectCommand(); // 确定命令是运动 (G0 G1 G2 G3) 还是不是
IF (G0 || G1 || G2 ||G3)
…..{
SavePoints(); // 当前点、目标点和最终中心点被保存
computeAngle(); // 执行转换旋转的计算
IF (G0 || G1) // 在这种情况下只需要发送转换旋转
……{
send1stRotationSteps(); // 将过渡旋转参数发送到 Arduino UNO
waitForAngle(); // 等待来自 ARduino UNO
sendGCommand() 的角度响应;// 发送 G0/G1 命令给 Arudino MEGA (GRBL)
waitForOK(); // 等待来自 GRBL 的 ‘ok’ 响应

……….}
ELSEIF (G2 || G3) // 需要发送 2 个旋转:过渡和圆弧运动期间
……{
send1stRotationSteps();
等待角();// 等待来自 ARduino UNO
sendGCommand() 的角度响应;// 将 G2/G3 命令发送到包含 GRBL 的 Arduino MEGA
send2stRotationSteps(); // 发送旋转使叶片方向跟随圆弧
waitForOK(); // 等待来自 GRBL
waitForAngle() 的 ‘ok’ 响应;// 等待来自 Uno 的第二个角度响应
…….}
…..}
ELSE // 如果命令不是动作
…..{
sendGCommand();
等待确定();
…..}
行++
..}

这是非常恢复的我的流式算法。我很确定我在 USB 通信上做了坏事,但我看不到在哪里。

流式传输 G 代码时的其他命令 #1116 Breman33 更改了标题 流式传输 G 代码时的其他命令 流式传输 G 代码时的其他命令 2016 年 10 月 21 日
流式传输 G 代码时的其他命令 #1116
109JB 评论了 2016 年 10 月 21 日  

您使用的是带有 CH340g USB 转串口转换器芯片的进口 Arduinos 吗?

这听起来好像与我发现的一个错误有关,该错误发生在使用 CH340g 芯片的克隆 Arduino 板上。发生的情况是,芯片偶尔会截断一些发送到 GRBL 的数据。被截断的数据通常是从一行中间的某个地方到下一行的中间。这会导致 GRBL 无法获取行尾字符,并可能导致 GRBL 发回错误。

您的流代码是否有响应 GRBL 生成的错误以停止运动的规定?

您可以在 wiki 的“已知错误”页面上阅读有关此错误的更多信息,链接如下:

https://github.com/grbl/grbl/wiki/Known-Bugs

流式传输 G 代码时的其他命令 #1116
成员

@Breman33:尝试启用 ECHO config.h 选项。这将导致 Grbl 在执行之前立即发回预解析的命令(大写且无空格/注释)。如果它不正确,那么你就有了沟通问题。如果它看起来正确,则可能是 Grbl 问题或 USB 串行问题,例如@109JB提及。

流式传输 G 代码时的其他命令 #1116
作者

非常感谢您的回答,我今天会试试这个。

流式传输 G 代码时的其他命令 #1116
作者

好的好消息!

因为我没有成功将我的 GRBL 程序刷新到我的 Mega 板上(因为库冲突),我决定重新安装所有东西:Arduino IDE + GRBL 并删除我电脑上所有以前的 GRBL 版本。之后我尝试安装最新版本的 GRBL (0.9j) 但它在 UNO 上有效但在我的 MEGA 上无效!

所以最后我找到了仅适用于 Mega 的 0.9f 版本,并且由于该更改我的 G 代码文件已完全流式传输成功!
通常它会在最多 2 或 3 次尝试后崩溃。我刚刚成功进行了 6 次尝试,没有任何错误,所以我有信心,如果问题再次出现,我会回到这里。我真的很想感谢你的回复,即使你没有直接找到原因,但它帮助我在那个错误面前保持冷静!

喜欢 (0)