USB-PC104シリーズ モーター制御ユニット Pythonサンプルプログラム
ソフトウェアマニュアルにPythonのサンプルコードは記載しておりません。また、ソフトウェアパックにもPythonのサンプルプログラムは含まれておりませんので、Pythonで使用される場合は以下を参考にしてください。
サンプルプログラム
import sys
import ctypes
# エラーコード(戻り値)
YDU_RESULT_SUCCESS = 0 # 正常終了
# YduOpen
YDU_OPEN_NORMAL = 0 # 通常オープン
YDU_OPEN_OUT_NOT_INIT = 0x01 # 出力初期化しない
# 軸指定
PMC_AXIS_X0 = 0x0001
PMC_AXIS_Y0 = 0x0002
PMC_AXIS_Z0 = 0x0004
PMC_AXIS_U0 = 0x0008
PMC_AXIS_X1 = 0x0010
PMC_AXIS_Y1 = 0x0020
PMC_AXIS_Z1 = 0x0040
PMC_AXIS_U1 = 0x0080
# StartMotion (wStartMode)
PMC_ACC = 0 # 加減速起動
PMC_CONST = 1 # 一定速起動
# StopMotion(wStopMode)
PMC_DEC_STOP = 0 # 減速停止
PMC_IMMEDIATE_STOP = 1 # 即停止
# StartMotion / SetMotion,GetMotion (wMoveMode)
PMC_JOG = 0 # 連続動作
PMC_ORG = 1 # 原点復帰動作
PMC_PTP = 2 # プリセット動作
# SetSensorConfig,GetSensorConfig (wMode)
PMC_LOGIC = 0 # センサ極性
PMC_STA_STP = 1 # STA/STP設定
PMC_SD_CFG = 2 # SD有効無効設定
# SetPulseConfig,GetPulseConfig (wMode)
PMC_PULSE_OUT = 0 # パルス出力論理
PMC_IDLE = 1 # アイドリングパルス
PMC_METHOD = 2 # パルス方式
# GetStatus
PMC_BUSY = 0 # 動作状態
PMC_SENSOR_STATE = 1 # センサ入力状態
# 動作パラメータ設定(SetMotion,GetMotion)
class MOTIONPMCS(ctypes.Structure):
_fields_ = [('wAccMode', ctypes.c_ushort), # 加減速モード
('dwLowSpeed', ctypes.c_ulong), # 起動時速度
('dwSpeed', ctypes.c_ulong), # 移動速度
('wAccTime', ctypes.c_ushort), # 加減速時間
('lStep', ctypes.c_long)] # 移動パルス数,移動方向
# 動作パラメータ設定(SetMotionEx,GetMotionEx)
class MOTIONEXPMCS(ctypes.Structure):
_fields_ = [('wSpeedRate', ctypes.c_ushort), # 速度倍率
('wAccMode', ctypes.c_ushort), # 加減速モード
('dwLowSpeed', ctypes.c_ulong), # 起動時速度
('dwSpeed', ctypes.c_ulong), # 移動速度
('wAccTime', ctypes.c_ushort), # 加減速時間
('lStep', ctypes.c_long)] # 移動パルス数,移動方向
# 加減速モード
PMC_ACC_NORMAL = 0 # 直線加減速
PMC_ACC_SIN = 1 # S字加減速
# 移動方向
PMC_DIR_CW = 1 # CW(+方向)
PMC_DIR_CCW = -1 # CCW(-方向)
# DLL
ydu = ctypes.windll.Ydu
# IDが0に設定されているPMC-S4/00/00A-Uをオープンします
unit_id = 0
result = ydu.YduOpen(unit_id, b'PMC-S4/00/00A-U', YDU_OPEN_NORMAL)
if result != YDU_RESULT_SUCCESS:
print('オープンできません')
sys.exit()
# オンで検知するセンサを接続している場合や、リミットスイッチを接続していない場合は
# モーターが動作しません。
# その場合は以下の関数を実行してセンサ設定を"オンで検知"に変更してください。
axis = PMC_AXIS_X0 + PMC_AXIS_Y0 + PMC_AXIS_Z0 + PMC_AXIS_U0
result = ydu.YduPmcsSetSensorConfig(unit_id, axis, PMC_LOGIC, 0x1f)
# X0軸の動作パラメータを設定します
motion = (MOTIONPMCS * 4)()
motion[0].wAccMode = PMC_ACC_NORMAL
motion[0].dwLowSpeed = 200
motion[0].dwSpeed = 2000
motion[0].wAccTime = 300
motion[0].lStep = PMC_DIR_CW
result = ydu.YduPmcsSetMotion(unit_id, PMC_AXIS_X0, PMC_JOG,
ctypes.byref(motion))
# モーター動作を開始します
result = ydu.YduPmcsStartMotion(unit_id, PMC_AXIS_X0, PMC_ACC, PMC_JOG)
# モーター動作を停止します
result = ydu.YduPmcsStopMotion(unit_id, PMC_AXIS_X0, PMC_IMMEDIATE_STOP)
# クローズ
result = ydu.YduClose(unit_id)
API使用例
YduPmcsSetSensorConfig
# X0,Y0,Z0,U0軸のORG,+SD,-SD,+EL,-ELを「オンで検知」に設定します。
axis = PMC_AXIS_X0 + PMC_AXIS_Y0 + PMC_AXIS_Z0 + PMC_AXIS_U0
result = ydu.YduPmcsSetSensorConfig(unit_id, axis, PMC_LOGIC, 0x1f)
YduPmcsGetSensorConfig
# X0軸のセンサ極性設定を取得します。
axis = PMC_AXIS_X0
config = ctypes.c_ushort()
result = ydu.YduPmcsGetSensorConfig(unit_id, axis, PMC_LOGIC,
ctypes.byref(config))
YduPmcsSetPulseConfig
# X0,Y0,Z0,U0軸のパルス出力論理を負論理に設定します。
axis = PMC_AXIS_X0 + PMC_AXIS_Y0 + PMC_AXIS_Z0 + PMC_AXIS_U0
result = ydu.YduPmcsSetPulseConfig(unit_id, axis, PMC_PULSE_OUT, 0)
YduPmcsGetPulseConfig
# X0軸のパルス出力論理を取得します。
axis = PMC_AXIS_X0
config = ctypes.c_ushort()
result = ydu.YduPmcsGetPulseConfig(unit_id, axis, PMC_PULSE_OUT,
ctypes.byref(config))
YduPmcsSetMotion
# X0軸とZ0軸の動作パラメータを設定します。
axis = PMC_AXIS_X0 + PMC_AXIS_Z0
motion = (MOTIONPMCS * 4)()
motion[0].wAccMode = PMC_ACC_SIN
motion[0].dwLowSpeed = 200
motion[0].dwSpeed = 2000
motion[0].wAccTime = 300
motion[0].lStep = PMC_DIR_CW
motion[2].wAccMode = PMC_ACC_SIN
motion[2].dwLowSpeed = 100
motion[2].dwSpeed = 3000
motion[2].wAccTime = 1000
motion[2].lStep = PMC_DIR_CW
result = ydu.YduPmcsSetMotion(unit_id, axis, PMC_JOG, ctypes.byref(motion))
YduPmcsGetMotion
# X0軸とZ0軸の連続動作の動作パラメータを取得します。
# motion[0]にX0軸、motion[2]にZ0軸の動作パラメータが格納されます。
axis = PMC_AXIS_X0 + PMC_AXIS_Z0
motion = (MOTIONPMCS * 4)()
result = ydu.YduPmcsGetMotion(unit_id, axis, PMC_JOG, ctypes.byref(motion))
YduPmcsSetMotionEx
# X0軸とZ0軸の動作パラメータを設定します。
axis = PMC_AXIS_X0 + PMC_AXIS_Z0
motion_ex = (MOTIONEXPMCS * 4)()
motion_ex[0].wSpeedRate = 1
motion_ex[0].wAccMode = PMC_ACC_SIN
motion_ex[0].dwLowSpeed = 200
motion_ex[0].dwSpeed = 2000
motion_ex[0].wAccTime = 300
motion_ex[0].lStep = PMC_DIR_CW
motion_ex[2].wSpeedRate = 1
motion_ex[2].wAccMode = PMC_ACC_SIN
motion_ex[2].dwLowSpeed = 100
motion_ex[2].dwSpeed = 3000
motion_ex[2].wAccTime = 1000
motion_ex[2].lStep = PMC_DIR_CW
result = ydu.YduPmcsSetMotionEx(unit_id, axis, PMC_JOG,
ctypes.byref(motion_ex))
YduPmcsGetMotionEx
# X0軸とZ0軸の連続動作の動作パラメータを取得します。
# motion_ex[0]にX0軸、motion_ex[2]にZ0軸の動作パラメータが格納されます。
axis = PMC_AXIS_X0 + PMC_AXIS_Z0
motion_ex = (MOTIONEXPMCS * 4)()
result = ydu.YduPmcsGetMotionEx(unit_id, axis, PMC_JOG,
ctypes.byref(motion_ex))
YduPmcsGetCounter
# X0軸のカウンター値を読み込みます。
axis = PMC_AXIS_X0
data = ctypes.c_ulong()
result = ydu.YduPmcsGetCounter(unit_id, axis, ctypes.byref(data))
YduPmcsGetSpeed
# X0軸の速度データを読み込みます。
axis = PMC_AXIS_X0
data = ctypes.c_ushort()
result = ydu.YduPmcsGetSpeed(unit_id, axis, ctypes.byref(data))
YduPmcsGetStatus
# X0軸の動作状態を取得します。
axis = PMC_AXIS_X0
status = ctypes.c_ushort()
result = ydu.YduPmcsGetStatus(unit_id, axis, PMC_BUSY, ctypes.byref(status))
YduPmcsStartMotion
# X0軸とZ0軸を加減速起動で連続動作を開始します。
axis = PMC_AXIS_X0 + PMC_AXIS_Z0
result = ydu.YduPmcsStartMotion(unit_id, axis, PMC_ACC, PMC_JOG)
YduPmcsStopMotion
# X0軸とZ0軸のモーター動作を即停止します。
axis = PMC_AXIS_X0 + PMC_AXIS_Z0
result = ydu.YduPmcsStopMotion(unit_id, axis, PMC_IMMEDIATE_STOP)
YduPmcsChangeSpeed
# X0軸の速度を1000ppsに変更します。
axis = PMC_AXIS_X0
speed = 1000
result = ydu.YduPmcsChangeSpeed(unit_id, axis, speed)