开源改变世界

状态报告的形式和功能。 #48

推推 grbl 2年前 (2023-01-21) 266次浏览

关闭
chamnit 打开了这个问题 2012 年 1 月 23 日 · 11 条评论
关闭

状态报告的形式和功能。#48

chamnit 打开了这个问题 2012 年 1 月 23 日 · 11 条评论

注释

状态报告的形式和功能。 #48
成员

状态报告是 grbl/edge v0.8a 分支中的一项新功能。我想开始讨论状态报告应该是什么样子,应该包括什么,它是如何工作的,并回答一些其他问题,比如它在未来的灵活性或想要破解它的用户。以下是我一直在思考的一些事情:

  1. 为了可移植性和可破解性,我正在考虑重新组织状态报告功能并将其放入它自己的report.c源文件中,而不是将其当前位置作为protocol.c中的一个函数。这里应该清楚这个源文件是什么,它的功能是什么,以及用户可以根据自己的恶意需求自由破解它的地方。报告所需的数据可能也需要重新组织一下,这样用户就可以直接访问他们需要的一切。
  2. 也许最大的问题是用户在状态报告中需要什么?这是 CNC 铣床和车床最低限度要求/需要的东西列表,但其他机器/机器人不一定需要其中一些功能。为了与 grbl 的精神保持一致,为了保持简单性,需要什么,什么不需要?此处列出的所有内容都是无法通过接口在机外完成的项目。
  • 当前 XYZ 位置 – 这是工作坐标系 (G92) 或零件零中的实时位置。这是用户需要的最重要信息,可以以毫米、英寸或步长为单位提供。
  • 机器 XYZ 位置/坐标偏移量 – 这不同于工作位置,因为它是绝对实时位置/相对于机器起始位置的偏移量。这需要保留,以便 grbl 知道家在哪里,并且可以用于在不使用物理限位开关的情况下建立机器的绝对行程限制。实时需要此信息的情况并不多,但可能非常有用。
  • 缓冲区状态/大小 – 规划器缓冲区状态或存储了多少块并准备好进入缓冲区。这是一个很好的指标,表明 grbl 在重负载下的表现或显示 grbl 是否存在缓冲区不足问题。同样,并非所有用户都需要,但非常方便且相对容易实施。
  • 进给率(和主轴速度)- 实时进给率可用于通过复杂曲线和加速度曲线监控进给率。这将基于步进模块中的 trapezoid_adjusted_rate 值。
  • 进程中的行号 – 问题是什么定义了行号。它是 g 代码“N”行命令(不需要或不一致)还是仅基于传入行的内部计数?后者会更简单、更准确。正在处理的行号将帮助用户直接关联问题在 g 代码程序中的位置,并计算离开板的距离。可能相当容易实现,但需要一些内存来跟踪这些。
  • 状态 – 报告步进模块状态,即循环开始、进给保持和可能的进给速率覆盖(集成时)。
  1. 下一个问题是状态报告应该是什么样的?一般来说,状态报告应保持在相对最小值以减少每个状态报告的周期数,特别是对于需要每秒报告 10-20 次的设置。它应该是直接的和人类可读的。还需要考虑的是,可以包含一种非人类可读的二进制格式,以将周期预算保持在绝对最低限度,但需要与外部接口一起使用来解释二进制数据。对二进制格式的需求可能存在争议,但这里有一个人类可读格式的想法。
    • 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]以毫米/英寸/步为单位的实时工作位置
    • 此外,如果需要,可以定制报告,报告中的某些项目可以通过一些 EEPROM 设置或位掩码打开或关闭。例如,如果不需要行号、缓冲区状态和机器位置,用户可以将 EEPROM 设置设置为显示:Grbl:Running,Rate:300.0,WPos:[-10.00,2.22,5.00]
  2. 最后一个关键问题是它应该如何工作?首先,当前的实现允许在如何执行此操作方面具有一定的灵活性。所有需要做的就是在系统字节中设置一个位掩码来打印报告。这可以通过多种方式完成,通过当前的“?” 字符、内部定时器,甚至是 I/O 引脚上的一些外部信号。
    • 现在,什么时候?字符被发送到串行接收缓冲区,运行时执行例程将几乎立即回复状态报告,而不管 grbl 正在做什么。对于接口,这意味着它需要发送“?” 字符以某种周期性速率。(’?’ 可以更改为任何特殊字符,如控制字符或扩展 ascii。)这样就够了吗?
    • 我可以看到当前实现的主要问题是它如何使 grbl 流接口复杂化。如果用户正在流式传输文件,他们的界面将需要发送“?” 每当他们需要报告时,都会发出命令,然后在串行缓冲区中读取和处理报告。在某些时候,我想将 XON/XOFF 流控制安装到串行模块中,以减少流式 g 代码的麻烦。改进/改变 grbl 流的方式是另一回事,状态报告的工作方式应该是一个考虑因素。

