PMC-Mシリーズ Pythonサンプルプログラム

ヘルプファイルにPythonのサンプルコードは記載しておりません。また、ソフトウェアパックにもPythonのサンプルプログラムは含まれておりませんので、Pythonで使用される場合は以下を参考にしてください。

サンプルプログラム

汎用デジタル入力/出力

サンプルプログラムのDIOと同等の内容です。 サンプルプログラムのDIOや、ヘルプファイルの[サンプルプログラム]-[DIO]とあわせてご確認ください。

import sys
import ctypes

# エラーコード(戻り値)
PMCM_RESULT_SUCCESS = 0             # 正常終了

# 軸指定
PMCM_AXIS_X = 0x0001
PMCM_AXIS_Y = 0x0002

# SetSensorConfig,GetSensorConfig
PMCM_LOGIC = 0
PMCM_EL_FUNC = 1
PMCM_SD_FUNC = 2
PMCM_SD_ACTIVE = 3
PMCM_ORG_FUNC = 4
PMCM_EZ_FUNC = 5
PMCM_EZ_COUNT = 6
PMCM_ALM_FUNC = 7
PMCM_LTC_FUNC = 8
PMCM_PCS_FUNC = 9
PMCM_SENS_FILTER = 10

# DLL
pmcm = ctypes.windll.PmcM

# [オープン]
id = 0
result = pmcm.PmcmOpen(id, b'PMC-M2C-U')
if result != PMCM_RESULT_SUCCESS:
    print('オープンできません')
    sys.exit()


# [設定]
axis = PMCM_AXIS_X + PMCM_AXIS_Y
# 汎用デジタル入力として使用する場合はINPとPCSをオンで検知(負論理)に設定
result = pmcm.PmcmSetSensorConfig(id, axis, PMCM_LOGIC, 0x30)
# 汎用デジタル入力として使用する場合はLTCを立ち下がりエッジに設定
result = pmcm.PmcmSetSensorConfig(id, axis, PMCM_LTC_FUNC, 0)


# [入力]
# IN0の入力
input_data = ctypes.c_ubyte()
input_no = 0
result = pmcm.PmcmDioInput(id, ctypes.byref(input_data), input_no, 1)
if result == PMCM_RESULT_SUCCESS:
    print('IN{}: {}'.format(input_no, input_data.value))

# IN0-4の入力
input_data = (ctypes.c_ubyte * 5)()
result = pmcm.PmcmDioInput(id, ctypes.byref(input_data), 0, 5)
if result == PMCM_RESULT_SUCCESS:
    for i, d in enumerate(input_data):
        print('IN{}: {}'.format(i, d))


# [出力]
# OUT0の出力
output_data = ctypes.c_ubyte(1)
result = pmcm.PmcmDioOutput(id, ctypes.byref(output_data), 0, 1)

# OUT0-3の出力
output_data = (ctypes.c_ubyte * 4)(0, 1, 0, 1)
result = pmcm.PmcmDioOutput(id, ctypes.byref(output_data), 0, 4)


# [クローズ]
result = pmcm.PmcmClose(id)

連続動作

サンプルプログラムのMotion1と同等の内容です。 サンプルプログラムのMotion1や、ヘルプファイルの[サンプルプログラム]-[Motion1]とあわせてご確認ください。

import sys
import ctypes

# エラーコード(戻り値)
PMCM_RESULT_SUCCESS = 0             # 正常終了

# 軸指定
PMCM_AXIS_X = 0x0001
PMCM_AXIS_Y = 0x0002

# SetMotion(Line),GetMotion(Line)
PMCM_JOG = 0
PMCM_ORG = 1
PMCM_PTP = 2
PMCM_LINE = 3

PMCM_ACC_LINEAR = 0
PMCM_ACC_SCURVE = 1

PMCM_DIR_CW = 1
PMCM_DIR_CCW = -1

PMCM_CONST = 0
PMCM_CONST_DEC = 1
PMCM_ACC_DEC = 2

# StopMotion
PMCM_DEC_STOP = 0
PMCM_IMMEDIATE_STOP = 1

# ChangeSpeed
PMCM_CHG_IMM_LOW_SPEED = 0
PMCM_CHG_IMM_SPEED = 1
PMCM_CHG_DEC_LOW_SPEED = 2
PMCM_CHG_ACC_SPEED = 3
PMCM_CHG_NEW_SPEED = 4

# SetSensorConfig,GetSensorConfig
PMCM_LOGIC = 0
PMCM_EL_FUNC = 1
PMCM_SD_FUNC = 2
PMCM_SD_ACTIVE = 3
PMCM_ORG_FUNC = 4
PMCM_EZ_FUNC = 5
PMCM_EZ_COUNT = 6
PMCM_ALM_FUNC = 7
PMCM_LTC_FUNC = 8
PMCM_PCS_FUNC = 9
PMCM_SENS_FILTER = 10

# SetPulseConfig,GetPulseConfig
PMCM_PULSE_OUT = 0
PMCM_DIR_WAIT = 1
PMCM_FIN_TIMING = 2
PMCM_FH_REVISE = 3

# SetSynchroConfig,GetSynchroConfig
PMCM_SYNC_START_MODE = 0
PMCM_SYNC_START = 1
PMCM_SYNC_SIG_START = 2
PMCM_SYNC_STOP_MODE = 3

# SetSynchroOut,GetSynchroOut
PMCM_SYNC_OUT_MODE = 0

# SetComparatorConfig,GetComparatorConfig
PMCM_COMP_COUNTER = 0
PMCM_COMP_ENCODER = 1

# SetLatchConfig,GetLatchConfig
PMCM_COUNTER_LATCH_LTC = 0
PMCM_COUNTER_LATCH_ORG = 1
PMCM_COUNTER_CLEAR_LATCH = 2
PMCM_ENCODER_LATCH_LTC = 3
PMCM_ENCODER_LATCH_ORG = 4
PMCM_ENCODER_CLEAR_LATCH = 5

# SetEncoderConfig,GetEncoderConfig
PMCM_ENCODER_MODE = 0
PMCM_ENCODER_DIR = 1
PMCM_ENCODER_FILTER = 2

# SetErcConfig,GetErcConfig
PMCM_ERC_LOGIC = 0
PMCM_ERC_AUTOOUT_1 = 1
PMCM_ERC_AUTOOUT_2 = 2
PMCM_ERC_WIDTH = 3
PMCM_ERC_OFF_TIMER = 4
PMCM_ERC_SIG_ON = 5
PMCM_ERC_SIG_OFF = 6

# SetEventMask,GetEventMask
PMCM_EVENT_STOP = 0
PMCM_EVENT_STATE = 1

# PmcmGetStatus
PMCM_BUSY = 0
PMCM_SIG_STATUS = 1

# コンパレータ設定
class COMPPMCM(ctypes.Structure):
    _fields_ = [('wConfig', ctypes.c_ushort),       # 比較条件
                ('lCount', ctypes.c_long)]          # 比較データ

# 動作パラメータ設定(SetMotion,GetMotion)
class MOTIONPMCM(ctypes.Structure):
    _fields_ = [('wMoveMode', ctypes.c_ushort),     # 動作モード
                ('wStartMode', ctypes.c_ushort),    # 起動モード
                ('fSpeedRate', ctypes.c_float),     # 速度倍率
                ('wAccDecMode', ctypes.c_ushort),   # 加減速モード
                ('fLowSpeed', ctypes.c_float),      # 起動速度
                ('fSpeed', ctypes.c_float),         # 移動速度
                ('wAccTime', ctypes.c_ushort),      # 加速時間
                ('wDecTime', ctypes.c_ushort),      # 減速時間
                ('fSAccSpeed', ctypes.c_float),     # 加速S字区間
                ('fSDecSpeed', ctypes.c_float),     # 減速S字区間
                ('lSlowdown', ctypes.c_long),       # スローダウンポイント
                ('lStep', ctypes.c_long),           # 移動パルス数,移動方向
                ('bAbsolutePtp', ctypes.c_long)]    # 絶対座標指定

# 動作パラメータ設定(SetMotionLine,GetMotionLine)
class MOTIONLINEPMCM(ctypes.Structure):
    _fields_ = [('wStartMode', ctypes.c_ushort),    # 起動モード
                ('fSpeedRate', ctypes.c_float),     # 速度倍率
                ('wAccDecMode', ctypes.c_ushort),   # 加減速モード
                ('fLowSpeed', ctypes.c_float),      # 起動速度
                ('fSpeed', ctypes.c_float),         # 移動速度
                ('wAccTime', ctypes.c_ushort),      # 加速時間
                ('wDecTime', ctypes.c_ushort),      # 減速時間
                ('fSAccSpeed', ctypes.c_float),     # 加速S字区間
                ('fSDecSpeed', ctypes.c_float),     # 減速S字区間
                ('lSlowdown', ctypes.c_long),       # スローダウンポイント
                ('lStep', ctypes.c_long * 2),       # 移動パルス数,移動方向
                ('bAbsolute', ctypes.c_long * 2)]   # 絶対座標指定

