注释
写得很好,还有很多值得考虑的地方。我只是想谈谈行号:我认为通过计算输入来进行航位推算行号很难使用,因为客户端通常可能会预处理文件甚至从输入中删除行。就我个人而言,我更希望我们使用 g 代码中的行编号标准,并将行号报告作为一个可选功能,您可以通过实际对行编号来“打开”。想要在其界面中显示当前行的预处理客户端会在将其流式传输到 grbl 时标记每一行。 当谈到报告时,也许而不是投票,?可以打开定期报告(例如每秒)和!会把它关掉。在典型的流媒体设置中,上行链路将是纯 gcode 和下游纯状态。只是一个想法。 |
我的总结也很棒。 许多选择可能非常个人化,取决于环境和手头的任务。所以真正的问题是:我们可以提供多少灵活性与臃肿的代码(例如’?’打开定期报告,’!’关闭它,’#’给出一次性报告等);以及我们如何为那些仍然觉得需要不同东西的人提供可修改性。 此外,很多这些问题都与界面设计密切相关。我建议采用爬行-行走-运行方法,即从可以与简单的流式脚本或终端一起使用的内容开始,然后查看可以根据 GUI 的需要添加哪些内容(例如,用于更快更新周期的二进制数据格式)。让我们看看有多少 ftoa() 可以挤进空闲时间:-) 但是要考虑一件事:当仍在处理命令时触发报告时,状态报告如何与解析器状态混合? 关于行号,我完全同意 Simen 的观点:它们应该来自 g 代码“N”命令。(如果未定义,它们可以默认为零)。 现在就这么多。 |
我考虑过其中的许多问题,以下是我目前为 TinyG 实施的(以及正在实施的)内容。这仍在发展中,我也很乐意随着这些事情的敲定而进行调整。我也很乐意贡献人们可能想要的任何代码。
让我知道你的想法。 奥尔登 |
Simen: 您对投票的评论引出了另一个问题。为了使 feed hold、resume 和 abort 功能起作用,需要有一个接口允许这些命令中断 grbl 的主程序以立即执行。对于基于软件/USB 的设置,这意味着向 grbl 发送命令的唯一方法是通过串行 rx/tx 接口,搭载在 g 代码流上。为此,外部接口必须能够将这些特殊字符注入流中,以便串行读取函数将它们摘除以设置运行时执行标志。在这里添加状态报告主要是因为它很容易做到。 因此,如果我们决定包括 XON/XOFF 流控制,我们如何在不需要专门的流接口的情况下仍然通过它发送这些运行时命令?一个答案是:不要发送它们并将此功能移动到备用 I/O 引脚上的物理按钮。但是以拥有软件界面为代价。这个流媒体问题可能有一个很好的解决方案。我只是还没有想到一个。 至于定期报告,我们有可用的计时器来处理吗?据我所知,步进模块使用了 Timer1 和 Timer2,我读到 Timer0 通常是一个请勿触摸定时器。如果有计时器可用,我同意这是发送报告的最佳方式。另外,正如奥尔登在他的代码中所说,允许基于计时器和临时报告是否有意义? Jens: 由于自定义和对膨胀的恐惧,我认为在设置中使用切换方案应该有助于防止膨胀。这也将为用户提供一个清晰的蓝图来修改report.c源文件以满足他们的需要。但是,我想我还是得起草一份,看看它到底是什么样子。 Alden: 至于 TinyG 的实现,我们似乎就需要那里的东西达成了一般协议。用户只需修改report.c源文件即可集成 JSON 格式。我宁愿让内容易于阅读和简短,主要是为了不让新用户感到困惑。在我看来,如果我们确实制作了一个report.c源文件,人们就可以编写和分发他们自己的文件以供用户或分支编译。希望即插即用。 |
行号上的一个更好的点 – 如果存在 N,我更喜欢使用它们。如果 N 不存在,我只计算行数。 计时器:328 没有 RTC 吗?我就是这么用的。 需要其他报告是为什么我没有将状态报告直接附加到 ?,而是使用 ?sr。它通过正常的命令行界面进入,而不是 ! 使用的“信号”陷阱。(进给)和 ~(循环开始)和 ^x(中止) 我同意 JSON。对于一些想要直接使用字典/哈希图的控制台编写器,这是我正在做的一件特别的事情。我想我已经设法将它集成进去,所以它是“无模式的”——如果你发送以 curly 开头的行,它就会开始,而当你发送以 $ 开头的行时,它就会停止。我喜欢单独报告的想法。c |
我一直在研究一个用 Processing 编写的 GUI 来控制我的 CNC。困难在于,当按下按钮时,比如说“+x”,要沿 X 轴正向点动 CNC,GRBL 会以串行“Ok”消息进行响应,但它会立即响应,而不是在操作完成。要清楚我正在运行 GRBL 0.7d,我不确定这种行为在“边缘”分支中是否不同。所以理想情况下,我希望能够“轮询”GRBL 以了解操作是否完成或 GRBL 发送类似“完成”的内容。听起来这可能与 wiki 所说的路线图上的计划状态报告功能有关。我试图避免的行为是反复按下慢跑按钮不会继续发送额外的移动 gcode 行,直到上一行被执行。我将尝试将处理程序上传到我的 GRBL 分支,仍在寻找 github 和 git。代码是非常 alpha 的,虽然功能,但我不是专业的程序员,所以它可能有点 hack,欢迎反馈。 |
“ok”消息表示 g 代码行已正确解析。这也是该行在缓冲区中占用的空间再次空闲的指示器。在这个函数中,“ok”消息已经被程序使用,比如 一种指示 g 代码行何时开始运行的方法可以通过使用 g 代码行号报告来实现(我将很快提供代码)。但是,如果您的行是要运行的唯一和最后一行,它仍然不会为您提供“g 代码行已完成”报告。最后一个 g 代码命令的完成可以从命令缓冲区中的块数中读取。当它变为零时,您的命令已完成运行。 我现在在我的https://github.com/jgeisler0303/grblUI中的做法是比较 3 个连续的位置报告(以 100 毫秒轮询)。如果没有变化,则表示移动已停止并且命令已完成。 |
一个简单的“完成”对我有用(见第 12 期),因为我需要知道动作已经停止。当命令缓冲区为空时,我添加了一个“完成”打印语句。我还在规划器中添加了一个“完成”,因为有时运动会被优化掉。我使用的是74576a8,但它可能可以添加到较新的分支中。 |
在 TinyG 中,我添加了一个合成状态变量,如下所示: enum cmCombinedState { COMBINED_RESET = 0 , // 状态是您可以请求在状态报告中报告的参数之一(标记为“stat”)。因此,当系统运行时,状态报告中会返回值“Run”。在最后的状态报告中,返回值“Stop”,假设没有更多的块排队等待运行。注意:即使“Cycle”在那里,它也不会暴露给界面。 -奥尔登 |
谁能帮我获得“完成”状态?我用 python 为我的机器人编写了一个小程序,知道我们已经到达最终目的地的唯一方法是在初始化新 gcode 后检查 MPos 的变化。我确信在特殊模式下有可能得到像“完成”或“缓冲区清除”这样的回复。例如“*G00 x100”可以在这段代码执行完成后给出回复。“G00 x200”照常只能给出“ok”回复。谢谢你的帮助。 |
您好, void TestEdle(){ 欢迎评论, |
状态报告是 grbl/edge v0.8a 分支中的一项新功能。我想开始讨论状态报告应该是什么样子,应该包括什么,它是如何工作的,并回答一些其他问题,比如它在未来的灵活性或想要破解它的用户。以下是我一直在思考的一些事情:
Grbl:Running,Ln:203,Buf:15,Rate:300.0,MPos:[0.00,10.02,4.34],WPos:[-10.00,2.22,5.00]
Grbl:
列出当前的[Running, Hold, Idle]状态Ln:
进程中的行号。缓冲区清空时重置为零。Buf:
规划器缓冲区中剩余的块数Rate:
实时进给率MPos:[x,y,z]
以毫米/英寸/步为单位的实时机器位置(或者可能是坐标偏移量?)WPos:[x,y,z]
以毫米/英寸/步为单位的实时工作位置Grbl:Running,Rate:300.0,WPos:[-10.00,2.22,5.00]
无论如何,我认为这些功能中的大部分应该通过设计集成到grbl中,但不一定非要实现。换句话说,用户应该非常简单地“打开”这些功能或他们可能需要的任何功能,而不必大惊小怪。大多数陈述的报告数据已经存储在全局结构“sys”中,其他的可以简单地移动到这个结构中。
Simen、Alden、Jens 或其他任何人……您对此有何看法?