首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将YACC应用于GCODE (GRBL)

将YACC应用于GCODE (GRBL)
EN

Stack Overflow用户
提问于 2022-01-06 13:57:07
回答 1查看 94关注 0票数 1

GCode是一种用来告诉多轴机器人如何移动的语言.看起来是这样的:

代码语言:javascript
复制
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,特别是python)来描述这种语言。并得到:

代码语言:javascript
复制
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个参数码( are减去G和M)。

“命令”的规则可能如下所示:

代码语言:javascript
复制
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令牌手动转换为树。

Addendum @rici

谢谢你花时间理解这个问题。通过反馈:我的全部任务是让YACC根据不同的用例将代码块分离成块。

例如,当“雕刻”时,块通常表示字母或其他形状(在xy平面上)。因此,一个块将定义为z轴在xy平面内外的运动。

我希望能够发布处理块:

  • 舱口填充一个‘块’。这将涉及到路径边界的一些相当复杂的计算,与这些边界的切线,工具直径等。这是最紧迫的用例,我还没有一个很好的解决方案,但我知道这是可以做到的,因为它可以在Inkscape (向量图形application)
  • rotate的n度)。一个相当简单的坐标翻译,我有一个解决方案,这个already.
  • iteratively深化(挤出)。复制块并在每次迭代中调整Z深度。Simple.
  • etc.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-07 07:01:13

如果您只想确保G命令后面跟着某样东西,您可以这样做:

代码语言:javascript
复制
g_modifier: F | H | I | J | K | L | S | T | W | X | Y | Z
m_modifier: S | F
g_command: G g_modifier | g_command g_modifier
m_command: M m_modifier | m_command m_modifier
command: g_command | m_command | COMMENT

如果您想使用Z修饰符将这些拆分成序列,则可以这样做。您可能希望lexer能够根据参数的符号生成两种不同的Z标记类型,因为解析器只能根据令牌而不是基于语义值来做出语法决策。

您的问题至少提供了两个不同的块定义,这使得提供一个明确的答案有点困难。

  1. ”,即我们移动到工作表面上方的某个位置,穿透,切割路径,然后抬起E 210,我将其称为‘块’或‘路径’,我感兴趣的就是这个。“

例如,这将是:

G00 X94.7 Y-14.9 (移动) G01 Z0.0 (穿透) G01 X97.2 Y-14.8 G03 X98.0 Y-14.2 I-0.02 J0.7 (路径) G00 Z1.0 (升降机)

  1. ,但稍后您会说,“块是在a Z down之后的a Z up之前出现的任何一组‘命令’。

这只是上一个例子的这一部分:

G01 X97.2 Y-14.8 G03 X98.0 Y-14.2 I-0.02 J0.7 (Path)

这两者都是可能的,但显然是不同的。以下是一些可能的积木:

代码语言:javascript
复制
# This list doesn't include Z words
g_modifier: F | H | I | J | K | L | S | T | W | X | Y
g_command_no_z: G g_modifier
              | g_command_no_z g_modifier

# This doesn't distinguish between Z up and Z down. If you want that to
# affect syntax, you need two different Z tokens, and then two different
# with_z non-terminals.
g_command_with_z: G Z
                | g_command_no_z Z 
                | g_command_with_z g_modifier

# You might or might not want this.
# It's a non-empty sequence of G or M commands with no Z's.
path: command_no_z
    | path command_no_z
command_no_z: COMMENT
            | m_command
            | g_command_no_z
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70608227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档