LinuxCNCでスレーブ駆動【EMC2】
よさく さんよりメールで相談を受けた,
LinuxCNCでのslave動作の設定についての記事です.
ご質問ありがとうございました!
要求は
・モータ出力の不足を複数のモータで補いたい.
・モータは特定の軸に完全同期して,XYZ+X2のようなスレーブ軸を構築したい.
・結線で対処でない方法,ソフト上で.
通常,完全に同期した出力軸を増設するには,
1.出力されたパルス列を複数のモータドライバに並列接続して物理的に分岐する.
2.モータドライバからの出力を物理的に複数のモータに分配する.
3.設定でPCからのパルス列出力を分岐する.
が考えられる.
LinuxCNCの英語版コミュニティでも同じ結論だった.
http://www.linuxcnc.org/index.php/english/component/kunena/?func=view&catid=49&id=16220
1.が一番分かりやすい解決ではあるが,
パラレルポートに用いられるDB25ケーブルを接続するタイプのモータドライバだと,
物理的な信号分岐が難しい(めんどくさい).
2.はモータの特性が揃っていないとできない.
3.は配線上の都合などが無視できるが,ソフトウェアの設定部分をいじらないといけない.
最近は東芝製バイポーラモータドライバICを使った中華製多軸ドライバが恐ろしく安く, ※注1
そのへんを使えると比較的安価にステッピングモータを利用できるようになってきている.
Shimalithもこの夏に幾つか中華ドライバを個人輸入していたし, ※注2
下図のように使い道のある技術なのでやってみることにした. ※注3
ちなみに,同様のことは,Mach3だとこうやるらしい
(英語記事,Mach3は持ってるけど扱ったことはないので検証してない)
http://www.plansandprojects.com/My%20Machines/SlaveAxisinMach3.html
注1: Shimalithがサンケン電気のドライバのテストをやった後,続編をやる気が無くなったのは,
自作目標コストが3000円/軸であったのに,日本国内ですらSEC-SUZUKIさんのキットにすでに負け,
中華にいたっては1000+円/軸という価格を見てゲンナリしたからだったりする
注2: なお,中華ドライバは同じメーカでも機種によって非常にダイナミックにピンアサインが変化するので,
購入する際にはどうなっているか注意したほうが良い
注3: 図中の3Dモデルは無料の「Autodesk 123D beta」にて作製.
かろうじて言わんとしていることが通じる程度の図ですが,これはShimalithの技量不足と手間を惜しんだことに依存しており,
まじめに使うととても良い設計のできる3D CADです.
a.負荷の多い軸を複数のモータで同期動作させる構成.ここではY軸.
ガントリー(門型)のフライスでたまに見られる構成.
重力のかかるZ軸を2つのモータで引き上げている機械もたまに見かける.
b.独立した2つの機械を並列運転する構成.
同じ品物を大量に作らなくてはならない時にまれに行われる.
事故って停止させると両方のワークが破滅するのが難点ですが.
______________________________________________
やり方.
1.とりあえずてきとーにStepconfウィザードで設定を作る.
XYYの構成なら,とりあえずZのフリをしてデータを打ち込んでおく.
だいたいこんなような設定ができるので,
できた設定を手動でいじる.
2.[設定名].halのピンアサイン設定を変更(色付き部が変更)
parport.x.pin-yy-out
xはパラレルポートナンバー,yyはピンナンバー.
同じ
例1:XYZY駆動
#********************************************************************
# ここより、ピンアサイン設定
#********************************************************************
## 出力側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 parport.0.pin-08-out #半角スペース+追加するピン名
setp parport.0.pin-04-out-reset 1
setp parport.0.pin-08-out-reset 1 #「setp」は行追加で対処
setp parport.0.pin-05-out-invert 1
setp parport.0.pin-09-out-invert 1
net ydir => parport.0.pin-05-out parport.0.pin-09-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 # 端子に重複がないように,Y2で使った端子をコメントアウトする
# 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
____________________________________________________
.halファイルのここ(アサイン設定)のみの変更で動作すると思う.
殺したa軸の設定情報とかが宙に浮いているので,
気になるなら,.halと.iniの不要な設定部を削除しても良い.
例2:並列運転
!解決しないとならないポイント(原点設定)があり,それをクリアしないと使えません!
1.XYZ でもXYZAでもいいので,使う機材に合わせ1台分設定する.
2.[設定名].halファイルを編集する
_____________________________________________________________________
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 1 out " ふたつ目のパラレルポート(lp2)の読み込みを追加
## 呼んだポートの設定。
## 最小パルス幅/パルス維持時間。短くするとppsが上がるが、モータドライバが反応できなければ意味がない。
## モータドライバデータシートを参照せよ
setp parport.0.reset-time 4000
setp parport.1.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 parport.1.read base-thread
addf parport.1.write base-thread
addf parport.1.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 1
net spindle-on => parport.0.pin-01-out parport.1.pin-01-out
net xstep => parport.0.pin-02-out parport.1.pin-02-out
setp parport.0.pin-02-out-reset 1
setp parport.1.pin-02-out-reset 1
setp parport.0.pin-03-out 1
setp parport.1.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.1.pin-04-out-reset 1
setp parport.0.pin-05-out-invert 1
setp parport.1.pin-05-out-invert 1
net ydir => parport.0.pin-05-out parport.1.pin-05-out
net zstep => parport.0.pin-06-out parport.1.pin-06-out
setp parport.0.pin-06-out-reset 1
setp parport.1.pin-06-out-reset 1
net zdir => parport.0.pin-07-out parport.1.pin-07-out
net astep => parport.0.pin-08-out parport.1.pin-08-out
setp parport.0.pin-08-out-reset 1
setp parport.1.pin-08-out-reset 1
net adir => parport.0.pin-09-out parport.1.pin-09-out
net coolant-mist => parport.0.pin-14-out parport.1.pin-14-out
net coolant-flood => parport.0.pin-16-out parport.0.pin-16-out
net charge-pump => parport.0.pin-17-out parport.0.pin-17-out
net home-x <= parport.0.pin-11-in-not # !原点センサを並列化するとどっちのセンサの信号で原点が決まったかわからなくなるため,
net home-y <= parport.0.pin-12-in-not # !2機の位置関係をあわせる運用上の工夫をしないとここは設定できない!
net home-z <= parport.0.pin-13-in-not # !ようするにそれを解決しないと並列運転はできない!
net estop-ext <= parport.0.pin-15-in-not
# !リミットセンサがある場合は,どっちの機体が事故っても止めないといけないので,必ず並列で設定する!
_____________________________________________
設定の書き方で, "net HOGE => port_assign"のところと,
"setp port_assign-hugahuga"のところで追加の仕方が異なることだけ
注意しておけば好きなように変更できると思う.