LinuxCNCでPython APIを使う | sy-engのブログ

sy-engのブログ

システムを作りたい。
自分用の記録。

外部から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を終了して、プログラムを再実行する必要がある。