# イベント要因(SetEvent)
class EVENTFACTORPMCM(ctypes.Structure):
    _fields_ = [('nResult', ctypes.c_int),
                ('wStop', ctypes.c_ushort * 2),     # 停止イベント要因
                ('wState', ctypes.c_ushort * 2)]    # 状態イベント要因

# DLL
pmcm = ctypes.windll.PmcM

# [オープン]
id = 0
result = pmcm.PmcmOpen(id, b'PMC-M2C-U')
if result != PMCM_RESULT_SUCCESS:
    print('オープンできません')
    sys.exit()


# [各種設定]
axis = PMCM_AXIS_X + PMCM_AXIS_Y
# センサ設定
# オンで検知するセンサを接続している場合や、リミットスイッチを接続していない場合はモーターが動作しません
# その場合は以下の関数を実行してセンサ設定を"オンで検知"に変更してください
# result = pmcm.PmcmSetSensorConfig(id, axis, PMCM_LOGIC, 0x3F)

# パルス出力モード設定
# 使用しているドライバに合致したパルス出力モードを選択してください
result = pmcm.PmcmSetPulseConfig(id, axis, PMCM_PULSE_OUT, 7)


# [動作パラメータ設定]
axis = PMCM_AXIS_X + PMCM_AXIS_Y
motion = (MOTIONPMCM * 2)()
# X軸
motion[0].wMoveMode = PMCM_JOG              # 動作モード
motion[0].wStartMode = PMCM_CONST           # 起動モード
motion[0].fSpeedRate = 1                    # 速度倍率
motion[0].wAccDecMode = PMCM_ACC_LINEAR     # 加減速モード
motion[0].fLowSpeed = 1000                  # 起動時速度
motion[0].fSpeed = 1000                     # 移動速度
motion[0].wAccTime = 0                      # 加速時間
motion[0].wDecTime = 0                      # 減速時間
motion[0].fSAccSpeed = 0                    # 加速S字区間
motion[0].fSDecSpeed = 0                    # 減速S字区間
motion[0].lSlowdown = -1                    # スローダウンポイント
motion[0].lStep = PMCM_DIR_CW               # 移動パルス数,移動方向
motion[0].bAbsolutePtp = 0                  # 絶対座標指定
# Y軸
motion[1].wMoveMode = PMCM_JOG              # 動作モード
motion[1].wStartMode = PMCM_CONST           # 起動モード
motion[1].fSpeedRate = 1                    # 速度倍率
motion[1].wAccDecMode = PMCM_ACC_LINEAR     # 加減速モード
motion[1].fLowSpeed = 500                   # 起動時速度
motion[1].fSpeed = 500                      # 移動速度
motion[1].wAccTime = 0                      # 加速時間
motion[1].wDecTime = 0                      # 減速時間
motion[1].fSAccSpeed = 0                    # 加速S字区間
motion[1].fSDecSpeed = 0                    # 減速S字区間
motion[1].lSlowdown = -1                    # スローダウンポイント
motion[1].lStep = PMCM_DIR_CCW              # 移動パルス数,移動方向
motion[1].bAbsolutePtp = 0                  # 絶対座標指定
# 動作パラメータ設定
result = pmcm.PmcmSetMotion(id, axis, ctypes.byref(motion))


# [動作開始]
# 動作させる軸
axis = PMCM_AXIS_X + PMCM_AXIS_Y
# 動作開始
result = pmcm.PmcmStartMotion(id, axis)


# [動作停止]
# 停止させる軸
axis = PMCM_AXIS_X + PMCM_AXIS_Y
# 停止モード
stop_mode = PMCM_IMMEDIATE_STOP
# 動作停止
result = pmcm.PmcmStopMotion(id, axis, stop_mode)


# [クローズ]
result = pmcm.PmcmClose(id)

条件スタート

サンプルプログラムのMotion2と同等の内容です。 サンプルプログラムのMotion2や、ヘルプファイルの[サンプルプログラム]-[Motion2]とあわせてご確認ください。

import sys
import ctypes

# エラーコード(戻り値)
PMCM_RESULT_SUCCESS = 0             # 正常終了

# 軸指定
PMCM_AXIS_X = 0x0001
PMCM_AXIS_Y = 0x0002

# SetMotion(Line),GetMotion(Line)
PMCM_JOG = 0
PMCM_ORG = 1
PMCM_PTP = 2
PMCM_LINE = 3

PMCM_ACC_LINEAR = 0
PMCM_ACC_SCURVE = 1

PMCM_DIR_CW = 1
PMCM_DIR_CCW = -1

PMCM_CONST = 0
PMCM_CONST_DEC = 1
PMCM_ACC_DEC = 2

# StopMotion
PMCM_DEC_STOP = 0
PMCM_IMMEDIATE_STOP = 1

# ChangeSpeed
PMCM_CHG_IMM_LOW_SPEED = 0
PMCM_CHG_IMM_SPEED = 1
PMCM_CHG_DEC_LOW_SPEED = 2
PMCM_CHG_ACC_SPEED = 3
PMCM_CHG_NEW_SPEED = 4

# SetSensorConfig,GetSensorConfig
PMCM_LOGIC = 0
PMCM_EL_FUNC = 1
PMCM_SD_FUNC = 2
PMCM_SD_ACTIVE = 3
PMCM_ORG_FUNC = 4
PMCM_EZ_FUNC = 5
PMCM_EZ_COUNT = 6
PMCM_ALM_FUNC = 7
PMCM_LTC_FUNC = 8
PMCM_PCS_FUNC = 9
PMCM_SENS_FILTER = 10

# SetPulseConfig,GetPulseConfig
PMCM_PULSE_OUT = 0
PMCM_DIR_WAIT = 1
PMCM_FIN_TIMING = 2
PMCM_FH_REVISE = 3

# SetSynchroConfig,GetSynchroConfig
PMCM_SYNC_START_MODE = 0
PMCM_SYNC_START = 1
PMCM_SYNC_SIG_START = 2
PMCM_SYNC_STOP_MODE = 3

# SetSynchroOut,GetSynchroOut
PMCM_SYNC_OUT_MODE = 0

# SetComparatorConfig,GetComparatorConfig
PMCM_COMP_COUNTER = 0
PMCM_COMP_ENCODER = 1

# SetLatchConfig,GetLatchConfig
PMCM_COUNTER_LATCH_LTC = 0
PMCM_COUNTER_LATCH_ORG = 1
PMCM_COUNTER_CLEAR_LATCH = 2
PMCM_ENCODER_LATCH_LTC = 3
PMCM_ENCODER_LATCH_ORG = 4
PMCM_ENCODER_CLEAR_LATCH = 5

# SetEncoderConfig,GetEncoderConfig
PMCM_ENCODER_MODE = 0
PMCM_ENCODER_DIR = 1
PMCM_ENCODER_FILTER = 2

# SetErcConfig,GetErcConfig
PMCM_ERC_LOGIC = 0
PMCM_ERC_AUTOOUT_1 = 1
PMCM_ERC_AUTOOUT_2 = 2
PMCM_ERC_WIDTH = 3
PMCM_ERC_OFF_TIMER = 4
PMCM_ERC_SIG_ON = 5
PMCM_ERC_SIG_OFF = 6

# SetEventMask,GetEventMask
PMCM_EVENT_STOP = 0
PMCM_EVENT_STATE = 1

# PmcmGetStatus
PMCM_BUSY = 0
PMCM_SIG_STATUS = 1

# コンパレータ設定
class COMPPMCM(ctypes.Structure):
    _fields_ = [('wConfig', ctypes.c_ushort),       # 比較条件
                ('lCount', ctypes.c_long)]          # 比較データ

