Contact me: hankecnc@gmail.com

暂停,重启时偶尔失败 #17

推推 grbl 3年前 (2023-01-25) 236次浏览

 关闭

暂停,重启时偶尔失败#17

军事机器人 打开此问题 on Nov 24, 2011 ·23条评论

评论

暂停,重启时偶尔失败 #17

前端接口日志窗口将填充以下内容:

– –剪—
错误:0 ISR正在超越自身。
错误:0 ISR正在超越自身。
错误:0 ISR正在超越自身。
错误:0 ISR正在超越自身。
错误:0 ISR正在超越自身。
错误:0 ISR正在超越自身。
错误:0 ISR正在超越自身。
错误:0 ISR正在超越自身。
错误:0 ISR正在超越自身。
错误:0 I
– –剪—

然后打印机出现故障,没有进一步的输出,或偶尔重新启动,并显示:

错误:行号不是最后行号+1,最后一行:0
重新发送:1

此外,它没有崩溃,但早些时候我有以下内容:

—剪—
错误:32 ISR正在超越自身。
错误:32 ISR正在超越自身。
错误:32 ISR正在超越自身。
—剪—

在这两种情况下,日志都有数百行这样的行,然后通常继续没有问题。

似乎更常见于紧角和短段。相关?

暂停,重启时偶尔失败 #17
贡献者

这是印刷品吗您的平台/ cpu速度是多少?这是否与ISR事件开始时的终点挡板触发有关?这需要多长时间,也许~4秒钟?这种情况多久发生一次?
它是可复制的,还是随机的?

感谢您的举报!

暂停,重启时偶尔失败 #17

我可以证实。打印时,当一个图层即将完成时会发生这种情况。打印停止几秒钟,同时显示许多”错误:0 ISR超越自身。”错误。然后继续下一层。大约10 – 15层后,固件崩溃,不再响应。(图纸居中,远离终点挡板)

用Arduino 0023编译的马林1.0.0 Beta 1
Orca版本0.2,配备Gen 6
Pronterface版本未知(10月中旬/月底)
SFACT版本42.4.1 2015年9月11日

暂停,重启时偶尔失败 #17
贡献者

一旦ISR发送了这个例程,它很可能在下一次失败,因为串行发送块。如果我们只发送一次信息,它可能会恢复得更快。这不是一个解决办法,但如果能知道是什么原因造成的,那就太好了。

任何人,你能再打印一次相同的文件吗,错误在同一个位置吗?血红露露的频率是多少?

你的微控制器频率是多少,16兆赫?

暂停,重启时偶尔失败 #17
作者

我在一个坡道1.3与arduinomega128@16mhziirc.我不会在同一张照片上再试一次(尤达,12小时变成13小时的照片),但我会看看我的精细细节测试照片是否会发生这种情况,如果它在同一个地方一直失败,我会报告回来。

我还将硬件缓冲区从16块增加到32块,这似乎使它更健壮,但并没有消除问题(我可能是在自欺欺人,因为我没有做A/B测试)。

暂停,重启时偶尔失败 #17

我又试了一次。它将可靠地但在随机点失效。一个常见的行为是打印停止时,pronterface变得非常不稳定/崩溃。重新启动pronterface后,无需重新启动打印机即可重新连接。(我重新启动打印机之前,每一次尝试,以确保)

  1. 尝试:
    从原始位置开始。它在第一次z向移动(提升喷嘴)后崩溃。许多“错误:28265 ISR超越自身。然后是“终点挡板命中”,但是光学器件物理上没有被触发。
  2. 尝试:
    成功地印刷了大约10层。然后许多”错误:28265 ISR超越自身。”。移动了1 – 2厘米,最后崩溃了许多”错误:28265 ISR超越自己。”
  3. 尝试:
    提起喷嘴后,出现许多ISR错误,然后移动约2cm,在移动完成前,发生以下情况:
    “……
    错误:26478 ISR正在超越自身。
    错误:26478 ISR正在超越自身。
    错误:26478 ISR正在超越自身。
    错误:
    echo:终点挡板命中:Z值:1.91

    未物理触发光学器件

