通常のコードでは移動を停止してから次の移動を行います。生産タクトの改善目的で、移動途中で行き先を変更したい場合があります。ここでは、どのようにしてブレンド処理を行うかをご紹介します。
モーションオーバーライドで2000の位置に移動途中に4000の位置に書き換える方法
この検証では、ブレンド処理を行うタイミングで、目印としてデジタル出力を変化させています。
C#コード
位置の変更はOverridePos関数、速度の変更はOverrideVel関数を使用します。※WMX3.6で検証したコード
void Moveオーバーライドモーション()
{
var CMotion = new CoreMotion(API);
//軸0に対して通常のモーション指令を実行する
var pos = new Motion.PosCommand();
pos.Axis = 0; // 制御軸
pos.Profile.Type = ProfileType.Trapezoidal;
pos.Profile.Velocity = 1600;
pos.Profile.Acc = 9100;
pos.Profile.Dec = 9100;
pos.Target = 2000; // 目的座標
var IsErr = CMotion.Motion.StartPos(pos); // 移動開始
if (IsErr != ErrorCode.None)
{
Console.WriteLine("エラー" + IsErr);
}
// この時点で軸が移動しています
System.Threading.Thread.Sleep(2000); // オーバーライドまでの時間待ち
mIO.SetOutBit(0, 1, 1); // 切り替わりの目印でデジタル出力をONします
// 【目的座標の変更】
pos.Profile.Velocity = 3000;
pos.Target = 4000; // 目的座標
IsErr = CMotion.Motion.OverridePos(pos); // オーバーライド
if (IsErr != ErrorCode.None)
{
Console.WriteLine("エラー" + IsErr);
}
System.Threading.Thread.Sleep(2000); // オーバーライドまでの時間待ち
mIO.SetOutBit(0, 1, 0); // 切り替わりの目印でデジタル出力をONします
// 【最大スピードの変更】
pos.Profile.Acc = 90000; // 最大スピード
IsErr = CMotion.Motion.OverrideVel(pos); // オーバーライド
if (IsErr != ErrorCode.None)
{
Console.WriteLine("エラー" + IsErr);
}
CMotion.Motion.Wait(0); // 軸の停止待ち
}
軸の停止中にオーバーライド命令を行うとエラーになる
軸の移動モーション中でないときに、オーバーライドを行うと[NotPosOrJogOrVelocityState]エラーが発生し、移動命令が失敗します。 軸が移動中であるかを確認したあとに、オーバーライド命令を行ってください。
private void Move停止中のオーバーライドコマンド()
{
// 目的座標の変更
var pos = new Motion.PosCommand();
pos.Profile.Velocity = 3000;
pos.Target = 4000; // 目的座標
int IsErr = CMotion.Motion.OverridePos(pos); // オーバーライド
switch (IsErr)
{
case CoreMotionErrorCode.NotPosOrJogOrVelocityState:
// [エラー番号65563]1つ以上の軸がPos、Jog、またはVelocityの動作状態ではありません。
break;
}
}
モーション移動中に通常の移動命令を送るとエラーになる
オーバーライドには専用のコードが必要になります。軸が移動中に次の移動命令を送ると、エラー番号1563は「軸はまだ前の指令を開始しています。次の通信サイクルまで待ってください」という意味になります。
private void Moveオーバーライドモーション_移動が失敗するコード()
{
// 移動している軸に対して、行先を変更します。
var CMotion = new CoreMotion(API);
//軸0に対して通常のモーション指令を実行する
var pos = new Motion.PosCommand();
pos.Axis = 0; // 制御軸
pos.Profile.Type = ProfileType.Trapezoidal;
pos.Profile.Velocity = 6000;
pos.Profile.Acc = 91000;
pos.Profile.Dec = 91000;
pos.Target = 2000; // 目的座標
var IsErr = CMotion.Motion.StartPos(pos); // 移動開始
if(IsErr != ErrorCode.None)
{
Console.WriteLine("エラー" + IsErr);
}
System.Threading.Thread.Sleep(1000); // オーバーライドまでの時間待ち
// 行先変更
mIO.SetOutBit(0, 1, 1); // 切り替わりの目印でデジタル出力をONします
pos.Profile.Type = ProfileType.Trapezoidal;
pos.Profile.Velocity = 30000;
pos.Profile.Acc = 90000;
pos.Profile.Dec = 90000;
pos.Target = 4000; // 目的座標
IsErr = CMotion.Motion.StartPos(pos); // 移動開始
switch (IsErr)
{
case ErrorCode.None:
break;
case ErrorCode.StartingPreviousCommand:
Console.WriteLine("軸はまだ前の指令を開始しています。次の通信サイクルまで待ってください");
break;
default:
Console.WriteLine("エラー" + IsErr);
break;
}
}
コメント