# 動作パラメータ設定(SetMotion,GetMotion)
class MOTIONPMCM(ctypes.Structure):
    _fields_ = [('wMoveMode', ctypes.c_ushort),     # 動作モード
                ('wStartMode', ctypes.c_ushort),    # 起動モード
                ('fSpeedRate', ctypes.c_float),     # 速度倍率
                ('wAccDecMode', ctypes.c_ushort),   # 加減速モード
                ('fLowSpeed', ctypes.c_float),      # 起動速度
                ('fSpeed', ctypes.c_float),         # 移動速度
                ('wAccTime', ctypes.c_ushort),      # 加速時間
                ('wDecTime', ctypes.c_ushort),      # 減速時間
                ('fSAccSpeed', ctypes.c_float),     # 加速S字区間
                ('fSDecSpeed', ctypes.c_float),     # 減速S字区間
                ('lSlowdown', ctypes.c_long),       # スローダウンポイント
                ('lStep', ctypes.c_long),           # 移動パルス数,移動方向
                ('bAbsolutePtp', ctypes.c_long)]    # 絶対座標指定

# 動作パラメータ設定(SetMotionLine,GetMotionLine)
class MOTIONLINEPMCM(ctypes.Structure):
    _fields_ = [('wStartMode', ctypes.c_ushort),    # 起動モード
                ('fSpeedRate', ctypes.c_float),     # 速度倍率
                ('wAccDecMode', ctypes.c_ushort),   # 加減速モード
                ('fLowSpeed', ctypes.c_float),      # 起動速度
                ('fSpeed', ctypes.c_float),         # 移動速度
                ('wAccTime', ctypes.c_ushort),      # 加速時間
                ('wDecTime', ctypes.c_ushort),      # 減速時間
                ('fSAccSpeed', ctypes.c_float),     # 加速S字区間
                ('fSDecSpeed', ctypes.c_float),     # 減速S字区間
                ('lSlowdown', ctypes.c_long),       # スローダウンポイント
                ('lStep', ctypes.c_long * 2),       # 移動パルス数,移動方向
                ('bAbsolute', ctypes.c_long * 2)]   # 絶対座標指定

# イベント要因(SetEvent)
class EVENTFACTORPMCM(ctypes.Structure):
    _fields_ = [('nResult', ctypes.c_int),
                ('wStop', ctypes.c_ushort * 2),     # 停止イベント要因
                ('wState', ctypes.c_ushort * 2)]    # 状態イベント要因

# DLL
pmcm = ctypes.windll.PmcM

# 他軸の停止によるスタートまたは内部同期信号によるスタート
OTHER_AXIS_STOP = 0             # 他軸の停止によるスタート
INTERNAL_SYSNC = 1              # 内部同期信号によるスタート
start_mode = OTHER_AXIS_STOP
# start_mode = INTERNAL_SYSNC

# [オープン]
id = 0
result = pmcm.PmcmOpen(id, b'PMC-M2C-U')
if result != PMCM_RESULT_SUCCESS:
    print('オープンできません')
    sys.exit()


# [各種設定]
axis = PMCM_AXIS_X + PMCM_AXIS_Y
# センサ設定
# オンで検知するセンサを接続している場合や、リミットスイッチを接続していない場合はモーターが動作しません
# その場合は以下の関数を実行してセンサ設定を"オンで検知"に変更してください
# result = pmcm.PmcmSetSensorConfig(id, axis, PMCM_LOGIC, 0x3F)

# パルス出力モード設定
# 使用しているドライバに合致したパルス出力モードを選択してください
result = pmcm.PmcmSetPulseConfig(id, axis, PMCM_PULSE_OUT, 7)

if start_mode == OTHER_AXIS_STOP:
    # 他軸の停止によるスタート
    # Y軸の停止によりX軸がスタートします
    # X軸の起動条件を設定します(他軸の停止によるスタート)
    result = pmcm.PmcmSetSynchroConfig(id, PMCM_AXIS_X,
                                       PMCM_SYNC_START_MODE, 3)

    # X軸の他軸の停止によるスタート条件を設定します(Y軸の停止確認)
    result = pmcm.PmcmSetSynchroConfig(id, PMCM_AXIS_X,
                                       PMCM_SYNC_START, PMCM_AXIS_Y)
else:
    # 内部同期信号によるスタート
    # X軸の出力パルスカウンタが500になったらY軸がスタートします
    # Y軸の起動条件を設定(内部同期信号によるスタート)
    result = pmcm.PmcmSetSynchroConfig(id, PMCM_AXIS_Y,
                                       PMCM_SYNC_START_MODE, 2)

    # Y軸の内部同期信号によるスタート条件の設定(X軸の内部同期信号でスタート)
    result = pmcm.PmcmSetSynchroConfig(id, PMCM_AXIS_Y, PMCM_SYNC_SIG_START, 0)

    # X軸の内部同期信号出力タイミングの設定(出力パルスコンパレータ条件成立時)
    result = pmcm.PmcmSetSynchroOut(id, PMCM_AXIS_X, PMCM_SYNC_OUT_MODE, 1)

    # X軸のコンパレータの設定
    comp = (COMPPMCM * 2)()
    comp[0].wConfig = 1
    comp[0].lCount = 500
    result = pmcm.PmcmSetComparatorConfig(id, PMCM_AXIS_X,
                                          PMCM_COMP_COUNTER, comp)


# [動作パラメータ設定]
axis = PMCM_AXIS_X + PMCM_AXIS_Y
motion = (MOTIONPMCM * 2)()
# X軸
motion[0].wMoveMode = PMCM_PTP              # 動作モード
motion[0].wStartMode = PMCM_CONST           # 起動モード
motion[0].fSpeedRate = 1                    # 速度倍率
motion[0].wAccDecMode = PMCM_ACC_LINEAR     # 加減速モード
motion[0].fLowSpeed = 500                   # 起動時速度
motion[0].fSpeed = 500                      # 移動速度
motion[0].wAccTime = 0                      # 加速時間
motion[0].wDecTime = 0                      # 減速時間
motion[0].fSAccSpeed = 0                    # 加速S字区間
motion[0].fSDecSpeed = 0                    # 減速S字区間
motion[0].lSlowdown = -1                    # スローダウンポイント
motion[0].lStep = 1000                      # 移動パルス数,移動方向
motion[0].bAbsolutePtp = 0                  # 絶対座標指定
# Y軸
motion[1].wMoveMode = PMCM_PTP              # 動作モード
motion[1].wStartMode = PMCM_CONST           # 起動モード
motion[1].fSpeedRate = 1                    # 速度倍率
motion[1].wAccDecMode = PMCM_ACC_LINEAR     # 加減速モード
motion[1].fLowSpeed = 1000                  # 起動時速度
motion[1].fSpeed = 1000                     # 移動速度
motion[1].wAccTime = 0                      # 加速時間
motion[1].wDecTime = 0                      # 減速時間
motion[1].fSAccSpeed = 0                    # 加速S字区間
motion[1].fSDecSpeed = 0                    # 減速S字区間
motion[1].lSlowdown = -1                    # スローダウンポイント
motion[1].lStep = 1000                      # 移動パルス数,移動方向
motion[1].bAbsolutePtp = 0                  # 絶対座標指定
# 動作パラメータ設定
result = pmcm.PmcmSetMotion(id, axis, ctypes.byref(motion))


# [動作開始]
if start_mode == OTHER_AXIS_STOP:
    # 他軸の停止によるスタート
    # X軸はY軸の停止を確認して動作しますので、Y軸を先に動作させます
    # 同時に動作させてしまうと、その時点でY軸がまだ動作開始前で停止中のため、X軸が動作してしまいます
    # Y軸動作開始
    result = pmcm.PmcmStartMotion(id, PMCM_AXIS_Y)
    # X軸動作開始
    result = pmcm.PmcmStartMotion(id, PMCM_AXIS_X)
else:
    # 内部同期信号によるスタート
    # 動作開始
    axis = PMCM_AXIS_X + PMCM_AXIS_Y
    result = pmcm.PmcmStartMotion(id, axis)


# [動作停止]
# 停止させる軸
axis = PMCM_AXIS_X + PMCM_AXIS_Y
# 停止モード
stop_mode = PMCM_IMMEDIATE_STOP
# 動作停止(すでに停止している場合、実行する必要はありません)
result = pmcm.PmcmStopMotion(id, axis, stop_mode)


# [クローズ]
result = pmcm.PmcmClose(id)

直線補間動作

サンプルプログラムのMotionLineと同等の内容です。 サンプルプログラムのMotionLineや、ヘルプファイルの[サンプルプログラム]-[MotionLine]とあわせてご確認ください。

import sys
import ctypes

# エラーコード(戻り値)
PMCM_RESULT_SUCCESS = 0             # 正常終了

# 軸指定
PMCM_AXIS_X = 0x0001
PMCM_AXIS_Y = 0x0002

# SetMotion(Line),GetMotion(Line)
PMCM_JOG = 0
PMCM_ORG = 1
PMCM_PTP = 2
PMCM_LINE = 3

PMCM_ACC_LINEAR = 0
PMCM_ACC_SCURVE = 1

