注释
|
arduino 只有单精度浮点数,所以当你给它太多数字时,它会失去精度(IIRC 它只保留大约 5 位数字),所以非常大的弧线不起作用。我不知道代码足以知道它在哪里崩溃(是在输入例程中没有正确解析数字,还是在无法处理那么大的数字的运动计划例程中),但对于正在研究代码的人,这是一个开始的地方。David Lang 在 2020 年 8 月 7 日星期五,Rybec 写道:
|
作者
|
谢谢你提供信息。它证实了我的怀疑。 如果其他人可以验证这些细节,那就太棒了。具体来说,grbl是显式截断,还是从ASCII到float的转换是隐式转换?这很重要,因为 32 位浮点数的精度范围为 6 到 9 位,具体取决于具体值。如果它被截断为恰好 5 位数字,那么我可以编写一个模块来根据 I 和 J 中的位数来修复 Gcode,但如果它只是以本机浮点精度将值拟合到浮点数中,那么我可以转换为超过 6 位的行,或者我可以检查该值是否适合 32 位浮点精度以保持 grbl 可以处理的最大精度。 |
|
https://github.com/gnea/grbl/blob/master/grbl/nuts_bolts.c中的 read_float() |
作者
|
对此感激不尽!这正是我所需要的。 我有一个问题,如果有人有答案: 在 read_float() 的注释中,有这一行,“对于已知的 CNC 应用程序,典型的十进制值预计在 E0 到 E-4 的范围内。” 这到底是什么意思?我假设,给定 8 位精度,这意味着任何值都不应大于 99,999,999.0,并且任何值都不应小于 0.0001。这样对吗? 编辑:我忘了具体说明,“更大”和“更小”指的是幅度,与符号无关。 |


在下面的 Gcode 中,第 1444 行和 1446 行导致主轴沿直线前进,沿途铣削任何材料,直到它到达机器的边缘,在那里它继续尝试移动,使电机紧张。(这在整个程序中会出现 20 或 30 次,而且总是在 I 和 J 值非常大的地方。)
1443 G2 X5.754 Y6.148 Z-4.500 I-7.998 J-7.779 K0.000 F150.000
1444 G2 X6.508 Y5.046 Z-4.500 I-2776625.665 J-1898932.711 K0.000 F150.000 X17.45
G2 324 Y3.220 Z-4.500 I-12.358 J-6.621 K0.000 F150.000
1446 G2 X7.669 Y1.855 Z-4.500 I-1533995.079 J-387777.227 K0.000 F150.000
这是用 FreeCAD 生成的。我不确定这里的错误是 grbl(我的机器是 Genmitsu 3018-Pro,运行 grbl 1.1f)还是 FreeCAD 的 Gcode。我知道弧长相当小,作为一条直线可能会更好(而且半径很大,实际上已经是一条直线),但我想知道到底出了什么问题,所以我可以报告这个错误在正确的地方。(我想我可以解决这个程序中的问题,只需将这些圆弧更改为直线,但是可能会损坏机器的错误是一个需要注意的严重错误。)
我有几个问题可能会帮助我决定是否提交针对 FreeCAD 的错误报告:
一般来说,在 grbl 或 Gcode 中,I 和 J 是否有最大幅度?我在谷歌上搜索时运气不佳,但大多数问题都是关于最大程序大小的,所以信息可能存在但被埋没了。我的假设是它仅受内部使用的变量类型精度的限制,它似乎是 32 位浮点数,可以轻松处理上述值。
这是浮点数学错误的结果吗?如果是,那么问题可能是 grbl 需要处理的问题,可能是通过设置 I 和 J 的最大值(或最大弧半径比),在这种情况下会发出错误代码,而不是永远将主轴驱动到远处.