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 深度。簡單的。
- 等等。
uj5u.com熱心網友回復:
如果你只是想確保 G 命令后面跟著一些東西,你可以這樣做:
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 修飾符將它們拆分為序列,則可以這樣做。您可能希望詞法分析器能夠根據引數的符號生成兩種不同的 Z 標記型別,因為決議器只能根據標記而不是語意值做出語法決策。
您的問題至少提供了兩個不同的塊定義,因此很難提供明確的答案。
“也就是說,我們移動到作業表面上方的一個位置,穿透,切割一條路徑,然后升空。我稱之為‘障礙’或‘路徑’,這就是我感興趣的地方。”
例如:
G00 X94.7 Y-14.9 (Move) G01 Z0.0 (Penetrate) G01 X97.2 Y-14.8 G03 X98.0 Y-14.2 I-0.02 J0.7 (Path) G00 Z1.0 (Lift)但稍后你會說,“塊是在Z 向下和Z 向上之前出現的任何‘命令’ 。
這只是上一個示例的這一部分:
G01 X97.2 Y-14.8 G03 X98.0 Y-14.2 I-0.02 J0.7 (Path)
這些都是可能的,但顯然不同。以下是一些可能的構建塊:
# 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/407368.html
標籤:
