GCode 是用于告诉多轴 (CNC) 机器人如何移动的语言。它看起来像这样:
M3 S5000 (Start Spindle Clockwise at 5000 RPM)
G21 (All units in mm)
G00 Z1.000000 (lift Z axis up by 1mm)
G00 X94.720505 Y-14.904622 (Go to this XY coordinate)
G01 Z0.000000 F100.0 (Penetrate at 100mm/m)
G01 X97.298434 Y-14.870127 F400 (cut to here)
G03 X98.003848 Y-14.275867 I-0.028107 J0.749174 (cut an arc)
G00 Z1.000000 (lift Z axis)
etc.
我已将这些命令放在句子中,但每个标记都可以在单独的行上。事实上,没有关于将数字连接到它们各自的代码字母的规则。然而,我已经有一个 LEX 解析器,它可以让我得到如下所述的令牌。
请注意,某些命令(M 或 G 代码)具有参数。在 M3 的情况下,它可以有一个 S(主轴速度)参数。G0 和 G1 可以有 X,Y,Z,F 等。G3 可以有 X,Y,Z,I,J,R... 但是每个 G 代码不需要所有这些参数,只需一个、多个或全部。
这里要注意的一件事是,我们正在切割一条路径,然后提升 z 轴。也就是说,我们移动到工作表面上方的位置,穿透,切割路径然后升空。我将其称为“块”或“路径”,而这正是我感兴趣的。
我需要能够以任何混乱的格式解析 GCode,然后创建一个“块”结构,其中一个块是 z 轴上下之间的任何一系列“命令”。
我可以使用 LEX(特别是 python PLY)标记这种语言。并得到:
type M value 3
type S value 5000
type COMMENT value "Start Spindle Clockwise at 5000 RPM"
type G value 31
type COMMENT value "All unites in mm"
type G value 0
type Z value 1.0
etc.
现在使用 Lexx,我需要一个名为“命令”的规则。
命令是任何注释,或: 'G' 或 'M' 代码后跟任何适当的参数代码(X、Y、Z 等) 当遇到另一个命令(注释、G 或 M)时,命令结束。
然后我需要一个称为“块”的东西,其中块是在 Z 向下和 Z 向上之前出现的任何“命令”集。
有 100 个 G 代码和 100 个 M 代码和 25 个参数代码(AZ 减去 G 和 M)
“命令”的规则可能如下所示:
command : G F H I J K L S T W X Y Z (how to specify ONE OF)
| M S F (How to specify one of)
| COMMENT
然后我们将如何定义块!?
我意识到这是一篇很长的帖子,但是如果有人可以给我一个关于 YACC 是否可以做到这一点的想法吗?否则,我将编写一些将 lex 标记手动转换为树的代码。
附录@rici
感谢您花时间理解这个问题。作为反馈:我的全部任务是让 YACC 完成繁重的工作,根据不同的用例将代码块分成块。
例如,当“雕刻”时,一个块通常代表一个字母或其他一些形状(在 xy 平面上)。因此,块将由 z 轴进出 xy 平面的移动来定义。
我希望能够发布流程块:
- 填充一个“块”。这将涉及一些相当复杂的路径边界计算、这些边界的切线、刀具直径等。这是最紧迫的用例,我还没有一个好的解决方案,但我知道它可以完成,因为它可以完成Inkscape(矢量图形应用程序)
- 旋转 n 度。一个相当简单的坐标翻译,我已经有一个解决方案。
- 迭代加深(拉伸)。在每次迭代中复制块并调整 Z 深度。简单的。
- 等等