注释
这是 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 文件;它在几遍中从 4 毫米的库存中切出 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_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时被合并,所以这可能会被关闭。 |
俄罗斯人 评论 on 21 Dec 2013
我正在玩边缘分支上的 grblsim,但我无法弄清楚“sim_time”的值代表什么。我通过 sim 通过 1x step_time 运行了一个非常简单的 gcode 文件,捕获了 stderr 并对其进行了解析。
这是gcode文件:
这是解析的输出:
如您所见,它移动 X 轴正好 1mm,使用 sim 默认值 $0=250steps/mm 和默认进给速率 250mm/min,移动 1mm 只需要 0.24 秒。但是,最终的 sim_time 是 3.286。这个值是多少?
我已经跟踪了 sim 代码,但我对 C 或 AVR 编程不太熟悉,所以我在跟踪 ISR/CPU/OCR2A 的东西时有点迷失了……
任何帮助将非常感激!谢谢!