PMCM_DIR_CW = 1
PMCM_DIR_CCW = -1

PMCM_CONST = 0
PMCM_CONST_DEC = 1
PMCM_ACC_DEC = 2

# StopMotion
PMCM_DEC_STOP = 0
PMCM_IMMEDIATE_STOP = 1

# ChangeSpeed
PMCM_CHG_IMM_LOW_SPEED = 0
PMCM_CHG_IMM_SPEED = 1
PMCM_CHG_DEC_LOW_SPEED = 2
PMCM_CHG_ACC_SPEED = 3
PMCM_CHG_NEW_SPEED = 4

# SetSensorConfig,GetSensorConfig
PMCM_LOGIC = 0
PMCM_EL_FUNC = 1
PMCM_SD_FUNC = 2
PMCM_SD_ACTIVE = 3
PMCM_ORG_FUNC = 4
PMCM_EZ_FUNC = 5
PMCM_EZ_COUNT = 6
PMCM_ALM_FUNC = 7
PMCM_LTC_FUNC = 8
PMCM_PCS_FUNC = 9
PMCM_SENS_FILTER = 10

# SetPulseConfig,GetPulseConfig
PMCM_PULSE_OUT = 0
PMCM_DIR_WAIT = 1
PMCM_FIN_TIMING = 2
PMCM_FH_REVISE = 3

# SetSynchroConfig,GetSynchroConfig
PMCM_SYNC_START_MODE = 0
PMCM_SYNC_START = 1
PMCM_SYNC_SIG_START = 2
PMCM_SYNC_STOP_MODE = 3

# SetSynchroOut,GetSynchroOut
PMCM_SYNC_OUT_MODE = 0

# SetComparatorConfig,GetComparatorConfig
PMCM_COMP_COUNTER = 0
PMCM_COMP_ENCODER = 1

# SetLatchConfig,GetLatchConfig
PMCM_COUNTER_LATCH_LTC = 0
PMCM_COUNTER_LATCH_ORG = 1
PMCM_COUNTER_CLEAR_LATCH = 2
PMCM_ENCODER_LATCH_LTC = 3
PMCM_ENCODER_LATCH_ORG = 4
PMCM_ENCODER_CLEAR_LATCH = 5

# SetEncoderConfig,GetEncoderConfig
PMCM_ENCODER_MODE = 0
PMCM_ENCODER_DIR = 1
PMCM_ENCODER_FILTER = 2

# SetErcConfig,GetErcConfig
PMCM_ERC_LOGIC = 0
PMCM_ERC_AUTOOUT_1 = 1
PMCM_ERC_AUTOOUT_2 = 2
PMCM_ERC_WIDTH = 3
PMCM_ERC_OFF_TIMER = 4
PMCM_ERC_SIG_ON = 5
PMCM_ERC_SIG_OFF = 6

# SetEventMask,GetEventMask
PMCM_EVENT_STOP = 0
PMCM_EVENT_STATE = 1

# PmcmGetStatus
PMCM_BUSY = 0
PMCM_SIG_STATUS = 1

# コンパレータ設定
class COMPPMCM(ctypes.Structure):
    _fields_ = [('wConfig', ctypes.c_ushort),       # 比較条件
                ('lCount', ctypes.c_long)]          # 比較データ

# 動作パラメータ設定(SetMotion,GetMotion)
class MOTIONPMCM(ctypes.Structure):
    _fields_ = [('wMoveMode', ctypes.c_ushort),     # 動作モード
                ('wStartMode', ctypes.c_ushort),    # 起動モード
                ('fSpeedRate', ctypes.c_float),     # 速度倍率
                ('wAccDecMode', ctypes.c_ushort),   # 加減速モード
                ('fLowSpeed', ctypes.c_float),      # 起動速度
                ('fSpeed', ctypes.c_float),         # 移動速度
                ('wAccTime', ctypes.c_ushort),      # 加速時間
                ('wDecTime', ctypes.c_ushort),      # 減速時間
                ('fSAccSpeed', ctypes.c_float),     # 加速S字区間
                ('fSDecSpeed', ctypes.c_float),     # 減速S字区間
                ('lSlowdown', ctypes.c_long),       # スローダウンポイント
                ('lStep', ctypes.c_long),           # 移動パルス数,移動方向
                ('bAbsolutePtp', ctypes.c_long)]    # 絶対座標指定

# 動作パラメータ設定(SetMotionLine,GetMotionLine)
class MOTIONLINEPMCM(ctypes.Structure):
    _fields_ = [('wStartMode', ctypes.c_ushort),    # 起動モード
                ('fSpeedRate', ctypes.c_float),     # 速度倍率
                ('wAccDecMode', ctypes.c_ushort),   # 加減速モード
                ('fLowSpeed', ctypes.c_float),      # 起動速度
                ('fSpeed', ctypes.c_float),         # 移動速度
                ('wAccTime', ctypes.c_ushort),      # 加速時間
                ('wDecTime', ctypes.c_ushort),      # 減速時間
                ('fSAccSpeed', ctypes.c_float),     # 加速S字区間
                ('fSDecSpeed', ctypes.c_float),     # 減速S字区間
                ('lSlowdown', ctypes.c_long),       # スローダウンポイント
                ('lStep', ctypes.c_long * 2),       # 移動パルス数,移動方向
                ('bAbsolute', ctypes.c_long * 2)]   # 絶対座標指定

# イベント要因(SetEvent)
class EVENTFACTORPMCM(ctypes.Structure):
    _fields_ = [('nResult', ctypes.c_int),
                ('wStop', ctypes.c_ushort * 2),     # 停止イベント要因
                ('wState', ctypes.c_ushort * 2)]    # 状態イベント要因

# DLL
pmcm = ctypes.windll.PmcM

# [オープン]
id = 0
result = pmcm.PmcmOpen(id, b'PMC-M2C-U')
if result != PMCM_RESULT_SUCCESS:
    print('オープンできません')
    sys.exit()


# [各種設定]
axis = PMCM_AXIS_X + PMCM_AXIS_Y
# センサ設定
# オンで検知するセンサを接続している場合や、リミットスイッチを接続していない場合はモーターが動作しません
# その場合は以下の関数を実行してセンサ設定を"オンで検知"に変更してください
# result = pmcm.PmcmSetSensorConfig(id, axis, PMCM_LOGIC, 0x3F)

# パルス出力モード設定
# 使用しているドライバに合致したパルス出力モードを選択してください
result = pmcm.PmcmSetPulseConfig(id, axis, PMCM_PULSE_OUT, 7)


# [動作パラメータ設定]
axis = PMCM_AXIS_X + PMCM_AXIS_Y
motion_line = MOTIONLINEPMCM()
motion_line.wStartMode = PMCM_CONST         # 起動モード
motion_line.fSpeedRate = 1                  # 速度倍率
motion_line.wAccDecMode = PMCM_ACC_LINEAR   # 加減速モード
motion_line.fLowSpeed = 1000                # 起動時速度
motion_line.fSpeed = 1000                   # 移動速度
motion_line.wAccTime = 0                    # 加速時間
motion_line.wDecTime = 0                    # 減速時間
motion_line.fSAccSpeed = 0                  # 加速S字区間
motion_line.fSDecSpeed = 0                  # 減速S字区間
motion_line.lSlowdown = -1                  # スローダウンポイント
motion_line.lStep[0] = 500                  # 移動パルス数,移動方向
motion_line.lStep[1] = 1000                 # 移動パルス数,移動方向
motion_line.bAbsolute[0] = 0                # 絶対座標指定
motion_line.bAbsolute[1] = 0                # 絶対座標指定
# 動作パラメータ設定
result = pmcm.PmcmSetMotionLine(id, axis, ctypes.byref(motion_line))


# [動作開始]
result = pmcm.PmcmStartMotionLine(id)


# [動作停止]
# 停止させる軸
axis = PMCM_AXIS_X + PMCM_AXIS_Y
# 停止モード
stop_mode = PMCM_IMMEDIATE_STOP
# 動作停止(すでに停止している場合、実行する必要はありません)
result = pmcm.PmcmStopMotion(id, axis, stop_mode)


# [クローズ]
result = pmcm.PmcmClose(id)

CP動作

サンプルプログラムのMotionCPと同等の内容です。 サンプルプログラムのMotionCPや、ヘルプファイルの[サンプルプログラム]-[MotionCP]とあわせてご確認ください。

import sys
import ctypes

# エラーコード(戻り値)
PMCM_RESULT_SUCCESS = 0             # 正常終了

# 軸指定
PMCM_AXIS_X = 0x0001
PMCM_AXIS_Y = 0x0002

