Contact me: hankecnc@gmail.com

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137

推推 grbl 3年前 (2023-02-02) 390次浏览
关闭
andrewismoody 打开了这个问题 2017 年 2 月 23 日 · 12条评论
关闭

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级)#137

andrewismoody 打开了这个问题 2017 年 2 月 23 日 · 12条评论

注释

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137

似乎在 Grbl 作业结束时发送的 Ctrl-X 命令偶尔会打断向清关平面的最后移动(可能每 5 个作业左右一次)。发送 Ctrl-X 时机器仍在运动,Grbl 将此检测为警报,而不仅仅是标准重置,并在到达安全平面之前停止正在进行的运动。

我主要在我的“Home and Reposition”宏中注意到这一点,我在其中发送了一个 home 命令,然后发送 GCode 以将工具头重新定位在我的夹具的角落。最后一步是将工具头带到安全平面,为运行实际作业做准备。这是最后一步被打断了,我不得不再次运行宏,因为确切的位置丢失了。

我看到这是由 GrblController.js 的第 601 行执行的,但我似乎无法找到触发它的代码片段。我认为在调用重置之前确保机器已停止(状态或“空闲”没有变化?)是有意义的。

低优先级,因为它很容易变通。

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137
合作者
奇顿 评论了 2017 年 2 月 23 日  

gcode发送完成后,web界面会在Grbl刚进入Idle状态时主动向服务器发出停止命令。如果你试图强制停止正在运行的程序,它会保持运动,延迟 50 毫秒,然后重置 Grbl。

对于您的情况,延迟值应该为 0,您可以通过 console.log 检查它是否已经处于空闲状态。如果 Grbl 实际上报告了 Idle 状态但电机功率仍在运动,可能需要添加一个较长的延迟(例如 500~1000ms)来解决它。

'stop': () => {
    this.event.trigger('gcode:stop');

    this.workflow.stop();

    const activeState = _.get(this.state, 'status.activeState', '');
    let delay = 0;
    if (activeState === GRBL_ACTIVE_STATE_RUN) {
        this.write(socket, '!'); // hold
        delay = 50; // 50ms delay
    }

    setTimeout(() => {
        this.write(socket, '\x18'); // ctrl-x
    }, delay);
}
Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137

你是说它在工作完成时调用停止事件?我没有看到在作业结束时将暂停发送到控制台,所以我不认为这是正确的功能。我似乎无法找到在作业完成时触发事件的位置。我以为它是“重置”。

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137
合作者

实际上,从 UI 操作时,您将没有机会在停止事件处理程序中看到 GRBL_ACTIVE_STATE_RUN 状态。

我不确定 Grbl 是否会报告空闲状态,但电机仍在运行它的最后一步。如果是,则在进行重置之前可能需要延迟。

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137
合作者

这是触发点,一个用于检查完成状态但有效的肮脏黑客。

src/web/widgets/Visualizer/index.jsx
Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137

好的,所以你正在等待 Grbl 空闲状态,但它似乎仍在移动,即使它报告空闲。老实说,我什至不确定是否需要执行此步骤。您是否有理由在工作结束时发送停止?它可以默默地结束,不是吗?

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137
合作者

发送“停止”事件的原因是停止服务器的工作流程,通知所有连接的客户端作业已完成,然后解锁 UI。

然而,我只是注意到每个连接的浏览器窗口都会向服务器发送“停止”事件,这是一种不受欢迎的行为(即多次发送相同的事件)。我将从 Visualizer 小部件中删除代码controller.command('stop'),并允许服务器自行停止工作流。

我想知道是否有必要在作业完成后进行软重置 (^x),尽管建议使用此方法以确保后续任务不会因不同的 gcode 模式而受到先前任务的影响。

在进行任何更改之前,您能否在重置前尝试延迟(例如 50-500 毫秒)并检查这是否可以解决您的问题?谢谢。

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137

我将延迟更改为 500 毫秒,并连续运行了大约 10 个 Home/Reposition 宏,没有出现任何问题。我认为这解决了问题。
我同意通过 GUI“完成”工作有点麻烦,应该作为工作流程的一部分来完成。您的多个浏览器参数本身就是一个很好的案例,但我也在想,如果作业完成时没有连接浏览器,它会在下一次连接时成功重置吗?
不管怎样,我认为你已经控制住了它。谢谢您的帮助。

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137 奇顿 添加了 增强 标签 2017 年 2 月 25 日
Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137 cheton 将此 添加到 1.9里程碑 2017 年 2 月 25 日
Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137 cheton 提到了这个问题 2017 年 2 月 25 日
40个任务
Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137

即使有 500 毫秒的延迟,今天又发生了这种情况(自从我进行更改后仅发生过一次)。我注意到这可能与网络流量有关。我将我的网络摄像头提高到 640×480 以获取更多细节。随着延迟的增加,故障率会大大降低,但我认为在将其移至后端之前,它永远不会完全解决。

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137
合作者
奇顿 评论了 2017 年 3 月 1 日  

是的,它最终会在 1.9 版本中移至后端。
我正在考虑删除作业完成时自动触发“停止”事件的调用,并将操作留给用户。唯一的缺点是您需要在完成后从 Web 界面手动单击停止按钮,但它只允许您在看到机器已完全停止时执行此操作。

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137

我真的很喜欢在工作结束时自动停止工作流程。也许您可以添加一个简单的机器位置增量以确保它已停止。
下面是一些伪代码。

//在状态更新循环期间
var lastPos = new Array(0, 0, 0);
var posDelta = new Arra(0, 0 ,0);
var curPos = new Array(xPos, yPos, zPos);
var machineIdle = true;

if (lastPos[0] != 0 & lastPos[1] != 0 & lastPos[2] != 0)
{
posDelta[0] = curPos[0] – lastPos[0];
posDelta[1] = curPos[1] – lastPos[1];
posDelta[2] = curPos[2] – lastPos[2];
}
else
{
lastPos = curPos;
}

如果 (posDelta[0] != 0 & posDelta[1] != 0 & posDelta[2] != 0)
{
machineIdle = false;
}

然后在 if 语句中添加对 machineIdle 的检查,以决定是否停止工作流。如果 Grbl 空闲并且机器空闲等。

只是一些想法。

Grbl ALARM:3 (Abort during cycle) 在作业结束时(低优先级) #137
合作者

已在1.9.3中修复。工作流状态现在集中到后端服务器(提交7737668)。