注释
我通常按照 GUI 中的“发送行”进行操作,它总是非常接近
|
@jahnj0584你的意思是从 GUI 发送的行数?它非常接近但向前 |
如果它说发送了 2032 行,我将从那里开始。我经营一家工厂,它还没有在计划中猛烈地向前冲。它还取决于您的命令的长度。机器运行一行可能需要 250 毫秒,而有些可能需要 40 秒。
|
我认为您必须分析 XYZ 坐标和 Gcode 以确定哪个命令处于活动状态。您可以将其缩小到已收到 @chamnit是否有一种确定性的方法来决定您需要搜索多远以确保您会找到哪个 为了分析 gcode,我认为线性移动应该是验证当前位置是否在端点之间的问题。 如果圆弧大于圆的 1/4,则圆弧运动会更复杂。我可能会首先检查点到圆弧中心的距离,然后将圆弧分成线段并应用相同的线性移动检查。可能有更精确的方法来查找点是否在圆直径上,但您需要确保您的算法可以容忍舍入误差。 |
一种不理想的选择:您可以使用行号报告,这需要在 config.h 中取消注释 USE_LINE_NUMBERS。一些原始设备制造商使用它来跟踪某行执行的内容和时间。但是,它需要 GUI 为每一行发送一个唯一的行号 另一种方法是在中止作业之前观察并记录计划程序缓冲区大小。如果您知道 Grbl 已经“确定”了什么,它可能是准确的,但是 G2/3 arcs 可能会使它变得不确定,因为它用小线填充规划器缓冲区以生成弧。 我确信还有其他方法,但这是我一直想在 ARM 版本中改进的事情之一,我有空间来实现更好的东西。 @arkypita:您要求的是 CNC 世界中称为“程序重启”的东西。您必须对此非常小心,尤其是在处理可能引起火灾的激光时。很容易错误地设置 g 代码模式状态和恢复点的初始位置。像这样的错误会导致机器做一些不可预测的事情,并可能毁掉工作或更糟。 程序如何重新启动也可能取决于机器。您需要以某种方式将机器移动到正确的位置并设置其状态(主轴、冷却液等)。如果您支持铣削,您还必须处理在作业中途更换工具时如何处理。每台机器都会略有不同,需要自定义例程来处理此类问题。 |
@chamnit从 GRBL 需要提供哪些信息来实现“程序重启”而不同时实现 gcode 解析器的角度考虑这个问题可能会很有趣。
|
@winder它无法完成,但正如您所指出的那样,这不是一种简单可靠的方法。你也可能从归档中得到错误的坐标信息(记住他们只更新每 n° 毫秒所以你可能有旧信息) @chamnit正如你所说,行号报告是最可靠的,但由于非常重要的原因,它是不可行的。 我还考虑使用缓冲区信息是状态报告(即 <Run|….|Bf: 4,83>)来计算计划缓冲区中有多少移动(其中我已经收到 ok) .
我认为确保不会遗漏一点的唯一方法是从最后收到的 OK 重新开始“返回某条线”。根据您的文档,一些回线意味着 17 条移动线是计划的缓冲区大小。当然,您可能会冒着重复一些已经执行的任务的风险,但您不会错过任何东西。
你是对的!不仅有从何下手的问题,还有重建国家的问题。 我做的第一个测试是简单地跳过恢复点之前的所有行,然后开始推送剩余的行。你可以很容易地想象结果:-) 所以我实现了对跳过的行的读取和解析(我已经拥有所有功能)来重建 S、F、M3/M4/M5、G90/G91 的状态和位置,直到重新启动点。因此,当用户要求从我重建这些状态的位置开始时,我会在所有设备关闭的情况下移动到重启点,然后恢复情况。 当然,正如您已经提到的,我什么都不应该忘记……例如,我刚刚忘记了冷却液
这是一个不错的想法 |
Grbl的检查模式������������������������ℎ�ℎ����������������′��������������′,���������������ℎ���ℎ�����������ℎ������������.�������,������′�����������ℎ�����������������.����������ℎ�������������,��������������ℎ�����������# 重置前的参数状态。 在重新启动点之前,您还需要确保 $# 参数内的更改以及来自探测周期的任何输入(例如工具更改)得到正确处理。 |
关于计算从哪里重新开始的确切点,这就是我最终的想法:
有时这是不可能的。如果停止是由于重置(硬或软)引起的,则 $G 不可靠:更好地从文件重建状态信息。
由于我对数控世界的无知,我不知道这一切意味着什么。但如果你这么说,我相信也很重要。你能解释得更好吗?
|
还有一个问题,如果可以的话。我在恢复 G2/G3 的模态状态时遇到一些问题
我看到 G0/G1 也可以在没有 XYZ 参数的情况下发送,结果是改变模态状态,这很好,但我也看到 G2/G3 不能在没有 XYIJ 的情况下发送。当我尝试这样做时,我回来了 出于这个原因,当 G2/G3 用作模态来执行弧序列时,我无法正确恢复状态并恢复作业,当 gcode 被优化时,如下所示:
但是如果我发送重启序列
我有错误 我错了什么?为什么我不能像 G0/G1 一样发送没有 XYZIJ 的 G2/G3? |
你说得对,我最近也注意到了这一点。除此之外,如果尚未设置进给速率,则任何运动命令都会出错: |
是的,但是对于进给率,这是正确的行为。(编辑:但即使进给率未定义,也应允许发送不带 XYZ 的简单 G1)。如果有 XYZ…参数,错误应该只上升 |
根据标准,列出的错误是正确的。您提出的建议与标准背道而驰,我不同意这一点。 |
根据定义,G01 是基于线性插补进给速率的移动。当机器启动时,默认进给速率为零。在执行 G1 之前,您必须先定义进给速率,无论是否定义了运动。 对于 G2/G3,您需要一个进给速率,但您还需要一个中心点和一个终点。如果省略终点,则假定终点与起点相同,为一个完整的圆。如果缺少定义圆弧中心的 I、J、K 字,则 G2/G3 无法运行。G2/G3 有点不同,因为 G2/G3 是模态的,而 I、J、K 词不是,所以每次你有一个 G2/G3 时你必须有一个 I、J、K。G2/G3 与 G0/G1 的不同之处还在于,G0/G1 可以自行调用而不暗示移动,而直线上的 G2/G3 则意味着弧形移动。一旦完成圆弧移动,G2/G3 就是模态的。举个例子 G2 << 这一行会出错 G2 I2 << 这行在某些解释器中是可以的,但在其他解释器中则不行。一些口译员也需要 X 或 Y。其他人假设一个完整的圆圈并使用起点作为终点。 G2 X2 I1 << 只要终点不造成半径冲突,这条线就可以了 G2 X2 I1 << 假设此行后跟这些: |
我想我已经明白了。 由于没有 IJK 就没有定义弧,因此没有这些参数的任何 G2 都会返回错误。 |
谢谢大家。在您的建议的推动下,我开发了自己的“问题后工作恢复”程序。 |
@winder 然而,这里简要描述了如何在 LaserGRBL 中实现“工作恢复”: 在正常的文件流操作期间:
第 2 步和第 3 步并不是真正必要的,但我已经实现了它们以建议从哪里重新启动的最佳行号。断开连接时,可能已经执行了所有已发送的行;在硬件重置时,执行可能在最后一次回答等之前停止了一些行。 当用户按下“发送文件”按钮时
当用户决定从特定行恢复作业时
|
大家好。我正在尝试开发一种功能,以帮助用户在流式传输 G 代码文件时从 Grbl 的最后一个命令“完全执行”继续恢复中断的作业(挂起、重置、断开连接)。
我知道的信息是收到“OK/ERROR”响应的最后一条命令以及我通过 COM 发送的最后一条命令。
我用来做resume的操作是:
然后我:
这工作得很好,但我看到当命令“完全执行”时“OK”响应不会到达,但只有当它被转移到计划的缓冲区时(我认为)。所以这项工作并不是完全从左边开始,而是向前/下一步。
显然,我可以从某些命令中任意恢复:双重覆盖某些部分的风险比遗漏某些部分更令人讨厌。
但是我问:有没有一种简单的方法可以猜测最后一个“完全执行的命令”是什么?