注释
|
这是未解析的输出,采用 JSON 格式,但值直接来自 stderr 输出:
|
|
我不熟悉 grbl sim 的设置方式,但如果它是 -爱德华 在 2013 年 12 月 20 日星期五晚上 9:37,ruswerner notifications@github.com写道:
|
|
我不知道自从我上次使用 grblsim 以来它究竟是如何演变的,但 sim_time 应该是自模拟开始以来的模拟时间。两个步骤之间的时间差是从一次调用步进器中断到下一次调用的时间。 |
|
多谢你们。我打算用我的 shapeoko 和 sim 做更多的测试来比较输出。我正在使用 sim 渲染预览,如果能知道在机器上运行作业需要多长时间,那就太好了。我会尽快报告更多信息。 |
|
行。我刚刚使用 Grbl 0.8c 在我的股票 Shapeoko v1 上运行了一个简单的工作。以下是我的 Arduino 的相关设置:
这是 grblsim(运行 0.9a)的相关设置,我从 grbl 0.8c 映射了相同的值:
这是我使用的 gcode 文件;它在几次通过后从 4mm 的库存中切割出 2 个正方形:
结果: 物理机运行该作业仅用了 90.899 秒(1.5149833333333333 分钟)。 所以我想知道两者之间的差异在哪里……看起来它们应该相对接近,除非步进时间单位不是秒。我想也许这是以毫秒为单位,所以实际上是 10.8 秒,但这比现实世界的时间少 9 倍;所以我认为在步进算法之外有某种“等待”时间可以弥补额外的 80 秒。 你知道有什么方法可以使步进器时间更有用吗?我觉得这是一个很容易解决的问题;arduino 时钟以 16Mhz 运行,grbl 在已知时间和持续时间发送步进脉冲(假设缓冲区保持满)。 干杯。 |
|
只是快速跟进。我确实设法编译了 0.9a(与 grblsim 相同的构建)并将其放在 Uno 上。gcode 仍然运行了 90.858 秒。 |
|
好的。我开始怀疑错误的计时与 grbl 0.9 步进器中断计时的新方式有关。很久以前我就没看过代码了。 |
|
别担心朋友。我当然可以等待,因为我还有很多其他项目要处理。谢谢您的帮助! |
|
您至少在某种程度上错误地读取了输出。我认为 10863.959961 数字是 block junction (block_t->entry_speed_sqr) 的入口速度,而不是时间值。它是标准输出数据行中的第四个值。 然而,有些东西仍然不稳定。我将您的 GCode 通过管道传输到我刚刚使用上面列出的设置配置的模拟器中,它告诉我这将需要 3958.71(…) 秒。两次运行给了我相同的结果。 我认为它在步骤时间计算中有所作为。 ((oacr2a + 1) * 8) / F_CPU 我是代码库的新手,所以我可能会朝着错误的方向前进,但我敢打赌步进时间计算需要考虑其他一些因素,比如加速期间使用的每秒不同的滴答声,步进脉冲率,诸如此类。(据我所知,TIMER2_COMPA_vect) |
|
我仍然没有查看代码,但我感觉您找到了问题的确切原因。旧的步进器中断以 TIMER1 设置的可变速率运行(据我所知)。新算法以固定的 30kHz 运行。但是模拟器仍然试图从 TIMER1 寄存器中读取中断调用率,因此得到了一个完全错误的时序。 |
|
(删除了我将一些 TIMER0 和 TIMER2 功能混为一谈的评论) 问题是 sys.state 永远不会设置为 STATE_CYCLE,这最终会影响每个块的步进事件计数、斜坡类型等。您的步进时间公式 (((oacr2a + 1) * 8) / F_CPU ) 完全正确。它准确地描述了中断处理程序被调用的频率,但是由于移动速率作为 sys.state 的副作用而降低,因此更少的中断处理程序调用会导致执行步骤。完成每个事件需要更多的中断调用,因此作业运行时间更长。 由于 sim_stepper() 在缓冲区已满时被调用,因此在 handle_buffer() 顶部添加一个块将通过正常代码路径触发状态更改为 STATE_CYCLE,并且仅当缓冲区已满时触发:
这导致作业完成时间为 90.19989 秒。(对于我的测试,我还添加了对空块的中断处理程序调用,这可能会影响数字几毫秒……) |
|
@michmerr您可以附上补丁文件或创建 PR 吗?我将该块添加到 handle_buffer() 中,现在我得到 164 秒,这比以前好多了,但不完全是你得到的,也不是我期望的。 感谢你目前的帮助。 |
|
@michmerr没关系。当我重建 sim 可执行文件时,我有错误的默认值。我能够在测试 gcode 上获得 90.19989000272848 秒。惊人的! |
|
稍作改动并提交了拉取请求。 |
|
拉取请求已合并为变更59e906f,因此这可能会被关闭。 |


我在边缘分支上玩 grblsim,我无法弄清楚“sim_time”的值代表什么。我用 1x step_time 通过 sim 运行了一个非常简单的 gcode 文件,捕获了 stderr 并解析了它。
这是 gcode 文件:
这是解析后的输出:
如您所见,它会将 X 轴精确移动 1 毫米,并使用 $0=250 步/毫米的 sim 默认值和 250 毫米/分钟的默认进给速率,移动 1 毫米只需 0.24 秒。然而,最终的 sim_time 是 3.286。这个值是多少?
我已经通过 sim 代码进行了跟踪,但我对 C 或 AVR 编程不太熟悉,所以我在通过 ISR/CPU/OCR2A 进行跟踪时有点迷路了……
任何帮助将非常感激!谢谢!