# SetMotion(Line),GetMotion(Line)
PMCM_JOG = 0
PMCM_ORG = 1
PMCM_PTP = 2
PMCM_LINE = 3

PMCM_ACC_LINEAR = 0
PMCM_ACC_SCURVE = 1

PMCM_DIR_CW = 1
PMCM_DIR_CCW = -1

PMCM_CONST = 0
PMCM_CONST_DEC = 1
PMCM_ACC_DEC = 2

# StopMotion
PMCM_DEC_STOP = 0
PMCM_IMMEDIATE_STOP = 1

# ChangeSpeed
PMCM_CHG_IMM_LOW_SPEED = 0
PMCM_CHG_IMM_SPEED = 1
PMCM_CHG_DEC_LOW_SPEED = 2
PMCM_CHG_ACC_SPEED = 3
PMCM_CHG_NEW_SPEED = 4

# SetSensorConfig,GetSensorConfig
PMCM_LOGIC = 0
PMCM_EL_FUNC = 1
PMCM_SD_FUNC = 2
PMCM_SD_ACTIVE = 3
PMCM_ORG_FUNC = 4
PMCM_EZ_FUNC = 5
PMCM_EZ_COUNT = 6
PMCM_ALM_FUNC = 7
PMCM_LTC_FUNC = 8
PMCM_PCS_FUNC = 9
PMCM_SENS_FILTER = 10

# SetPulseConfig,GetPulseConfig
PMCM_PULSE_OUT = 0
PMCM_DIR_WAIT = 1
PMCM_FIN_TIMING = 2
PMCM_FH_REVISE = 3

# SetSynchroConfig,GetSynchroConfig
PMCM_SYNC_START_MODE = 0
PMCM_SYNC_START = 1
PMCM_SYNC_SIG_START = 2
PMCM_SYNC_STOP_MODE = 3

# SetSynchroOut,GetSynchroOut
PMCM_SYNC_OUT_MODE = 0

# SetComparatorConfig,GetComparatorConfig
PMCM_COMP_COUNTER = 0
PMCM_COMP_ENCODER = 1

# SetLatchConfig,GetLatchConfig
PMCM_COUNTER_LATCH_LTC = 0
PMCM_COUNTER_LATCH_ORG = 1
PMCM_COUNTER_CLEAR_LATCH = 2
PMCM_ENCODER_LATCH_LTC = 3
PMCM_ENCODER_LATCH_ORG = 4
PMCM_ENCODER_CLEAR_LATCH = 5

# SetEncoderConfig,GetEncoderConfig
PMCM_ENCODER_MODE = 0
PMCM_ENCODER_DIR = 1
PMCM_ENCODER_FILTER = 2

# SetErcConfig,GetErcConfig
PMCM_ERC_LOGIC = 0
PMCM_ERC_AUTOOUT_1 = 1
PMCM_ERC_AUTOOUT_2 = 2
PMCM_ERC_WIDTH = 3
PMCM_ERC_OFF_TIMER = 4
PMCM_ERC_SIG_ON = 5
PMCM_ERC_SIG_OFF = 6

# SetEventMask,GetEventMask
PMCM_EVENT_STOP = 0
PMCM_EVENT_STATE = 1

# PmcmGetStatus
PMCM_BUSY = 0
PMCM_SIG_STATUS = 1

# コンパレータ設定
class COMPPMCM(ctypes.Structure):
    _fields_ = [('wConfig', ctypes.c_ushort),       # 比較条件
                ('lCount', ctypes.c_long)]          # 比較データ

# 動作パラメータ設定(SetMotion,GetMotion)
class MOTIONPMCM(ctypes.Structure):
    _fields_ = [('wMoveMode', ctypes.c_ushort),     # 動作モード
                ('wStartMode', ctypes.c_ushort),    # 起動モード
                ('fSpeedRate', ctypes.c_float),     # 速度倍率
                ('wAccDecMode', ctypes.c_ushort),   # 加減速モード
                ('fLowSpeed', ctypes.c_float),      # 起動速度
                ('fSpeed', ctypes.c_float),         # 移動速度
                ('wAccTime', ctypes.c_ushort),      # 加速時間
                ('wDecTime', ctypes.c_ushort),      # 減速時間
                ('fSAccSpeed', ctypes.c_float),     # 加速S字区間
                ('fSDecSpeed', ctypes.c_float),     # 減速S字区間
                ('lSlowdown', ctypes.c_long),       # スローダウンポイント
                ('lStep', ctypes.c_long),           # 移動パルス数,移動方向
                ('bAbsolutePtp', ctypes.c_long)]    # 絶対座標指定

# 動作パラメータ設定(SetMotionLine,GetMotionLine)
class MOTIONLINEPMCM(ctypes.Structure):
    _fields_ = [('wStartMode', ctypes.c_ushort),    # 起動モード
                ('fSpeedRate', ctypes.c_float),     # 速度倍率
                ('wAccDecMode', ctypes.c_ushort),   # 加減速モード
                ('fLowSpeed', ctypes.c_float),      # 起動速度
                ('fSpeed', ctypes.c_float),         # 移動速度
                ('wAccTime', ctypes.c_ushort),      # 加速時間
                ('wDecTime', ctypes.c_ushort),      # 減速時間
                ('fSAccSpeed', ctypes.c_float),     # 加速S字区間
                ('fSDecSpeed', ctypes.c_float),     # 減速S字区間
                ('lSlowdown', ctypes.c_long),       # スローダウンポイント
                ('lStep', ctypes.c_long * 2),       # 移動パルス数,移動方向
                ('bAbsolute', ctypes.c_long * 2)]   # 絶対座標指定

# イベント要因(SetEvent)
class EVENTFACTORPMCM(ctypes.Structure):
    _fields_ = [('nResult', ctypes.c_int),
                ('wStop', ctypes.c_ushort * 2),     # 停止イベント要因
                ('wState', ctypes.c_ushort * 2)]    # 状態イベント要因

# DLL
pmcm = ctypes.windll.PmcM

# [オープン]
id = 0
result = pmcm.PmcmOpen(id, b'PMC-M2C-U')
if result != PMCM_RESULT_SUCCESS:
    print('オープンできません')
    sys.exit()


# [各種設定]
axis = PMCM_AXIS_X + PMCM_AXIS_Y
# センサ設定
# オンで検知するセンサを接続している場合や、リミットスイッチを接続していない場合はモーターが動作しません
# その場合は以下の関数を実行してセンサ設定を"オンで検知"に変更してください
# result = pmcm.PmcmSetSensorConfig(id, axis, PMCM_LOGIC, 0x3F)

# パルス出力モード設定
# 使用しているドライバに合致したパルス出力モードを選択してください
result = pmcm.PmcmSetPulseConfig(id, axis, PMCM_PULSE_OUT, 7)


# [動作パラメータ設定]
axis = PMCM_AXIS_X
# CP動作パラメータ数
count = 3
motion = (MOTIONPMCM * count)()
# 1回目
motion[0].wMoveMode = PMCM_PTP              # 動作モード
motion[0].wStartMode = PMCM_ACC_DEC         # 起動モード
motion[0].fSpeedRate = 1                    # 速度倍率
motion[0].wAccDecMode = PMCM_ACC_LINEAR     # 加減速モード
motion[0].fLowSpeed = 100                   # 起動時速度
motion[0].fSpeed = 500                      # 移動速度
motion[0].wAccTime = 500                    # 加速時間
motion[0].wDecTime = 500                    # 減速時間
motion[0].fSAccSpeed = 0                    # 加速S字区間
motion[0].fSDecSpeed = 0                    # 減速S字区間
motion[0].lSlowdown = 0                     # スローダウンポイント
motion[0].lStep = 1000                      # 移動パルス数,移動方向
motion[0].bAbsolutePtp = 0                  # 絶対座標指定
# 2回目
motion[1].wMoveMode = PMCM_PTP              # 動作モード
motion[1].wStartMode = PMCM_ACC_DEC         # 起動モード
motion[1].fSpeedRate = 1                    # 速度倍率
motion[1].wAccDecMode = PMCM_ACC_LINEAR     # 加減速モード
motion[1].fLowSpeed = 500                   # 起動時速度
motion[1].fSpeed = 1000                     # 移動速度
motion[1].wAccTime = 500                    # 加速時間
motion[1].wDecTime = 500                    # 減速時間
motion[1].fSAccSpeed = 0                    # 加速S字区間
motion[1].fSDecSpeed = 0                    # 減速S字区間
motion[1].lSlowdown = -1                    # スローダウンポイント
motion[1].lStep = 2000                      # 移動パルス数,移動方向
motion[1].bAbsolutePtp = 0                  # 絶対座標指定
# 3回目
motion[2].wMoveMode = PMCM_PTP              # 動作モード
motion[2].wStartMode = PMCM_CONST_DEC       # 起動モード
motion[2].fSpeedRate = 1                    # 速度倍率
motion[2].wAccDecMode = PMCM_ACC_LINEAR     # 加減速モード
motion[2].fLowSpeed = 100                   # 起動時速度
motion[2].fSpeed = 500                      # 移動速度
motion[2].wAccTime = 0                      # 加速時間
motion[2].wDecTime = 500                    # 減速時間
motion[2].fSAccSpeed = 0                    # 加速S字区間
motion[2].fSDecSpeed = 0                    # 減速S字区間
motion[2].lSlowdown = -1                    # スローダウンポイント
motion[2].lStep = 1500                      # 移動パルス数,移動方向
motion[2].bAbsolutePtp = 0                  # 絶対座標指定
# CPの空き取得
empty = (ctypes.c_ushort * 2)()
result = pmcm.PmcmGetEmptyCp(id, axis, ctypes.byref(empty))
# CPの空き確認
if empty[0] >= count:   # 空きあり
    result = pmcm.PmcmSetMotionCp(id, axis, ctypes.byref(motion), count)


