开源改变世界

[问题] 如何通过socket.io向CNCJS发送命令,点后不丢行? #789

推推 grbl 3年前 (2023-02-03) 173次浏览
关闭
12 个任务中的第 5 个
frizensami 打开了这个问题 2022 年 11 月 4 日 · 3条评论
关闭
12 个任务中的第 5 个

[问题] 如何通过socket.io向CNCJS发送命令,点后不丢行?#789

frizensami 打开了这个问题 2022 年 11 月 4 日 · 3条评论

评论

[问题] 如何通过socket.io向CNCJS发送命令,点后不丢行? #789
弗里森萨米 评论了 2022 年 11 月 4 日  

描述

您好,感谢制作 CNCJS。它已成为我们仅用于运动控制(不涉及切割)的机器的默认界面,我目前正在为其编写更高级别的界面,以便技术水平较低的用户也可以使用我们的机器。

我目前正在使用Controller API通过 websockets 发送和接收数据(遵循 wiki)。具体来说,我不想提前加载 gcode 文件(因为我们在两行之间动态地执行一些操作),所以我使用command套接字事件,gcode命令字符串发送单行 gcode 在一个时间。这适用于小型测试,但我发现如果我们必须发送大量命令,例如,像这样:

    for (let i = 0; i < 50; i++) {
      const x = -((i * 25) % 400)
      const y = (i * 2) % 400
      // Our own controller that does socket.emit('command', 'gcode ...) 
      controller.sendGCode(`G0 X${x} Y${y}`)
    }

我向机器发送 50 行 GCode 以生成运动模式,问题是在某一行之后,GCode 的其余部分没有得到执行。我正在使用 GRBL 控制器,我在 CNCJS 中注意到规划器缓冲区和接收缓冲区都变为 0(所以我假设它们已满)。

我的问题是:这是因为当 GRBL 规划器/RX 缓冲区已满时,CNCJS 不会延迟发送 GCode 吗?我确定它在某个地方管理这个,因为它能够执行大型静态 GCode 文件、许多排队的键盘命令等,但这不适用于来自套接字的 gcode 命令吗?

非常感谢你提前。

版本

  • CNCjs:1.9.27
  • 节点.js:18.4.0
  • NPM:8.12.1

你如何安装CNCjs?

  • NPM
  • 下载 CNCjs 桌面应用程序

数控系统

  • Grbl
  • 冰沙
  • TinyG/g2核心

硬件

  • 树莓派
  • 台式机或笔记本电脑
  • 移动设备

操作系统

  • 不适用
  • 视窗
  • 苹果
  • Linux
[问题] 如何通过socket.io向CNCJS发送命令,点后不丢行? #789

您可能必须研究代码并进行一些调试才能回答该问题。我不知道我脑海中的答案。也许其他人会这样做,但我怀疑世界上只有极少数人详细看过那部分代码。您需要查看 src/server/controllers/Grbl/GrblController.js 和 src/server/lib/Feeder.js 。如果您触发的代码路径通过馈线,那么它可能会起作用。如果它绕过馈线,那么它可能会堵塞 Grbl 缓冲区。我想另一种可能性是 feeder.next() 没有被正确调用。该区域的控制流程异常复杂。

[问题] 如何通过socket.io向CNCJS发送命令,点后不丢行? #789

我还怀疑你处在几乎未知的领域。大多数人通过其主要接口使用 CNCjs,因此套接字接口可能没有经过压力测试。

[问题] 如何通过socket.io向CNCJS发送命令,点后不丢行? #789

谢谢您的帮助@MitchBradley. 我希望其他人不会遇到这种情况,因为正如您所提到的,动态发送多行 gcode 是一种不常见的用例。我看到其他 pendant 只是直接发送命令,因为它们只发送一些并且不太可能溢出 rx 缓冲区:

我通过以下方式管理了一个解决方法:

  • 按正常方式发送命令事件,但前提是我们在 rx 缓冲区中看到足够的空间(在控制器状态下)。
  • 等待新状态通过controller:state事件从 CNCJS 到达(这保证我们有一个准确的计划器当前状态值和下次发送命令时的 rx 缓冲区)
  • 然后从函数返回

再次感谢!