モーションのオーバーライド

コーディング

通常のコードでは移動を停止してから次の移動を行います。生産タクトの改善目的で、移動途中で行き先を変更したい場合があります。ここでは、どのようにしてブレンド処理を行うかをご紹介します。

モーションオーバーライドで2000の位置に移動途中に4000の位置に書き換える方法

この検証では、ブレンド処理を行うタイミングで、目印としてデジタル出力を変化させています。

C#コード

位置の変更はOverridePos関数、速度の変更はOverrideVel関数を使用します。

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;
    }
}

コメント

タイトルとURLをコピーしました