外部からLinuxCNCを動かしてみた。
import sys
import linuxcnc
import subprocess
import time
def axis_home(i, c, s):
#homeコマンドは即Fin???
c.home(i)
c.wait_complete()
while s.homed[i] != 1:
#ここにはsleepを入れたほうがエラーが出ない
time.sleep(1)
s.poll()
##print "home : " + str(i)
#LinuxCNCの起動
#本当は起動確認をしたあと、立ち上げたい。pidofコマンドを利用して、プロセスを確認する?
cmd = "/usr/bin/linuxcnc /home/machinekit/machinekit/configs/my_mill/my_mill.ini"
res = subprocess.Popen(cmd.split(), stdout = subprocess.PIPE)
i = 0
c = None
s = None
while True:
time.sleep(1)
if s == None:
#LinuxCNCと接続する。
s = linuxcnc.stat()
c = linuxcnc.command()
print "Initialized."
#情報を取得
s.poll()
if s.task_state == linuxcnc.STATE_ESTOP:
#非常停止解除
c.state(linuxcnc.STATE_ESTOP_RESET)
if s.task_state == linuxcnc.STATE_ESTOP_RESET:
print "RESET!!"
#ON状態にする。
c.state(linuxcnc.STATE_ON)
if s.task_state == linuxcnc.STATE_ON:
#ON状態の確認
print "ON!!"
break
#タイムアウト
if i > 40:
print "ERROR!"
exit()
i = i + 1
#モード切り替え
c.mode(linuxcnc.MODE_MANUAL)
#10秒くらい待たないとエラーが起きやすい
#ここをwait_complete()にしたらよい??
time.sleep(10)
#各軸原点復帰
for i in range(4):
axis_home(i, c, s)
#モード切替
c.mode(linuxcnc.MODE_MDI)
c.wait_complete()
c.mdi("G92 X0 Y0 Z0")
c.mdi("G0 G91 X-20.0")
c.wait_complete()
c.mdi("G0 G91 X20.0")
c.wait_complete()
#以下も動作確認済み
#c.program_open("/home/machinekit/machinekit/python/test/test.ngc")
#c.wait_complete()
#c.mode(linuxcnc.MODE_AUTO)
#c.wait_complete()
#c.auto(linuxcnc.AUTO_RUN,1)
#c.wait_complete()
コマンドは即Finで完了確認は行っていない様子。
完了を待つときはwait_completeコマンドを打つ
c.auto(linuxcnc.AUTO_RUN,1)は起動だけになるようで、プログラム完了まで動作が停止するわけではない。
別途状態を確認する必要あり。
LinuxCNCはプログラム終了後も残り続ける。複数プロセスを使っているためか、res.terminate()などを
行ってもうまく終了しない。
現状、手動でLinuxCNCを終了して、プログラムを再実行する必要がある。