无论如何,我认为这些功能中的大部分应该通过设计集成到grbl中,但不一定非要实现。换句话说,用户应该非常简单地“打开”这些功能或他们可能需要的任何功能,而不必大惊小怪。大多数陈述的报告数据已经存储在全局结构“sys”中,其他的可以简单地移动到这个结构中。

Simen、Alden、Jens 或其他任何人……您对此有何看法?

状态报告的形式和功能。 #48
成员

写得很好,还有很多值得考虑的地方。我只是想谈谈行号:我认为通过计算输入来进行航位推算行号很难使用,因为客户端通常可能会预处理文件甚至从输入中删除行。就我个人而言,我更希望我们使用 g 代码中的行编号标准,并将行号报告作为一个可选功能,您可以通过实际对行编号来“打开”。想要在其界面中显示当前行的预处理客户端会在将其流式传输到 grbl 时标记每一行。

当谈到报告时,也许而不是投票,?可以打开定期报告(例如每秒)和!会把它关掉。在典型的流媒体设置中,上行链路将是纯 gcode 和下游纯状态。只是一个想法。

状态报告的形式和功能。 #48
贡献者

我的总结也很棒。

许多选择可能非常个人化,取决于环境和手头的任务。所以真正的问题是:我们可以提供多少灵活性与臃肿的代码(例如’?’打开定期报告,’!’关闭它,’#’给出一次性报告等);以及我们如何为那些仍然觉得需要不同东西的人提供可修改性。

此外,很多这些问题都与界面设计密切相关。我建议采用爬行-行走-运行方法,即从可以与简单的流式脚本或终端一起使用的内容开始,然后查看可以根据 GUI 的需要添加哪些内容(例如,用于更快更新周期的二进制数据格式)。让我们看看有多少 ftoa() 可以挤进空闲时间:-)

但是要考虑一件事:当仍在处理命令时触发报告时,状态报告如何与解析器状态混合?

关于行号,我完全同意 Simen 的观点:它们应该来自 g 代码“N”命令。(如果未定义,它们可以默认为零)。

现在就这么多。

状态报告的形式和功能。 #48

我考虑过其中的许多问题,以下是我目前为 TinyG 实施的(以及正在实施的)内容。这仍在发展中,我也很乐意随着这些事情的敲定而进行调整。我也很乐意贡献人们可能想要的任何代码。

  1. 报告.c. 好主意。
  2. 报告什么?所有可报告的项目都是可选择的,因为要求所有这些项目是一场大洪水。项目是:
    • xyz 和 abc 工作位置。这些由标记 xwp、ywp、… 标识,也许还应添加机器位置:xmp、ymp…变量,因为它更容易解析。所以我改变了它。但他们做的是 JSON,而不是命令行,我认为数组更容易阅读。它还可以方便地在访问器代码中保持平坦。
    • 行号 (ln)。如果存在 N 个单词,它会将它们报告为行号。如果不是,它会报告计数的行数。这需要大约 4 个字节的 RAM(双),并且提取 N 字很自然地从 grbl 解析器中消失。计数对于识别问题仍然很有用,因为您可以在大多数文本编辑器中通过行计数器找到正确的行。预处理 G 代码?也许不会。
    • 机器状态(毫秒)。状态是重置、运行、停止、馈电。这对于在 gcode 实际完成时发布流媒体程序非常有用。
    • 进给率。是的。我将其作为速度 (vel),因为它是为进给和横移传送的,从技术上讲,横移没有进给率。语义。
    • 运动模式和 gcode 块。我正在考虑添加这个。这将允许来自控制台程序的 EZ 读数和彩色绘图(提要是一种颜色,遍历另一种颜色)。
    • 由于一切都是可配置的,您可能还需要选择包括:
      **固件版本
      **gcode单位模式(G20,G21)
      **绝对模式(G90,G91)
      **平面选择(G17,G18,G19)
      **偏移量( IJK)
      … 以及一大堆其他参数,多得无法一一列举。我把它作为命令行模式和 JSON 工作,所以在任何一种模式下,您都可以查询变量 (get) 并获取返回值(即具有空值的名称)。因此,状态报告本身可能不需要非实时变量。(更多关于不断发展的 JSON 规范可以在下面找到。欢迎评论。)http://www.synthetos.com/wiki/index.php?title=Projects:TinyG-JSON
  3. 我喜欢它的样子。基本上它是没有卷曲和引号的 JSON。为了定制报告,我一直在尝试使用“真”值(对于 SET 语义)在报告中发送您想要的标记。系统会记住这一点并根据规范返回报告。
  4. 它应该如何工作?以下是 TinyG 实现的方法:
    • 即席查询。有一个“status_report”对象(友好名称“status_report”,标记“sr”)。如果您请求 sr,您将获得指定的状态报告。我一直在将其实现为 ?sr 和 {“sr”:null} (友好名称形式也有效: ?status_report 和 {“status_report”:null} )
    • 状态间隔(si)。如果将 si 标记设置为非零,则在机器移动时每 N 毫秒会收到一份报告。你总是在旅行结束时得到一个。最小毫秒值约为 100 毫秒,也可能有最大值。如果您不希望出现这种行为,只需将 si 设置为零即可。
    • 另外还有上面(2)中提到的SET方法。

