オリジナルマインド COBRA 2520でのEMC2利用例
研究室にオリジナルマインド mini-CNC COBRA 2520が来た.
組み立てキットなのだが,組み立て時にその位置決め,自由度拘束のうまさに感服した.
この卓上フライス,制御をLinuxCNCで行うことにしたので,設定を行った.
設定時にはEMC2標準のウィザードを使ってももちろん良いが,
・パラレルポートひとつ分しか設定できないため,ちょっと凝ったことをすると詰まる
・結局のところ,.halと.iniのふたつのテキストエディタで開ける設定ファイル形式に落とし込まれる
ため,base-periodの決定以外はウィザードの出力結果を基に直接設定ファイルを書きなおした方が仕事しやすい.
このCOBRAを例にEMC2の設定を説明する.
ここでのCOBRAの動作ファイルは,下の状態での例となる
・原点キットがX軸のモータ側,Y軸のマシン手前側,Z軸上側に取付けられている
・linuxとモータドライバ「QUATTTRO-1」との間でチャージポンプイネーブルが周波数が合わないのか通らず,
モーターイネーブルも動作したりしなかったりなので,シリアルケーブルとコンソールでも通信し,モータロックの解除ができるようにしてある.
・主軸モータは交換の予定があるため,とりあえず電源ONで無条件に回転するようにした.
・制御するPCはAtomを使用し,毎秒40000パルスが発生出来ると設定したため,
マイクロステップ数(16分割)の割に速く,最大1500mm/minで動作する.
ページ下,添付ファイルにzipで固めたものを置いておく.
(2011.10.20 win上での処理ミスでgeditで開くと文字化けするデータになっていたため、linux上で検証し直して差し替え)
ここでは,その中のoriginalmind_cobra.halとoriginalmind_cobra.iniのファイルを提示し,
他の設定のための例とする.
・.halファイル
# Generated by stepconf at Thu Jan 13 13:57:20 2011
## Mod by Shimalith at WED Apr 20 17:13:01 2011
# If you make changes to this file, they will be
# overwritten when you run stepconf again
## !このファイルは手作業でいじってあるので,
## 同設定名でStepconf_wizを行うと上書きされます!
loadrt trivkins
## 最大パルス数設定。
## 実際には、「.ini」設定ファイルから呼び出すため、参照先指定のみ。
loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
## パラレルポートを呼ぶ。
## 端末コマンド「dmesg」のログにparport読み込みの記録がある場合、parport番号(WindowsでいうところのLPT番号)での指定も可。
## もちろんIOアドレスで0x---hでも良い。増設したポートのアドレス指定は上手くいかないことが多かった.
loadrt probe_parport
loadrt hal_parport cfg="0 out "
## 呼んだポートの設定。
## 最小パルス幅/パルス維持時間。短くするとppsが上がるが、モータドライバが反応できなければ意味がない。
## モータドライバデータシートを参照せよ
setp parport.0.reset-time 4000
## ステップ形式設定。実はバイポーラ駆動などのシーケンサを兼ねることも可能。
loadrt stepgen step_type=0,0,0
## ラダーシーケンスのポート数設定
loadrt classicladder_rt numPhysInputs=15 numPhysOutputs=15 numS32in=10 numS32out=10 numFloatIn=10 numFloatOut=10
## 緊急停止の方式の設定など。
## 入力のみ、ポートHi出力と入力のループ、チャージポンプイネーブルなど様々な安全装備が利用可。
## 構築労力と安全性の兼ね合いで。今回はループとチャージポンプ
net estop-out <= iocontrol.0.user-enable-out
net estop-ext => iocontrol.0.emc-enable-in
#e-stopを「PCイネーブル信号出力-ドライバ-PCの緊急停止入力」とループさせる.
#パラレルケーブルが抜けてもどちらかの電源が落ちても動かない仕組み
loadrt charge_pump #チャージポンプイネーブル
net estop-out charge-pump.enable iocontrol.0.user-enable-out
net charge-pump <= charge-pump.out
## ここまでに使うことにしたfunctionがどの間隔で実行されるか.
## 即時反応しないと危険なものはbase-thread,ある程度遅れても構わない入力はservo-threadで指定
addf parport.0.read base-thread
addf stepgen.make-pulses base-thread
addf charge-pump base-thread
addf parport.0.write base-thread
addf parport.0.reset base-thread
addf stepgen.capture-position servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf classicladder.0.refresh servo-thread
addf stepgen.update-freq servo-thread
## 補機類設定
net spindle-cmd <= motion.spindle-speed-out
net spindle-on <= motion.spindle-on
net coolant-mist <= iocontrol.0.coolant-mist
net coolant-flood <= iocontrol.0.coolant-flood
#********************************************************************
# ここより、ピンアサイン設定
#********************************************************************
## 出力側Hi-Lo入れ替えは行追加「setp ポート-out-invert 1」
## 入力側Hi-Lo入れ替えは行末に「-not」追加
## ステップクロック用のピンは次行に「setp ポート-out-reset 1」追加
## parport 0
net spindle-on => parport.0.pin-01-out
net xstep => parport.0.pin-02-out
setp parport.0.pin-02-out-reset 1
setp parport.0.pin-03-out 1
net xdir => parport.0.pin-03-out
net ystep => parport.0.pin-04-out
setp parport.0.pin-04-out-reset 1
setp parport.0.pin-05-out-invert 1
net ydir => parport.0.pin-05-out
net zstep => parport.0.pin-06-out
setp parport.0.pin-06-out-reset 1
net zdir => parport.0.pin-07-out
net astep => parport.0.pin-08-out
setp parport.0.pin-08-out-reset 1
net adir => parport.0.pin-09-out
net coolant-mist => parport.0.pin-14-out
net coolant-flood => parport.0.pin-16-out
net charge-pump => parport.0.pin-17-out
net home-a <= parport.0.pin-10-in-not
net home-x <= parport.0.pin-11-in-not
net home-y <= parport.0.pin-12-in-not
net home-z <= parport.0.pin-13-in-not
net estop-ext <= parport.0.pin-15-in-not
# ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
## parport 2 があれば設定
#********************************************************************
# ピンアサイン決定ここまで ハードウェアの結線はちゃんとGNDピンも繋ぐように
# ここより、各軸設定など
#********************************************************************
## X-AXIS configure
setp stepgen.0.position-scale [AXIS_0]SCALE
setp stepgen.0.steplen 1
setp stepgen.0.stepspace 0
setp stepgen.0.dirhold 33000
setp stepgen.0.dirsetup 33000
setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL
net xpos-cmd axis.0.motor-pos-cmd => stepgen.0.position-cmd
net xpos-fb stepgen.0.position-fb => axis.0.motor-pos-fb
net xstep <= stepgen.0.step
net xdir <= stepgen.0.dir
net xenable axis.0.amp-enable-out => stepgen.0.enable
net home-x => axis.0.home-sw-in
## Y-AXIS configure
setp stepgen.1.position-scale [AXIS_1]SCALE
#1mmの動作にどのくらいパルスが必要か.具体的な値は.iniを参照させる.
setp stepgen.1.steplen 1
setp stepgen.1.stepspace 0
setp stepgen.1.dirhold 33000
setp stepgen.1.dirsetup 33000
setp stepgen.1.maxaccel [AXIS_1]STEPGEN_MAXACCEL
net ypos-cmd axis.1.motor-pos-cmd => stepgen.1.position-cmd
net ypos-fb stepgen.1.position-fb => axis.1.motor-pos-fb
net ystep <= stepgen.1.step
net ydir <= stepgen.1.dir
net yenable axis.1.amp-enable-out => stepgen.1.enable
net home-y => axis.1.home-sw-in
## Z-AXIS configure
setp stepgen.2.position-scale [AXIS_2]SCALE
setp stepgen.2.steplen 1
setp stepgen.2.stepspace 0
setp stepgen.2.dirhold 33000
setp stepgen.2.dirsetup 33000
setp stepgen.2.maxaccel [AXIS_2]STEPGEN_MAXACCEL
net zpos-cmd axis.2.motor-pos-cmd => stepgen.2.position-cmd
net zpos-fb stepgen.2.position-fb => axis.2.motor-pos-fb
net zstep <= stepgen.2.step
net zdir <= stepgen.2.dir
net zenable axis.2.amp-enable-out => stepgen.2.enable
net home-z => axis.2.home-sw-in
##TOOL_CHANGER config block Tコマンド用
loadusr -W hal_manualtoolchange
net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change
net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed
net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared
##PLC LADDER config block (シーケンス制御用)
# Load Classicladder without GUI (can reload LADDER GUI in AXIS GUI
loadusr classicladder --nogui custom.clp
・.iniファイル
# Generated by stepconf at Thu Jan 13 13:57:20 2011
## Mod by Shimalith at 2011/05/18
# If you make changes to this file, they will be
# overwritten when you run stepconf again
## !このファイルは手作業でいじってあるので,
## 同設定名でStepconf_wizを行うと上書きされます!
[EMC]
MACHINE = originalmind-cobra
DEBUG = 0
## デバッグモードをバイナリで表す。もろもろのエラーが無視されるので不用意に使わない。
[DISPLAY]
DISPLAY = axis
## 制御画面.axis keystick mini tkemc xemcから選択。 よほどのことがない限りaxis。他はシンプルに過ぎる。
EDITOR = gedit
## emcからgコード修正に入るとき利用するテキストエディタ.お好きなものでどうぞ.
POSITION_OFFSET = RELATIVE
## 起動時に表示する座標系。MACHINE or RELATIVE から選択。
## 機械原点からのワールド座標系か指定したユーザ座標系か、座標系移動コマンドを打ったときの画面表示に関わる。起動後の変更も可。
POSITION_FEEDBACK = ACTUAL
## ACTUAL or COMMANDED から選択。サーボ系ドライバで,画面表示する値をコンピュータ指示値にするか、
## ドライバのポジションセンサ(エンコーダ)からの値を表示するか。起動後変更可。
## ステッピングモータにはほぼ関係ない
MAX_FEED_OVERRIDE = 1.5
## 加工移動コードでの最大オーバライド倍率。最高ステップ速度よりは速くならない。
## スライドバーで調整するので,倍率を大きく取りすぎると細かい調整ができなくなる。
INTRO_GRAPHIC = emc2.gif
## 最初のペンギンさんロゴ。変更可
INTRO_TIME = 1
## ペンギンさん最小表示時間sec。ロード時間により、これよりも長くなることはある
PROGRAM_PREFIX = /home/linuxcnc/emc2/nc_files
## NCコードファイル探索先.デスクトップにファイルを置きたい場合などの際に変更する.
INCREMENTS = 10mm 5mm 1mm .5mm .1mm .05mm .01mm .005mm
## マニュアル相対移動時の1軸移動量リストドロップダウンリストに表示される.記法に従えば数値変更可
PYVCP = custompanel.xml
## カスタムUI設定ファイル
[FILTER]
## 読み込んだファイルでNCコードでないものを、どうやって処理するか
PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image
PROGRAM_EXTENSION = .py Python Script
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
## 割り込みタイミング?単位はsec
[RS274NGC]
PARAMETER_FILE = emc.var
[EMCMOT]
EMCMOT = motmod
COMM_TIMEOUT = 1.0
COMM_WAIT = 0.010
BASE_PERIOD = 23000
## ジッタ量から決まる最小実行間隔(ns).レイテンシテストのプログラムで確認した値をいれる.
SERVO_PERIOD = 1000000
[HAL]
HALUI = halui
HALFILE = originalmind-cobra.hal
## アサイン他、もう一つの基本設定ファイルの名前.同じフォルダにいれておくこと.
HALFILE = custom.hal
POSTGUI_HALFILE = custom_postgui.hal
[HALUI]
# add halui MDI commands here (max 64)
[TRAJ]
AXES = 3
## 可動軸の数
COORDINATES = X Y Z
## 可動軸の担当位置.XYZABCUVWから,
##「JIS B 6310/ISO 841」に規定の,座標系記号に従って選択.
## よくわからなければ,JIS B 6310 付属書Aのイラストが参考になる.
LINEAR_UNITS = mm
## 直線動作の単位、mm inch から選択.この選択は移動の原単位となるので動作量に関わる
ANGULAR_UNITS = degree
## 角度の単位 degree (deg) radian (rad) grad gon(1回転を400に分割)から選択
CYCLE_TIME = 0.010
DEFAULT_VELOCITY = 10.0
## 起動時のG00速度。mm(またはinch)/sec.
## 起動後変更可だが,事故防止のためにあらかじめ節度ある設定にしておく
MAX_LINEAR_VELOCITY = 30.00
## 最高速度。mm/sec指定。たぶん多軸の合成ベクトルの値。
#[AXIS_number] 説明用ダミー
#TYPE = LINEAR
## 軸の運動形式。直線軸XYZのほか、回転軸ABCやアームのような角度軸が可能
#HOME = 130.0
## 原点復帰で拾った機械原点をいくらの座標値とするか
#MAX_VELOCITY = 15.0
## この軸の最高速度。MAX_LINEAR_VELOCITYと衝突した場合、遅い方採用と思いたい
## 設定値が早すぎるとfolloingエラーになる.
#MAX_ACCELERATION = 490.0
## 最大加速度。mm(inch)/s^2 速すぎると脱調。モータのデータシートに記載の最大スルーイングより大きくはできない。
## クリーンな状態が最大で、設備を載せてイナーシャが増加するほど加速時に脱調しやすくなる。
## リニアガイドの運動制限もある。 *なお、未設定時も、スゲー加速悪いが動きはする
#STEPGEN_MAXACCEL = 612.5
## パルス生成上の制限。上の値より大きくないといけない。1-10%増が推奨。バックラッシュ設定がある場合は1.5-2倍を推奨
#SCALE = 2500.0
## 1unit(mm/inch)進むのに必要なパルス数。
## stepconf_wizではプーリ比やらマイクロステップやら入れましたが、最終的に必要なのはこれだけ。
#FERROR = 1
## PID制御時に許容送り誤差(mm/inch)指示座標とエンコーダの差がこれを越えるとエラーになる
#MIN_FERROR = .25
## ごく遅い送りの時の、指示座標とエンコーダ座標の偏差。
#MIN_LIMIT = 0.0
## ネガ側ソフトウェアリミット位置。Homing後有効。EMC上でカウントした原点からの距離がこれを越えないよう停止される。
#MAX_LIMIT = 140.0
## ポジ側ソフトリミット位置。マシンの可動幅に応じて決める.
## ハードウェアリミットとは別動作です。 ソフトリミットは機械原点からの距離を追った状態で減速停止します。
## ncコードがこれを超えそうなときは警告が出ます.
## ハードリミットは今回設置していませんが,あったとしても拾った瞬間F2停止になるので、機械は守れますがワークはゴミになります
#HOME_OFFSET = 0.000000
## 原点拾った後オフセットさせる量。オフセット後の位置がHOMEで設定した値になる。
#HOME_SEARCH_VEL = 0.050000
## 原点スイッチにHitするまでの速度。
## 設定した加速度で減速する間にセンサを通り過ぎたり端にぶつかったりしないように設定。
## 数値の前に「-」をつけるとサーチ方向を反転できる。
## 0.0にすると,EMCは軸に原点スイッチはないと判断し、その場を原点位置とする
#HOME_LATCH_VEL = 0.050000
## 原点スイッチから抜けるまでの速度。スイッチから抜けた瞬間が0となる。
## 速くすると誤差が出るので、ゆっくり。
## ここでも-符号で移動方向が変更できる。センサから抜ける方向が決まる.
#HOME_FINAL_VEL = 0.0
## オフセットする際の速度。0.0や設定なしの時はG00の速度が適用。必ず正の値であること。
#HOME_IGNORE_LIMITS = NO
## ハードウエアリミットと原点を単一スイッチが兼ねているときはYES。
#HOME_IS_SHARED = number
## 複数の軸の原点の信号を1pinにまとめて取り込むとき使用。
## 1にしておくとどこかでセンサが反応している間は原点復帰操作に入れない.
#HOME_SEQUENCE = number
## 同時に複数軸の原点復帰を行う「Home_All」とき、復帰する優先順位。0、1、2、、の順に実行される。
## 未設定の軸はスキップされる。優先順位は複数軸が同一順位でも良い。
## *Z軸は先に復帰しないとワークを引きずるとか、諸々の機械の事情を考慮する。
## 例えば一般的なフライスなら、Z(工具軸)のみを0、X、Yを1にする。
[EMCIO]
EMCIO = io
CYCLE_TIME = 0.100
TOOL_TABLE = tool.tbl
[AXIS_0]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 490.0
STEPGEN_MAXACCEL = 612.5
SCALE = 1600.0
FERROR = 1
MIN_FERROR = .25
MIN_LIMIT = -2.0
MAX_LIMIT = 245.0
HOME_OFFSET = 0.000000
HOME_SEARCH_VEL = -5.000000
HOME_LATCH_VEL = 0.050000
HOME_SEQUENCE = 1
[AXIS_1]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 490.0
STEPGEN_MAXACCEL = 612.5
SCALE = 1600.0
FERROR = 1
MIN_FERROR = .25
MIN_LIMIT = -2.0
MAX_LIMIT = 195.0
HOME_OFFSET = 0.000000
HOME_SEARCH_VEL = -5.00000
HOME_LATCH_VEL = 0.050000
HOME_SEQUENCE = 1
[AXIS_2]
TYPE = LINEAR
HOME = 1.0
MAX_VELOCITY = 25.0
MAX_ACCELERATION = 490.0
STEPGEN_MAXACCEL = 612.5
SCALE = 1600.0
FERROR = 1
MIN_FERROR = .25
MIN_LIMIT = -55.0
MAX_LIMIT = 5.0
HOME_OFFSET = 2.500000
HOME_SEARCH_VEL = 5.000000
HOME_LATCH_VEL = 0.050000
HOME_SEQUENCE = 0