・Pythonを用いたdelay stageの制御
測定機器の配線について(Delay stage)
測定用PC------(TCP/IP通信)----ツジコントローラー16ch------(Dsub9ピン)------ドライバーボード-----シグマ光機のステッピングモーター (Dealy stage)
となっている。
ツジコントローラー16chにはIPアドレスを与えており、大学に設置されたネットワークを介して通信を行っている。(SCPI(スキッピコマンド)でソケット通信使用)
UIをよくするための工夫として、python moduleを作成し、その中に関数を詰め込んでいる。そうすると、実際に動かすプログラムは、行数も減りすっきりして見栄えがいい。
ファイル構造
PC/Local/User/XXX/ にmoduleファイルを置き、moduleファイルに読み出したい関数を格納したpythonファイル(拡張子が .py)を置く。
PC/Local/User/XXX/には実際に測定に使用するプログラムファイル(拡張子が.ipynb)を置く。
これで、関数を読み出す際は、import module. pythonファイル名 でpythonライブラリと同様にimportできる。
delay stageを動かすプログラム↓
python file: module/motorMove.pyという名前で保存
import socket
from typing import Tuple
HOST = "通信する装置のIP Address"
PORT = ポート番号
TIMEOUT = 5.0 # seconds
def _send_cmd(cmd: str) -> Tuple[bool, str]:
"""コマンドを送って、(成功フラグ, 応答文字列) を返す。"""
# 末尾は CRLF に統一
payload = (cmd.rstrip("\r\n") + "\r\n").encode("ascii", errors="strict")
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(TIMEOUT)
s.connect((HOST, PORT))
s.sendall(payload)
data = s.recv(1024)
text = data.decode("ascii", errors="replace").strip()
ok = text.upper().startswith("OK")
return ok, text
def move(num) -> str:
"""相対移動: REL1<num>。応答文字列を返す。"""
try:
step = int(num)
except (TypeError, ValueError):
raise ValueError(f"move(num): num must be int-like, got {num!r}")
ok, resp = _send_cmd(f"REL1{step}")
return resp # 必要なら ok も返す
def back(numnum) -> str:
"""絶対位置: ABS1<numnum>。応答文字列を返す。"""
try:
pos = int(numnum)
except (TypeError, ValueError):
raise ValueError(f"back(numnum): numnum must be int-like, got {numnum!r}")
ok, resp = _send_cmd(f"ABS1{pos}")
return resp
実際に動かすプログラムファイルの中身↓ 名前は何でもよい
import module.motorMove
# 例: 相対移動
resp1 = motorMove.move(-100) # -100ステップ移動
print("Move response:", resp1)
# 例: 絶対位置移動
resp2 = motorMove.back(-12000) # 絶対位置 -12000 に移動
print("Back response:", resp2)