# [動作開始]
# 動作させる軸
axis = PMCM_AXIS_X
# 動作開始
result = pmcm.PmcmStartMotionCp(id, axis)


# [動作追加]
# CP動作は96動作までしか設定できません
# それ以上の動作を設定したい場合は、動作中にCPの空きを確認し、空き数分の動作を開始します
axis = PMCM_AXIS_X
# CP動作パラメータ数
count = 100
motion = (MOTIONPMCM * count)()
for m in motion:
    m.wMoveMode = PMCM_PTP              # 動作モード
    m.wStartMode = PMCM_CONST           # 起動モード
    m.fSpeedRate = 1                    # 速度倍率
    m.wAccDecMode = PMCM_ACC_LINEAR     # 加減速モード
    m.fLowSpeed = 1000                  # 起動時速度
    m.fSpeed = 1000                     # 移動速度
    m.wAccTime = 0                      # 加速時間
    m.wDecTime = 0                      # 減速時間
    m.fSAccSpeed = 0                    # 加速S字区間
    m.fSDecSpeed = 0                    # 減速S字区間
    m.lSlowdown = -1                    # スローダウンポイント
    m.lStep = 1000                      # 移動パルス数,移動方向
    m.bAbsolutePtp = 0                  # 絶対座標指定

# 残り動作数
remain_count = count
empty = (ctypes.c_ushort * 2)()
while remain_count > 0:
    # CPの空き取得
    result = pmcm.PmcmGetEmptyCp(id, axis, ctypes.byref(empty))
    # CPの空きを確認し、設定動作数を決定する
    if empty[0] == 0:                           # CP空きなし
        set_count = 0
    elif empty[0] < remain_count:               # CP空き < 残り動作数
        set_count = empty[0]                    # CP空き分だけ設定する
    elif empty[0] >= remain_count:              # CP空き >= 残り動作数
        set_count = remain_count                # 残り動作数を設定する
    if set_count > 0:
        # 動作パラメータ設定
        result = pmcm.PmcmSetMotionCp(id, axis, 
                                      ctypes.byref(
                                          motion[count - remain_count]),
                                      set_count)
        # 動作開始
        result = pmcm.PmcmStartMotionCp(id, axis)
    # 残り動作数更新
    remain_count -= set_count


# [動作停止]
# 停止させる軸
axis = PMCM_AXIS_X
# 停止モード
stop_mode = PMCM_IMMEDIATE_STOP
# 動作停止(すでに停止している場合、実行する必要はありません)
result = pmcm.PmcmStopMotion(id, axis, stop_mode)


# [クローズ]
result = pmcm.PmcmClose(id)

イベント発生

サンプルプログラムのEventと同等の内容です。 サンプルプログラムのEventや、ヘルプファイルの[サンプルプログラム]-[Event]とあわせてご確認ください。

import sys
import ctypes

# エラーコード(戻り値)
PMCM_RESULT_SUCCESS = 0             # 正常終了

# 軸指定
PMCM_AXIS_X = 0x0001
PMCM_AXIS_Y = 0x0002

# SetMotion(Line),GetMotion(Line)
PMCM_JOG = 0
PMCM_ORG = 1
PMCM_PTP = 2
PMCM_LINE = 3

PMCM_ACC_LINEAR = 0
PMCM_ACC_SCURVE = 1

PMCM_DIR_CW = 1
PMCM_DIR_CCW = -1

PMCM_CONST = 0
PMCM_CONST_DEC = 1
PMCM_ACC_DEC = 2

# StopMotion
PMCM_DEC_STOP = 0
PMCM_IMMEDIATE_STOP = 1

# ChangeSpeed
PMCM_CHG_IMM_LOW_SPEED = 0
PMCM_CHG_IMM_SPEED = 1
PMCM_CHG_DEC_LOW_SPEED = 2
PMCM_CHG_ACC_SPEED = 3
PMCM_CHG_NEW_SPEED = 4

# SetSensorConfig,GetSensorConfig
PMCM_LOGIC = 0
PMCM_EL_FUNC = 1
PMCM_SD_FUNC = 2
PMCM_SD_ACTIVE = 3
PMCM_ORG_FUNC = 4
PMCM_EZ_FUNC = 5
PMCM_EZ_COUNT = 6
PMCM_ALM_FUNC = 7
PMCM_LTC_FUNC = 8
PMCM_PCS_FUNC = 9
PMCM_SENS_FILTER = 10

# SetPulseConfig,GetPulseConfig
PMCM_PULSE_OUT = 0
PMCM_DIR_WAIT = 1
PMCM_FIN_TIMING = 2
PMCM_FH_REVISE = 3

# SetSynchroConfig,GetSynchroConfig
PMCM_SYNC_START_MODE = 0
PMCM_SYNC_START = 1
PMCM_SYNC_SIG_START = 2
PMCM_SYNC_STOP_MODE = 3

# SetSynchroOut,GetSynchroOut
PMCM_SYNC_OUT_MODE = 0

# SetComparatorConfig,GetComparatorConfig
PMCM_COMP_COUNTER = 0
PMCM_COMP_ENCODER = 1

# SetLatchConfig,GetLatchConfig
PMCM_COUNTER_LATCH_LTC = 0
PMCM_COUNTER_LATCH_ORG = 1
PMCM_COUNTER_CLEAR_LATCH = 2
PMCM_ENCODER_LATCH_LTC = 3
PMCM_ENCODER_LATCH_ORG = 4
PMCM_ENCODER_CLEAR_LATCH = 5

# SetEncoderConfig,GetEncoderConfig
PMCM_ENCODER_MODE = 0
PMCM_ENCODER_DIR = 1
PMCM_ENCODER_FILTER = 2

# SetErcConfig,GetErcConfig
PMCM_ERC_LOGIC = 0
PMCM_ERC_AUTOOUT_1 = 1
PMCM_ERC_AUTOOUT_2 = 2
PMCM_ERC_WIDTH = 3
PMCM_ERC_OFF_TIMER = 4
PMCM_ERC_SIG_ON = 5
PMCM_ERC_SIG_OFF = 6

# SetEventMask,GetEventMask
PMCM_EVENT_STOP = 0
PMCM_EVENT_STATE = 1

# PmcmGetStatus
PMCM_BUSY = 0
PMCM_SIG_STATUS = 1

# コンパレータ設定
class COMPPMCM(ctypes.Structure):
    _fields_ = [('wConfig', ctypes.c_ushort),       # 比較条件
                ('lCount', ctypes.c_long)]          # 比較データ

# 動作パラメータ設定(SetMotion,GetMotion)
class MOTIONPMCM(ctypes.Structure):
    _fields_ = [('wMoveMode', ctypes.c_ushort),     # 動作モード
                ('wStartMode', ctypes.c_ushort),    # 起動モード
                ('fSpeedRate', ctypes.c_float),     # 速度倍率
                ('wAccDecMode', ctypes.c_ushort),   # 加減速モード
                ('fLowSpeed', ctypes.c_float),      # 起動速度
                ('fSpeed', ctypes.c_float),         # 移動速度
                ('wAccTime', ctypes.c_ushort),      # 加速時間
                ('wDecTime', ctypes.c_ushort),      # 減速時間
                ('fSAccSpeed', ctypes.c_float),     # 加速S字区間
                ('fSDecSpeed', ctypes.c_float),     # 減速S字区間
                ('lSlowdown', ctypes.c_long),       # スローダウンポイント
                ('lStep', ctypes.c_long),           # 移動パルス数,移動方向
                ('bAbsolutePtp', ctypes.c_long)]    # 絶対座標指定

