0

ここに私のセットアップの要約があります:

  • 3 軸 CNC、raspberry pi で実行される Python スクリプトを介して制御可能
  • Windows PC は pi に接続でき、スクリプトを実行できます

最終的な目標は、C# で作成された UI が、CNC を実行するための自動テスト サイクルを開始することです。Python プログラムにはCnc、デバイスの現在の位置を格納し、それを特定の場所に配置するメソッドを含むオブジェクトがあります。

問題は、CNC を移動するたびに新しいスクリプトを実行すると、Cncインスタンスを再初期化する必要があり、インスタンスの位置が忘れられることです。したがって、唯一のインスタンスを含む 1 つのマスター プログラムを実行できるかどうか疑問に思っていCncます。リモート マシンが CNC に移動するように指示したい場合は、新しい位置の argz を使用して別のスクリプトを実行できますpython action.py x y z。このスクリプトはマスター プログラムと通信してmove、新しいメソッドを再構築することなく、適切な場所にメソッドを呼び出すことができます。Cnc物体。次に、理想的には、マスター プログラムは、モーションが完了したことを示し、「アクション」スクリプトにメッセージを送り返します。そのスクリプトは、アクションが完了したことをリモート システムに伝えるために何かを出力します。その後、スクリプトは終了し、再度呼び出される準備が整います。新しいargzで。

最終的に、リモート システムはすべての作業から高度に抽象化され、マスターの実行を開始するだけで済みます。その後、モーションを実行したいときはいつでも argz を使用して移動スクリプトを実行します。

注:私の他のアイデアは、現在の位置でテキストファイルを保存し、常にファイル内の情報でインスタンスを再初期化することでした。

編集:解決済み...一種の

handler.py

ハンドラーは、input.txt という名前のテキスト ファイルから継続的に読み取り、新しい整数を探します。受信した場合、output.txt という名前のテキスト ファイルを更新して '0' を読み取り、入力に対して何らかのアクションを実行 (つまり cnc を移動) し、値 '1' を output.txt に書き込みます。

from time import sleep
cur_pos=0

while True:
    with open("input.txt","r") as f:
        pos=f.readline()
    try:
        if pos=='':
            pass
        else:
            pos=int(pos)
    except:
        print pos
        print("exititng...")
        exit()

    if cur_pos==pos or pos=='':
        #suggestion from @Todd W to sleep before next read
        sleep(0.3)
        pass
    else:
        print("Current pos: {0:d}, New pos: {1:d}".format(cur_pos,pos))
        print("Updating...")
        with open("output.txt","w") as f:
            f.write("0")
        #do some computation with the data
        sleep(2)
        cur_pos=pos
        print("Current pos: {0:d}".format(cur_pos))
        with open("output.txt","w") as f:
            f.write("1")

pass_action.py

アクション パサーはコマンド ライン引数を受け取り、それを input.txt に書き込み、output.txt が '1' を読み取るのを待ちます。その後、done を出力して終了します。

import sys
from time import sleep
newpos=sys.argv[1]
with open("input.txt","w") as f:
    f.write(newpos)

while True:
    sleep(0.1)
    with open("output.txt","r") as f:
        if f.readline()=='1':
            break

sys.stdout.write("done")
4

3 に答える 3

2

本当にシンプルにしたい場合は、「メイン」CNC スクリプトで、ファイル システム上の指定されたディレクトリを読み取って、1 つ以上のコマンドを含むテキスト ファイルを探します。複数のファイルがある場合は、最も古いファイルを取得してコマンドを実行します。次に、ファイルを削除 (または別のディレクトリに移動) して、次のファイルを取得します。ファイルがない場合は、数秒間スリープしてから再度確認してください。吐き気を繰り返す。次に、C# アプリでコマンド ファイルを正しいディレクトリに書き込むだけです。

于 2018-04-03T20:29:23.933 に答える