电子元件是标准孟德尔部件Gen6

暂停,重启时偶尔失败 #17
作者

Pronterface会阻止等待结果,所以这并不奇怪。我已经崩溃了它举行的arduino下来重置或拔掉usb。由于固件崩溃,这是一种预期。

有趣的是,我们看到的数字即错误:$整数ISR超越自己。都是不同的。我去看资料了。

暂停,重启时偶尔失败 #17
作者

对代码的进一步检查让我觉得我们很幸运,加热器没有失控。

此外,我还添加了一个本地补丁,以便只发送一次串行错误,而不是每次溢出。如果有帮助的话我会再承诺的。

最后,我又一次撞车了,每次跑步都发生在完全不同的地方。

暂停,重启时偶尔失败 #17
作者

进行以下变更后重新运行:

// in configuration.h
#define BUFSIZE 5
#define BLOCK_BUFFER_SIZE 32

// in stepper.cpp
volatile int errorsent=0;

//in ISR(TIMER1_COMPA_vect)
if(busy){
  if(errorsent){
    SERIAL_ERROR_START
    SERIAL_ERROR(*(unsigned short *)OCR1A);
    SERIAL_ERRORLNPGM(" ISR overtaking itself.");
    errorsent=1;
   }
   return; 
}
///etc the rest of ISR
errorsent=0;

这可防止重复发送ISR错误。它没有做任何事情来解决根本原因,虽然我想知道如果一个更大的最小段大小将防止超限合并多个短期移动?我目前有5个,但与16 X微步,这是<1/10毫米对我的机器。也许我可以做10?随便说说…

暂停,重启时偶尔失败 #17

@rantenki:谢谢,就这样。

副作用:在之前的所有测试中,打印未按预期居中。现在它正确地居中了!

我的2小时打印刚刚成功完成,没有ISR错误。

暂停,重启时偶尔失败 #17
作者

不幸的是,这个修复没有解决根本原因,不管它可能是什么,尽管我怀疑短段导致ISR花费的时间比步骤间的时间长。我们也许可以通过静态分析来解决这个问题,但这听起来并不有趣。;)它不会帮助使用8 Mhz和/或低RAM的用户(即:Atmega168)。

暂停,重启时偶尔失败 #17

但与失败的打印相比,这是一个很大的进步。有了这个修复程序,我觉得它比“官方”的0.9.xx版本更稳定。(提高分辨率/质量也会很棒…)

暂停,重启时偶尔失败 #17
贡献者

我一直在想这可能是什么原因。在打印相同的文件时,我发现关于ISR的操作,只有以下两点不是100%确定的:

  • 缓冲器的填充状态。如果缓冲区为空,则速度和加速度可能会改变。此外,在低缓冲区的情况下,ISR可能会采取不同的、更长的分支。在这种情况下,更大的移动缓冲区可以帮助一点点,因为ratenki可能已经或可能没有看到。
  • 由于电磁噪声,终点挡板撞击或终点挡板触发时间非常非常短。后者仅在丢失微步时可见=如果固件仅在触发端部挡块时丢弃步数,则在正常打印中几乎完全不可见。与此相反的是,马林鱼会停止整个移动,这会导致一个可能可见的移动。老实说,我有一个大的层转移,但我认为这只是一个正常的问题,太多的挤压碰撞到粗糙的表面。
  • 步进机ISR可能会因温度定时器中断而延迟,也可能是串行接收ISR,老实说,我不知道其运行时间。

如果是定时器,我们可以手动执行中断优先级设置:存储在易失性uint8_t中的值为0 1 2的枚举/定义。运行时 moveISR或tempISR分别写入1或2。完成后,两者都写入0。
在开始moveISR检查之前,uint8_t是否处于活动状态,是通过自身(=非常糟糕)还是通过tempISR(=继续)。如果调用了tempISR,它将检查moveISR是否处于活动状态,如果是,则返回。如果这有帮助,还可以做一些更聪明的事情,例如tempISR计算它没有进入活动状态的次数,并告诉moveISR在失败nr次后让它完成一次。

