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 コードはこれらすべてのパラメータを必要とするわけではなく、1 つ、多く、またはすべてを必要とします。
ここで注意すべきことの 1 つは、1 つのパスを切断してから 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 平面) を表すことがよくあります。したがって、ブロックは、xy 平面内外の z 軸の動きによって定義されます。
プロセスブロックをポストできるようにしたい:
- ハッチは「ブロック」を塗りつぶします。これには、パスの境界、それらの境界への接線、ツールの直径などのかなり複雑な計算が含まれます。これは最も差し迫った使用例であり、これに対する適切な解決策はまだありませんが、実行できるため、実行できることはわかっています。 Inkscape (ベクター グラフィックス アプリケーション)
- n 度回転します。かなり単純な座標変換ですが、これに対する解決策は既にあります。
- 繰り返し深化(押し出し)します。ブロックをコピーし、反復ごとに Z 深度を調整します。単純。
- 等