让我知道你的想法。

奥尔登

状态报告的形式和功能。 #48
成员作者

Simen:
两点都很好。g 代码行编号对于报告来说是最直接和最容易理解的。但是由于 g 代码行编号在用户与用户之间以及 CAM 与 CAM 软件之间并不完全一致,因此需要另一种方法来了解哪个块正在处理中。正如奥尔登所说,他同时使用了两者,但我认为将两者混合使用会造成一些混乱。很难说要做什么。关于如何跟踪进程中的块还有其他想法吗?

您对投票的评论引出了另一个问题。为了使 feed hold、resume 和 abort 功能起作用,需要有一个接口允许这些命令中断 grbl 的主程序以立即执行。对于基于软件/USB 的设置,这意味着向 grbl 发送命令的唯一方法是通过串行 rx/tx 接口,搭载在 g 代码流上。为此,外部接口必须能够将这些特殊字符注入流中,以便串行读取函数将它们摘除以设置运行时执行标志。在这里添加状态报告主要是因为它很容易做到。

因此,如果我们决定包括 XON/XOFF 流控制,我们如何在不需要专门的流接口的情况下仍然通过它发送这些运行时命令?一个答案是:不要发送它们并将此功能移动到备用 I/O 引脚上的物理按钮。但是以拥有软件界面为代价。这个流媒体问题可能有一个很好的解决方案。我只是还没有想到一个。

至于定期报告,我们有可用的计时器来处理吗?据我所知,步进模块使用了 Timer1 和 Timer2,我读到 Timer0 通常是一个请勿触摸定时器。如果有计时器可用,我同意这是发送报告的最佳方式。另外,正如奥尔登在他的代码中所说,允许基于计时器和临时报告是否有意义?

Jens:
g 代码解析器应该独立于实时状态报告,因为它们正在报告步进器正在做什么和执行什么。截至目前,还没有一种方法可以防止触发报告时步进模块覆盖变量,但是当发生覆盖时,这种情况很少见,而且似乎不会引起很多问题。您只需确保变量仅由步进模块写入,以防止同时写入两次。

由于自定义和对膨胀的恐惧,我认为在设置中使用切换方案应该有助于防止膨胀。这也将为用户提供一个清晰的蓝图来修改report.c源文件以满足他们的需要。但是,我想我还是得起草一份,看看它到底是什么样子。

Alden:
G 代码模式很好。这是可能需要报告的整个其他报告领域,但速度可能要慢得多。这可能是一个单独的报告方案……也许称之为“模态报告”或类似的东西。它可能需要临时发送,并且不超过每秒左右的速度,而不是像步进位置那样的 10-20Hz。

至于 TinyG 的实现,我们似乎就需要那里的东西达成了一般协议。用户只需修改report.c源文件即可集成 JSON 格式。我宁愿让内容易于阅读和简短,主要是为了不让新用户感到困惑。在我看来,如果我们确实制作了一个report.c源文件,人们就可以编写和分发他们自己的文件以供用户或分支编译。希望即插即用。

状态报告的形式和功能。 #48

行号上的一个更好的点 – 如果存在 N,我更喜欢使用它们。如果 N 不存在,我只计算行数。