暂停,重启时偶尔失败 #17
贡献者

搅拌机64。你的终点挡板似乎也有问题。(错误触发)
我将改变马林,使非常小的脉冲将不会被视为终点挡板触发器。但是你也应该修复打印机中的问题。
增加终点挡板电缆和电机电缆之间的距离。或者更好地使用屏蔽电缆。
数量较大的ISR警告可能由终点挡板引起。

带有0和32的ISR警告是我正在调查的固件错误。OCR1A不应为0或32。我从来不写100这个值<。(至少不是直接)

暂停,重启时偶尔失败 #17
贡献者

兰滕茨基,

你能重现这个错误吗?我的问题之一是我不能复制它。

暂停,重启时偶尔失败 #17
贡献者

Erik:我见过一些问题,表现为打印暂停,但使用的是自动sd卡打印。我可以试着用一个串行连接的主机软件来监控正在发生的事情。我怀疑这可能是同样的原因,所以至少我可以测试。恼人的问题:它只发生在我3次在3小时的累计打印时间。

暂停,重启时偶尔失败 #17
贡献者

兰滕库,

你能用最新版本测试吗?现在,它应该只显示一次消息,而不是在ISR中显示。

暂停,重启时偶尔失败 #17
作者

ErikZalm:是的,我可以在任何时候复制,尽管我今天不在实验室,所以明天之前我不能再试一次。我明天会给予新版本。

对不起,我的工作日程安排有点紧张,所以很坚韧挤出时间来测试东西。

暂停,重启时偶尔失败 #17
贡献者

兰滕基,

你能给予一下如何复制它吗?那可帮了大忙了。

暂停,重启时偶尔失败 #17
作者

是的,非常长的运行与许多非常精细的细节和短线段与默认配置。如果我把尤达缩小到1/4的大小,它会在几个小时的打印时间后发生。一旦我今天晚些时候回来,我就可以附加触发它的gcode(几个小时后)。

暂停,重启时偶尔失败 #17
贡献者

我从步进机ISR中删除了嵌套。它显示了这条信息。

允许嵌套以防止串行错误。现在,通过检查步进机ISR中的串行线即可完成此操作。

暂停,重启时偶尔失败 #17
作者

布库比切克/埃里克·扎尔姆:最新版本的星期六似乎没有同样的问题,我没有得到任何失败,在一些相当长的打印以前失败。也就是说,这并不是完全确定的,所以直到我们得到大量重复的非失败(我不需要那么多yoda),才能保证bug得到修复。从ISR中取出串行写入似乎确实减少了故障的级联性质,但我认为在我们可以称之为关闭之前,我们需要大量的测试。

至于volatile枚举的设置,也许我们可以找到一个好的arduino信号量库(我知道freeRTOS有一些),因为在check/set条件中总是存在竞争的风险,这将导致读取/设置不正确的状态。

伙计,这些东西真的提醒了我为什么我不怀念嵌入式开发;)

暂停,重启时偶尔失败 #17
贡献者

兰滕基,

谢谢你的测试。星期六的版本改进了它,但我在高速打印时仍然遇到了问题。
我决定从stepper例程中删除嵌套。这是串行通信所需的,但我在步进机ISR中进行了串行检查。不再需要嵌套。

思想家 添加了一个提交 引用了 本期 on Aug 24, 2019

丰泰安 添加了一个提交 到fmuntean/马林鱼 引用了 本期 on Sep 2, 2019

丰泰安 添加了一个提交 到fmuntean/马林鱼 引用了 本期 on Sep 3, 2019

内布卡德内扎 推送提交 前往尼布甲尼撒/马林 引用了 本期 on Oct 11, 2019

tonokip pushed a commit to ultimachine/Marlin that referenced this issue on Jan 25, 2022

暂停,重启时偶尔失败 #17

This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.

暂停,重启时偶尔失败 #17 github-actions bot locked and limited conversation to collaborators on Apr 24, 2022
喜欢 (0)