遅いPythonでいかにして装置の動作を早くするか、現場レベルでは必要な考えですね。今回はある条件になったらあるモーションを自動で行うコードをご紹介します。
C#コードはこちらを参照して下さい
ある軸の残り距離が500になった時に、別の軸を動作させるモーション
タクト改善のために同時に軸を動かすことはよくあります。 今回はPythonで実現するためにはどのようなコードになるかを調べました。※WMX3.6で検証したコード
# WMXに必要なコード
from WMX3ApiPython import *
from time import *
INFINITE = int(0xFFFFFFFF)
def main():
# 制御する軸番号(0から始まります。)
AXIS_NO_X = 0
AXIS_NO_Y = 1
print('WMXプログラムスタート ディバイスを作成します')
# WMXを使用するおまじない
Wmx3Lib = WMX3Api()
Wmx3Lib.CreateDevice('C:\\Program Files\\SoftServo\\WMX3\\', DeviceType.DeviceTypeNormal, INFINITE)
Wmx3Lib.SetDeviceName('devicePython')
Wmx3Lib_cm = CoreMotion(Wmx3Lib)
#スレーブとの通信開始
ret = Wmx3Lib.StartCommunication(INFINITE)
#ここでユーザーの処理を記述します。
print('WMXサーボオン')
Wmx3Lib_cm.axisControl.SetServoOn(AXIS_NO_X, 1)
Wmx3Lib_cm.axisControl.SetServoOn(AXIS_NO_Y, 1)
# サーボがONするまで待機
while True:
ret, CmStatus = Wmx3Lib_cm.GetStatus()
if (CmStatus.GetAxesStatus(AXIS_NO_X).servoOn):
if (CmStatus.GetAxesStatus(AXIS_NO_Y).servoOn):
break
sleep(0.1)
# 現在座標を0にする
homeParam = Config_HomeParam()
ret, homeParam = Wmx3Lib_cm.config.GetHomeParam(AXIS_NO_X)
homeParam.homeType = Config_HomeType.CurrentPos
Wmx3Lib_cm.config.SetHomeParam(AXIS_NO_X, homeParam)
Wmx3Lib_cm.home.StartHome(AXIS_NO_X)
Wmx3Lib_cm.motion.Wait(AXIS_NO_X)
Wmx3Lib_cm.home.StartHome(AXIS_NO_Y)
Wmx3Lib_cm.motion.Wait(AXIS_NO_Y)
print('待機中1。何かキーを押すと軸の移動とトリガーモーションの記録を開始します。')
input() # 1個目の待ち
#移動ポイント1
posCommand1 = Motion_PosCommand()
posCommand1.axis = AXIS_NO_X #制御したい軸番号の設定
posCommand1.profile.type = ProfileType.Trapezoidal
posCommand1.profile.velocity = 7000 #スピード設定
posCommand1.profile.acc = 3000
posCommand1.profile.dec = 3000
posCommand1.target = 2000 #移動先の座標設定
Wmx3Lib_cm.motion.StartMov(posCommand1)
# この時点でX軸が移動を開始しています
#トリガーにより移動させるポイント2
posTrigger2 = Motion_TriggerPosCommand()
posTrigger2.axis = AXIS_NO_Y #制御したい軸番号の設定
posTrigger2.profile.type = ProfileType.Trapezoidal
posTrigger2.profile.velocity = 5000 #スピード設定
posTrigger2.profile.acc = 9000
posTrigger2.profile.dec = 9000
posTrigger2.target = 500 #移動先の座標設定
posTrigger2.trigger.triggerType = TriggerType.DistanceToTarget # 目標までの距離(ゴールに近いたとき)
posTrigger2.trigger.triggerAxis = 0 # トリガー監視軸番号
posTrigger2.trigger.triggerValue = 500 # トリガー監視の座標
Wmx3Lib_cm.motion.StartMov_Trigger(posTrigger2)
Wmx3Lib_cm.motion.Wait(AXIS_NO_Y) #移動命令の完了待ち(サーボの位置決め完了ではありません)
# Y軸はトリガー条件がそろった時点で移動を開始します
print('待機中2。移動を完了しました。何かキーを押すと終了します。')
input()
print('WMXサーボオフ')
Wmx3Lib_cm.axisControl.SetServoOn(AXIS_NO_X, 0)
Wmx3Lib_cm.axisControl.SetServoOn(AXIS_NO_Y, 0)
# サーボがOFFするまで待機
while True:
ret, CmStatus = Wmx3Lib_cm.GetStatus()
if (not CmStatus.GetAxesStatus(AXIS_NO_X).servoOn):
if (not CmStatus.GetAxesStatus(AXIS_NO_Y).servoOn):
break
sleep(0.1)
#スレーブとの通信終了
Wmx3Lib.StopCommunication(INFINITE)
#WMXの終了
Wmx3Lib.CloseDevice()
print('WMXプログラム終了')
sleep(3)
return 0
if __name__ == '__main__':
main()
注意点としては、相対移動がStartMov()ではなく、StartMov_Trigger()になります。
ちなみに、トリガーモーションコマンドをStartMov()関数に入れると以下のエラーとなります。
NotImplementedError: Wrong number or type of arguments for overloaded function 'Motion_StartMov'.
Possible C/C++ prototypes are:
wmx3ApiPython::Motion::StartMov(wmx3ApiPython::Motion_PosCommand *)
wmx3ApiPython::Motion::StartMov(unsigned int,PyObject *)
実行結果
軌跡をプロットしました、動きとしては、軸0を移動させます。移動中の残り距離が500になった時に、軸1のモーション動作が実行されました。
トリガーモーションは、装置制御で動きの待ち時間を少なくする武器として使用してください。