计时器:328 没有 RTC 吗?我就是这么用的。

需要其他报告是为什么我没有将状态报告直接附加到 ?,而是使用 ?sr。它通过正常的命令行界面进入,而不是 ! 使用的“信号”陷阱。(进给)和 ~(循环开始)和 ^x(中止)

我同意 JSON。对于一些想要直接使用字典/哈希图的控制台编写器,这是我正在做的一件特别的事情。我想我已经设法将它集成进去,所以它是“无模式的”——如果你发送以 curly 开头的行,它就会开始,而当你发送以 $ 开头的行时,它就会停止。我喜欢单独报告的想法。c

状态报告的形式和功能。 #48

我一直在研究一个用 Processing 编写的 GUI 来控制我的 CNC。困难在于,当按下按钮时,比如说“+x”,要沿 X 轴正向点动 CNC,GRBL 会以串行“Ok”消息进行响应,但它会立即响应,而不是在操作完成。要清楚我正在运行 GRBL 0.7d,我不确定这种行为在“边缘”分支中是否不同。所以理想情况下,我希望能够“轮询”GRBL 以了解操作是否完成或 GRBL 发送类似“完成”的内容。听起来这可能与 wiki 所说的路线图上的计划状态报告功能有关。我试图避免的行为是反复按下慢跑按钮不会继续发送额外的移动 gcode 行,直到上一行被执行。我将尝试将处理程序上传到我的 GRBL 分支,仍在寻找 github 和 git。代码是非常 alpha 的,虽然功能,但我不是专业的程序员,所以它可能有点 hack,欢迎反馈。

状态报告的形式和功能。 #48
贡献者

“ok”消息表示 g 代码行已正确解析。这也是该行在缓冲区中占用的空间再次空闲的指示器。在这个函数中,“ok”消息已经被程序使用,比如stream.py脚本,它会尽可能快地提供 grbl。

一种指示 g 代码行何时开始运行的方法可以通过使用 g 代码行号报告来实现(我将很快提供代码)。但是,如果您的行是要运行的唯一和最后一行,它仍然不会为您提供“g 代码行已完成”报告。最后一个 g 代码命令的完成可以从命令缓冲区中的块数中读取。当它变为零时,您的命令已完成运行。

我现在在我的https://github.com/jgeisler0303/grblUI中的做法是比较 3 个连续的位置报告(以 100 毫秒轮询)。如果没有变化,则表示移动已停止并且命令已完成。

状态报告的形式和功能。 #48

一个简单的“完成”对我有用(见第 12 期),因为我需要知道动作已经停止。当命令缓冲区为空时,我添加了一个“完成”打印语句。我还在规划器中添加了一个“完成”,因为有时运动会被优化掉。我使用的是74576a8,但它可能可以添加到较新的分支中。

状态报告的形式和功能。 #48

在 TinyG 中,我添加了一个合成状态变量,如下所示:

enum cmCombinedState { COMBINED_RESET = 0 , //
机器已被重置或 中止// motion is holding COMBINED_HOMING, // homing cycle active COMBINED_PROBE, // probe cycle active COMBINED_JOG // joging is treated as a cycle };

状态是您可以请求在状态报告中报告的参数之一(标记为“stat”)。因此,当系统运行时,状态报告中会返回值“Run”。在最后的状态报告中,返回值“Stop”,假设没有更多的块排队等待运行。注意:即使“Cycle”在那里,它也不会暴露给界面。

-奥尔登

状态报告的形式和功能。 #48

谁能帮我获得“完成”状态?我用 python 为我的机器人编写了一个小程序,知道我们已经到达最终目的地的唯一方法是在初始化新 gcode 后检查 MPos 的变化。我确信在特殊模式下有可能得到像“完成”或“缓冲区清除”这样的回复。例如“*G00 x100”可以在这段代码执行完成后给出回复。“G00 x200”照常只能给出“ok”回复。谢谢你的帮助。

状态报告的形式和功能。 #48

您好,
通过串口发送的gcode可以知道执行了一条命令:
Serial.print(“?\n\r”);
然后有时检查前五个字符的返回是否等于“<Idle”
示例:

void TestEdle(){
while( stateGcode() != “<Idle” );
while( stateGcode() != “<Idle” );
while( stateGcode() != “<Idle” );
}

欢迎评论,
Milton Vilela
São Paulo – Brasil

喜欢 (0)