Gコードパーサー-3の続き
TranlatorToAdventurer3
概要
TranslatorライブラリのToAdventurer3とSlic3rToBaseを利用した、GコードファイルをAdventurer3用に変換するバッチプログラム。
入力するファイルは、次の2つ。
- FlashPrint, Simplify3D, Slic3rで作成されたGコードファイル。
ただし、入力可能なファイルの拡張子は、gxとgに固定している。 - 動作パラメータを保存した、拡張子がjsonのファイル。
動作パラメータはGコードパーサー-3で、示したToAdventurer3とSlic3rToBaseで読み込み可能なパラメータをまとめたもの。
出力するファイルは、データ編集後のファイルで、拡張子をgoutに変更して出力する。
内部動作
以下の様な動作になっている。
- 入力パラメータ(引数で指定されたファイル名)の解析
拡張子がgx, gだったら、Gコードファイルとして処理し、拡張子がjsonの場合パラメータファイルとして処理する。 - Gコードファイルを事前読み込みし、ファイルがFlashPrint, Simplify3D, Slic3rのどのスライサーで作成されたかを認識する。
認識の方法は、ファイル先頭のコメントを読み込んで判断する。 - Slic3rで作成されたファイルの場合は、Slic3rToBaseで事前処理する。
この処理で、ToAdventurer3で、処理可能なファイルに変更される。 - ToAdventurer3でAdventurer3用ファイル形式に変換する。
CalcGcode
概要
これは、rs274ngcparserライブラリを使用したサンプルプログラムで、次の内容のものを実装している。
- ノズルの移動量の合計。
吐出していないときの移動とZ軸の移動も含めた移動量を算出している。 - ノズルの移動時間の合計。
移動量と移動速度(Fで指定された情報)をもとに時間を求め、その合計値を出したもの。 - フィラメントの吐出量の合計。
ノズルの移動時間と、実際の出力時間の差について
このプログラムで計算した結果は、どちらかというと、各スライサーで計算された時間に近い値が出力されている。
ということは、スライサーでの時間に関しての計算アルゴリズムは、このプログラムと同じということになる。
実際の出力時間は、ここで出力された時間より長い結果になるのが多い。
たぶん、以下の理由によるものと思われる。
- ノズル・ベッドの温度設定時間は考慮されていない
- ヘッドがベッドの上に来るまでの時間が計算できない
G161コマンドでXY原点位置への移動とか、初めのZ軸移動に関しては、現在のノズルの位置や移動先の座標がプログラム側には不明となってしまうため、計算できない。 - 指定された移動速度と実際の移動速度との差が盛り込まれていない。
たぶんGコードで指定された速度に比べ、実際のノズルの移動速度は遅いのだと思われる。移動時のトップスピードはFで指定されたものだが、始終点付近は、加減速のため若干遅くなるのではないか。
結果、計算された出力時間に比べ、実際の出力時間が多くなるのだと思う。
内部動作
フィラメントの吐出量の合計
G92コマンドで、Eの値のリセットが行われるため、G92でEが0になった場合、その前までのEの値をストックしておき、postActionで合計値を算出している。
ノズルの移動量の合計
G1コマンドがある場合、XYZがどれか移動されていると判断し、前回のXYZの値から、今回の位置までの距離を算出し、合計値を出している。
ノズルの移動時間の合計
ノズルの移動量を求めた後、その時のFの値で移動時間を算出し、その合計値を求めている。
rs274ngcparserTests/TranslatorTests
ライブラリの単体テスト用のプロジェクト
最後に
今回作ったパーサーは、rs274ngcの仕様はきちんとみず、過去の経験(rs-274xという仕様でプログラムを作ったことがある)と、G-code – RepRapを参考にして作ってしまっている。
そのため、rs274ngcの仕様的には問題がある個所があるかもしれないが、それはその時にでも考えよう。
ちなみに、rs274ngcの解釈する処理自体は、結構昔からあり、NISTが出している。
興味がある方はそちらを参照。
コメント