# 動作パラメータ設定(SetMotionLine,GetMotionLine)
class MOTIONLINEPMCM(ctypes.Structure):
    _fields_ = [('wStartMode', ctypes.c_ushort),    # 起動モード
                ('fSpeedRate', ctypes.c_float),     # 速度倍率
                ('wAccDecMode', ctypes.c_ushort),   # 加減速モード
                ('fLowSpeed', ctypes.c_float),      # 起動速度
                ('fSpeed', ctypes.c_float),         # 移動速度
                ('wAccTime', ctypes.c_ushort),      # 加速時間
                ('wDecTime', ctypes.c_ushort),      # 減速時間
                ('fSAccSpeed', ctypes.c_float),     # 加速S字区間
                ('fSDecSpeed', ctypes.c_float),     # 減速S字区間
                ('lSlowdown', ctypes.c_long),       # スローダウンポイント
                ('lStep', ctypes.c_long * 2),       # 移動パルス数,移動方向
                ('bAbsolute', ctypes.c_long * 2)]   # 絶対座標指定

# イベント要因(SetEvent)
class EVENTFACTORPMCM(ctypes.Structure):
    _fields_ = [('nResult', ctypes.c_int),
                ('wStop', ctypes.c_ushort * 2),     # 停止イベント要因
                ('wState', ctypes.c_ushort * 2)]    # 状態イベント要因

# DLL
pmcm = ctypes.windll.PmcM
kernel32 = ctypes.windll.Kernel32

# [オープン]
id = 0
result = pmcm.PmcmOpen(id, b'PMC-M2C-U')
if result != PMCM_RESULT_SUCCESS:
    print('オープンできません')
    sys.exit()


# [各種設定]
axis = PMCM_AXIS_X + PMCM_AXIS_Y
# センサ設定
# オンで検知するセンサを接続している場合や、リミットスイッチを接続していない場合はモーターが動作しません
# その場合は以下の関数を実行してセンサ設定を"オンで検知"に変更してください
# result = pmcm.PmcmSetSensorConfig(id, axis, PMCM_LOGIC, 0x3F)

# パルス出力モード設定
# 使用しているドライバに合致したパルス出力モードを選択してください
result = pmcm.PmcmSetPulseConfig(id, axis, PMCM_PULSE_OUT, 7)

# イベントマスク設定
# 自動停止時のイベント発生を許可に設定します
result = pmcm.PmcmSetEventMask(id, axis, PMCM_EVENT_STOP, 0x01)
# イベントオブジェクト作成
event_handle = kernel32.CreateEventA(None, 1, 0, None)
# イベント設定
result = pmcm.PmcmSetEvent(id, event_handle)


# [動作パラメータ設定]
axis = PMCM_AXIS_X
motion = (MOTIONPMCM * 2)()
# X軸
motion[0].wMoveMode = PMCM_PTP              # 動作モード
motion[0].wStartMode = PMCM_CONST           # 起動モード
motion[0].fSpeedRate = 1                    # 速度倍率
motion[0].wAccDecMode = PMCM_ACC_LINEAR     # 加減速モード
motion[0].fLowSpeed = 1000                  # 起動時速度
motion[0].fSpeed = 1000                     # 移動速度
motion[0].wAccTime = 0                      # 加速時間
motion[0].wDecTime = 0                      # 減速時間
motion[0].fSAccSpeed = 0                    # 加速S字区間
motion[0].fSDecSpeed = 0                    # 減速S字区間
motion[0].lSlowdown = -1                    # スローダウンポイント
motion[0].lStep = 10000                     # 移動パルス数,移動方向
motion[0].bAbsolutePtp = 0                  # 絶対座標指定
# 動作パラメータ設定
result = pmcm.PmcmSetMotion(id, axis, ctypes.byref(motion))


# [動作開始]
# 動作させる軸
axis = PMCM_AXIS_X
# 動作開始
result = pmcm.PmcmStartMotion(id, axis)


# [イベント待ち]
event_factor = EVENTFACTORPMCM()
# イベント発生待ち
kernel32.WaitForSingleObject(event_handle, 0xFFFFFFFF)
# イベントクリア
kernel32.ResetEvent(event_handle)

# イベント要因取得
result = pmcm.PmcmGetEventFactor(id, ctypes.byref(event_factor))
if event_factor.nResult == 0:
    print("停止イベント要因: H'{:X}".format(event_factor.wStop[0]))
    print("状態イベント要因: H'{:X}".format(event_factor.wState[0]))


# [クローズ]
kernel32.CloseHandle(event_handle)
event_handle = None
result = pmcm.PmcmClose(id)

API使用例
PmcmSetSensorConfig
# X軸とY軸のPCS,INP,ALM,ORG,SD,-EL,+ELを「オンで検知」に設定します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
result = pmcm.PmcmSetSensorConfig(id, axis, PMCM_LOGIC, 0x3F)
PmcmGetSensorConfig
# X軸のセンサ極性設定を取得します。
axis = PMCM_AXIS_X
config = ctypes.c_ushort()
result = pmcm.PmcmGetSensorConfig(id, axis, PMCM_LOGIC, ctypes.byref(config))
PmcmSetPulseConfig
# X軸とY軸のパルス出力モードを0に設定します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
result = pmcm.PmcmSetPulseConfig(id, axis, PMCM_PULSE_OUT, 0)
PmcmGetPulseConfig
# X軸のパルス出力モードを取得します。
axis = PMCM_AXIS_X
config = ctypes.c_ushort()
result = pmcm.PmcmGetPulseConfig(id, axis,
                                 PMCM_PULSE_OUT, ctypes.byref(config))
PmcmSetSynchroConfig
# X軸とY軸の起動条件を即スタートに設定します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
result = pmcm.PmcmSetSynchroConfig(id, axis, PMCM_SYNC_START_MODE, 0)
PmcmGetSynchroConfig
# X軸の起動条件を取得します。
axis = PMCM_AXIS_X
config = ctypes.c_ushort()
result = pmcm.PmcmGetSynchroConfig(id, axis,
                                   PMCM_SYNC_START_MODE, ctypes.byref(config))
PmcmSetSynchroOut
# X軸とY軸の内部同期信号出力タイミングを出力なしに設定します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
result = pmcm.PmcmSetSynchroOut(id, axis, PMCM_SYNC_OUT_MODE, 0)
PmcmGetSynchroOut
# X軸内部同期信号出力タイミングを取得します。
axis = PMCM_AXIS_X
config = ctypes.c_ushort()
result = pmcm.PmcmGetSynchroOut(id, axis,
                                PMCM_SYNC_OUT_MODE, ctypes.byref(config))
PmcmSetComparatorConfig
# X軸の出力パルスコンパレータをOFFに設定します。
axis = PMCM_AXIS_X
comp = (COMPPMCM * 2)()
comp[0].wConfig = 0
comp[0].lCount = 0
result = pmcm.PmcmSetComparatorConfig(id, axis,
                                      PMCM_COMP_COUNTER, ctypes.byref(comp))
PmcmGetComparatorConfig
# X軸の出力パルスコンパレータ設定を取得します。
axis = PMCM_AXIS_X
comp = (COMPPMCM * 2)()
result = pmcm.PmcmGetComparatorConfig(id, axis,
                                      PMCM_COMP_COUNTER, ctypes.byref(comp))
PmcmSetLatchConfig
# X軸とY軸のLTC信号によるラッチ(出力パルスカウンタ)をなしに設定します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
result = pmcm.PmcmSetLatchConfig(id, axis, PMCM_COUNTER_LATCH_LTC, 0)
PmcmGetLatchConfig
# X軸のLTC信号によるラッチ(出力パルスカウンタ)を取得します。
axis = PMCM_AXIS_X
config = ctypes.c_ushort()
result = pmcm.PmcmGetLatchConfig(id, axis,
                                 PMCM_COUNTER_LATCH_LTC, ctypes.byref(config))
PmcmSetEncoderConfig
# X軸とY軸のエンコーダ入力モードをアップ・ダウンの2パルス入力に設定します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
result = pmcm.PmcmSetEncoderConfig(id, axis, PMCM_ENCODER_MODE, 3)
PmcmGetEncoderConfig
# X軸のエンコーダ入力モードを取得します。
axis = PMCM_AXIS_X
config = ctypes.c_ushort()
result = pmcm.PmcmGetEncoderConfig(id, axis,
                                   PMCM_ENCODER_MODE, ctypes.byref(config))
