装置を制御する上で位置制御以外の動作を行いたいことがあります。 ここでは制御モードの切り替えをご紹介します。
現在の指令モードの確認方法
WMX3 Consoleアプリで[Torque]をクリックしてください。
現在の軸の指令状態は[Torque]画面のCommand Modeのに表示されています。
位置制御モードに切り替え
絶対位置・相対位置に移動を行うモードです。 移動時のトルクリミットを指定することができます。※WMX3.6で検証したコード
private void 軸指令モードを位置制御に変更()
{
var mCoreMotion = new CoreMotion(API); // おまじない
//軸を位置指令モードに設定する
const int AxisNo = 0; // 変更する軸番号
int err = mCoreMotion.AxisControl.SetAxisCommandMode(AxisNo, AxisCommandMode.Position);
if (err != ErrorCode.None)
{
Console.WriteLine("Failed to SetMode_Position(). Error=" + err + " (" + CoreMotion.ErrorToString(err) + ")");
}
// 位置制御でのトルクリミット設定
const double TorqueLimit = 0; // 最大トルクリミット
mCoreMotion.Torque.SetPositiveTrqLimit(AxisNo, TorqueLimit);
mCoreMotion.Torque.SetNegativeTrqLimit(AxisNo, TorqueLimit);
mCoreMotion.Torque.SetMaxTrqLimit(AxisNo, TorqueLimit);
}
シングルターン
無限に回転させる軸はシングルターンモードに設定を行います
int i一回転の移動量 = 5000;
int err = CMotion.Config.SetSingleTurn(i対象モータNo, true, i一回転の移動量);
if (err != ErrorCode.None)
{
// 設定エラーの時
}
トルクモードに切り替え
StartTrq関数でトルク値が切り替わります
private void 軸指令モードをトルク制御に変更()
{
var mCoreMotion = new CoreMotion(API); // おまじない
// 軸をトルク指令モードに設定する
const int AxisNo = 0; // 変更する軸番号
int err = mCoreMotion.AxisControl.SetAxisCommandMode(AxisNo, AxisCommandMode.Torque);
if (err != ErrorCode.None)
{
// モード切り替え失敗のとき
Console.WriteLine("Failed to SetMode_Torque(). Error=" + err + " (" + CoreMotion.ErrorToString(err) + ")");
}
// トルク値設定
var tc = new Torque.TrqCommand();
tc.Axis = AxisNo;
tc.Torque = 50; // 印加するトルク値
mCoreMotion.Torque.StartTrq(tc);
System.Threading.Thread.Sleep(1000);
mCoreMotion.Torque.StopTrq(AxisNo); // トルクの印加を停止します
}
速度制御モードに切り替え
StartVel関数で速度が切り替わります。
private void 軸指令モードを速度制御に変更()
{
var mCoreMotion = new CoreMotion(API); // おまじない
//軸を速度指令モードに設定する
const int AxisNo = 0; // 変更する軸番号
int err = mCoreMotion.AxisControl.SetAxisCommandMode(AxisNo, AxisCommandMode.Velocity);
if (err != ErrorCode.None)
{
Console.WriteLine("Failed to SetMode_Velocity(). Error=" + err + " (" + CoreMotion.ErrorToString(err) + ")");
}
// 速度の設定
var Com = new Velocity.VelCommand();
Com.Axis = AxisNo;
Com.Profile.Velocity = 1000;
Com.Profile.Acc = 500;
Com.Profile.Dec = 500;
mCoreMotion.Velocity.StartVel(Com); // 速度制御開始
System.Threading.Thread.Sleep(1000);
mCoreMotion.Velocity.Stop(AxisNo); // 速度制御を停止します
}
WMX3Api Error: One or more axes are not in Idle operation state. ErrorNo=1546 軸の切り替え時のエラー
指令の切り替え関数でエラーが出る場合があります。 この条件は、位置制御で移動中であった、トルク制御のトルク印可中であった、速度制御で動作中であったときの3点です。
エラーを出さないためには、軸を停止状態(Idle状態)で変更してください。
トルクモードから他のモードへ変更できないときの解決方法
トルクをいったん0にすることで、解決します。 この命令の後に他のモードに切り替えます。
mCoreMotion.Torque.StopTrq(AxisNo);
速度モードから他のモードへ変更できないときの解決方法
速度をいったん0にすることで、解決します。 この命令の後に他のモードに切り替えます。
mCoreMotion.Velocity.Stop(AxisNo);
【複合のWMX API】位置指令を実行している軸に対して、トルク指令で指定トルクを印加する方法
StartTrq関数を使用して指令を切り替えてトルクの値を設定する方法では、一瞬印可トルクが0になるときがあります。これを回避するためにStartPosToTrq関数が用意されています。この処理を行うときは、軸がIdle状態である必要はありません。
private void 位置制御からトルク制御に動的な変更()
{
var mCoreMotion = new CoreMotion(API); // おまじない
// この時点で位置制御であることが前提です
var ttc = new Torque.TriggerTrqCommand(); // トルク値パラメータ
ttc.Axis = 0; // 変更する軸番号
ttc.Torque = 50; // 印加するトルク値
// 位置指令を実行している軸に対して、トルク指令で指定トルクを印加
int err = mCoreMotion.Torque.StartPosToTrq(ttc);
if (err != ErrorCode.None)
{
// モード切り替え失敗のとき
Console.WriteLine("Failed to StartPosToTrq(). Error=" + err + " (" + CoreMotion.ErrorToString(err) + ")");
}
}
【複合のWMX API】トルク指令を実行している軸に対して、位置指令で指定位置に移動を開始
SetAxisCommandMode関数で位置制御に切り替えて軸の移動を行う方法では、軌跡のばらつきが出ることがあります。これを回避するためにStartTrqToPos関数が用意されています。この処理を行うときは、軸がIdle状態である必要はありません。※WMX3.6で検証したコード
private void トルク制御から位置制御に動的な変更()
{
var mCoreMotion = new CoreMotion(API); // おまじない
// この時点で位置制御であることが前提です
var tpc = new Motion.TriggerPosCommand(); // トルク値パラメータ
tpc.Axis = 0; // 変更する軸番号
tpc.Target = 300; // 移動先の座標
tpc.Profile.Velocity = 9000; // 速度
tpc.Profile.Acc = 900; // 加速
tpc.Profile.Dec = 900; // 減速
// トルク指令を実行している軸に対して、位置指令で指定位置に移動を開始
int err = mCoreMotion.Motion.StartTrqToPos (tpc);
if (err != ErrorCode.None)
{
// モード切り替え失敗のとき
Console.WriteLine("Failed to StartTrqToPos(). Error=" + err + " (" + CoreMotion.ErrorToString(err) + ")");
}
}
コメント