注释
|
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);
}
|
|
你是说它在工作完成时调用停止事件?我没有看到在作业结束时将暂停发送到控制台,所以我不认为这是正确的功能。我似乎无法找到在作业完成时触发事件的位置。我以为它是“重置”。 |
|
实际上,从 UI 操作时,您将没有机会在停止事件处理程序中看到 GRBL_ACTIVE_STATE_RUN 状态。 我不确定 Grbl 是否会报告空闲状态,但电机仍在运行它的最后一步。如果是,则在进行重置之前可能需要延迟。 |
|
好的,所以你正在等待 Grbl 空闲状态,但它似乎仍在移动,即使它报告空闲。老实说,我什至不确定是否需要执行此步骤。您是否有理由在工作结束时发送停止?它可以默默地结束,不是吗? |
|
发送“停止”事件的原因是停止服务器的工作流程,通知所有连接的客户端作业已完成,然后解锁 UI。 然而,我只是注意到每个连接的浏览器窗口都会向服务器发送“停止”事件,这是一种不受欢迎的行为(即多次发送相同的事件)。我将从 Visualizer 小部件中删除代码 我想知道是否有必要在作业完成后进行软重置 (^x),尽管建议使用此方法以确保后续任务不会因不同的 gcode 模式而受到先前任务的影响。 在进行任何更改之前,您能否在重置前尝试延迟(例如 50-500 毫秒)并检查这是否可以解决您的问题?谢谢。 |
|
我将延迟更改为 500 毫秒,并连续运行了大约 10 个 Home/Reposition 宏,没有出现任何问题。我认为这解决了问题。 |
|
即使有 500 毫秒的延迟,今天又发生了这种情况(自从我进行更改后仅发生过一次)。我注意到这可能与网络流量有关。我将我的网络摄像头提高到 640×480 以获取更多细节。随着延迟的增加,故障率会大大降低,但我认为在将其移至后端之前,它永远不会完全解决。 |
|
是的,它最终会在 1.9 版本中移至后端。 |
|
我真的很喜欢在工作结束时自动停止工作流程。也许您可以添加一个简单的机器位置增量以确保它已停止。 //在状态更新循环期间 if (lastPos[0] != 0 & lastPos[1] != 0 & lastPos[2] != 0) 如果 (posDelta[0] != 0 & posDelta[1] != 0 & posDelta[2] != 0) 然后在 if 语句中添加对 machineIdle 的检查,以决定是否停止工作流。如果 Grbl 空闲并且机器空闲等。 只是一些想法。 |



似乎在 Grbl 作业结束时发送的 Ctrl-X 命令偶尔会打断向清关平面的最后移动(可能每 5 个作业左右一次)。发送 Ctrl-X 时机器仍在运动,Grbl 将此检测为警报,而不仅仅是标准重置,并在到达安全平面之前停止正在进行的运动。
我主要在我的“Home and Reposition”宏中注意到这一点,我在其中发送了一个 home 命令,然后发送 GCode 以将工具头重新定位在我的夹具的角落。最后一步是将工具头带到安全平面,为运行实际作业做准备。这是最后一步被打断了,我不得不再次运行宏,因为确切的位置丢失了。
我看到这是由 GrblController.js 的第 601 行执行的,但我似乎无法找到触发它的代码片段。我认为在调用重置之前确保机器已停止(状态或“空闲”没有变化?)是有意义的。
低优先级,因为它很容易变通。