PmcmSetErcConfig
# X軸とY軸の出力論理を負論理に設定します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
result = pmcm.PmcmSetErcConfig(id, axis, PMCM_ERC_LOGIC, 0)
PmcmGetErcConfig
# X軸の出力論理を取得します。
axis = PMCM_AXIS_X
config = ctypes.c_ushort()
result = pmcm.PmcmGetErcConfig(id, axis, PMCM_ERC_LOGIC, ctypes.byref(config))
PmcmSetMotion
# X軸の動作パラメータを設定します。
axis = PMCM_AXIS_X
motion = (MOTIONPMCM * 2)()
motion[0].wMoveMode = PMCM_JOG
motion[0].wStartMode = PMCM_CONST
motion[0].fSpeedRate = 1
motion[0].wAccDecMode = PMCM_ACC_LINEAR
motion[0].fLowSpeed = 100
motion[0].fSpeed = 100
motion[0].wAccTime = 0
motion[0].wDecTime = 0
motion[0].fSAccSpeed = 0
motion[0].fSDecSpeed = 0
motion[0].lSlowdown = -1
motion[0].lStep = PMCM_DIR_CW
motion[0].bAbsolutePtp = 0
result = pmcm.PmcmSetMotion(id, axis, ctypes.byref(motion))
PmcmGetMotion
# X軸の動作パラメータを取得します。
axis = PMCM_AXIS_X
motion = (MOTIONPMCM * 2)()
result = pmcm.PmcmGetMotion(id, axis, ctypes.byref(motion))
PmcmSetMotionLine
# 直線補間動作パラメータを設定します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
motion_line = MOTIONLINEPMCM()
motion_line.wStartMode = PMCM_CONST
motion_line.fSpeedRate = 1
motion_line.wAccDecMode = PMCM_ACC_LINEAR
motion_line.fLowSpeed = 100
motion_line.fSpeed = 100
motion_line.wAccTime = 0
motion_line.wDecTime = 0
motion_line.fSAccSpeed = 0
motion_line.fSDecSpeed = 0
motion_line.lSlowdown = -1
motion_line.lStep[0] = 1000
motion_line.lStep[1] = 500
motion_line.bAbsolute[0] = 0
motion_line.bAbsolute[1] = 0
result = pmcm.PmcmSetMotionLine(id, axis, ctypes.byref(motion_line))
PmcmGetMotionLine
# 直線補間動作パラメータを取得します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
motion_line = MOTIONLINEPMCM()
result = pmcm.PmcmGetMotionLine(id, axis, ctypes.byref(motion_line))
PmcmSetMotionCp
# X軸のCP動作パラメータを2つ設定します。
axis = PMCM_AXIS_X
motion = (MOTIONPMCM * 2)()
motion[0].wMoveMode = PMCM_PTP
motion[0].wStartMode = PMCM_CONST
motion[0].fSpeedRate = 1
motion[0].wAccDecMode = PMCM_ACC_LINEAR
motion[0].fLowSpeed = 100
motion[0].fSpeed = 100
motion[0].wAccTime = 0
motion[0].wDecTime = 0
motion[0].fSAccSpeed = 0
motion[0].fSDecSpeed = 0
motion[0].lSlowdown = -1
motion[0].lStep = 1000
motion[0].bAbsolutePtp = 0
motion[1].wMoveMode = PMCM_PTP
motion[1].wStartMode = PMCM_CONST
motion[1].fSpeedRate = 1
motion[1].wAccDecMode = PMCM_ACC_LINEAR
motion[1].fLowSpeed = 100
motion[1].fSpeed = 100
motion[1].wAccTime = 0
motion[1].wDecTime = 0
motion[1].fSAccSpeed = 0
motion[1].fSDecSpeed = 0
motion[1].lSlowdown = -1
motion[1].lStep = 1000
motion[1].bAbsolutePtp = 0
result = pmcm.PmcmSetMotionCp(id, axis, ctypes.byref(motion), 2)
PmcmGetMotionCp
# X軸のCP動作パラメータを2つ取得します。
axis = PMCM_AXIS_X
motion = (MOTIONPMCM * 2)()
count = ctypes.c_ushort(2)
result = pmcm.PmcmGetMotionCp(id, axis,
                              ctypes.byref(motion), ctypes.byref(count))
PmcmStartMotion
# X軸とY軸の動作を開始します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
result = pmcm.PmcmStartMotion(id, axis)
PmcmStartMotionLine
# 直線補間動作を開始します。
result = pmcm.PmcmStartMotionLine(id)
PmcmStartMotionCp
# X軸とY軸のCP動作を開始します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
result = pmcm.PmcmStartMotionCp(id, axis)
PmcmStopMotion
# X軸とY軸のモーターを即停止します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
result = pmcm.PmcmStopMotion(id, axis, PMCM_IMMEDIATE_STOP)
PmcmChangeSpeed
# Y軸の速度を2000ppsに変更します。
axis = PMCM_AXIS_Y
speed = (ctypes.c_float * 2)()
speed[0] = 0
speed[1] = 2000
result = pmcm.PmcmChangeSpeed(id, axis,
                              PMCM_CHG_NEW_SPEED, ctypes.byref(speed))
PmcmChangeStep
# Y軸の目標位置を5000に変更します。
axis = PMCM_AXIS_Y
step = (ctypes.c_long * 2)()
step[0] = 0
step[1] = 5000
result = pmcm.PmcmChangeStep(id, axis, ctypes.byref(step))
PmcmGetStatus
# X軸の制御信号入力/出力状態を取得します。
axis = PMCM_AXIS_X
status = ctypes.c_ushort()
result = pmcm.PmcmGetStatus(id, axis, PMCM_SIG_STATUS, ctypes.byref(status))
PmcmGetEmptyCp
# X軸とY軸のCP空き動作パラメータ数を取得します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
empty = (ctypes.c_ushort * 2)()
result = pmcm.PmcmGetEmptyCp(id, axis, ctypes.byref(empty))
PmcmSetEventMask
# X軸とY軸の停止イベントを全てマスクに設定します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
result = pmcm.PmcmSetEventMask(id, axis, PMCM_EVENT_STOP, 0)
PmcmGetEventMask
# X軸の停止イベントマスクを取得します。
axis = PMCM_AXIS_X
config = ctypes.c_ushort()
result = pmcm.PmcmGetEventMask(id, axis, PMCM_EVENT_STOP, ctypes.byref(config))
PmcmSetEvent
# イベントの設定します。
kernel32 = ctypes.windll.Kernel32
event_handle = kernel32.CreateEventA(None, 1, 0, None)
result = pmcm.PmcmSetEvent(id, event_handle)
PmcmGetEventFactor
# イベント要因を取得します。
event_factor = EVENTFACTORPMCM()
result = pmcm.PmcmGetEventFactor(id, ctypes.byref(event_factor))
PmcmSetCounter
# X軸の出力パルスカウンタ値を1000、Y軸の出力パルスカウンタ値を-1000に設定します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
data = (ctypes.c_long * 2)()
data[0] = 1000
data[1] = -1000
result = pmcm.PmcmSetCounter(id, axis, ctypes.byref(data))
PmcmGetCounter
# X軸とY軸の出力パルスカウンタ値を取得します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
data = (ctypes.c_long * 2)()
result = pmcm.PmcmGetCounter(id, axis, ctypes.byref(data))
PmcmGetLatchCounter
# X軸とY軸の出力パルスカウンタのラッチカウンタ値を取得します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
data = (ctypes.c_long * 2)()
result = pmcm.PmcmGetLatchCounter(id, axis, ctypes.byref(data))
PmcmSetEncoder
# X軸のエンコーダカウンタ値を1000、Y軸のエンコーダカウンタ値を-1000に設定します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
data = (ctypes.c_long * 2)()
data[0] = 1000
data[1] = -1000
result = pmcm.PmcmSetEncoder(id, axis, ctypes.byref(data))
PmcmGetEncoder
# X軸とY軸のエンコーダカウンタ値を取得します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
data = (ctypes.c_long * 2)()
result = pmcm.PmcmGetEncoder(id, axis, ctypes.byref(data))
PmcmGetLatchEncoder
# X軸とY軸のエンコーダカウンタのラッチカウンタ値を取得します。
axis = PMCM_AXIS_X + PMCM_AXIS_Y
data = (ctypes.c_long * 2)()
result = pmcm.PmcmGetLatchEncoder(id, axis, ctypes.byref(data))

関連情報

製品情報
ヘルプファイル(ソフトウェア説明書)