軸指令モードの切替方法

コーディング

装置を制御する上で位置制御以外の動作を行いたいことがあります。 ここでは制御モードの切り替えをご紹介します。

現在の指令モードの確認方法

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) + ")");
    }

}

3つの制御モードの特徴比較

WMX3で選択できる指令モードは主に「位置制御」「速度制御」「トルク制御」の3種類です。それぞれの特徴を整理すると以下の通りです。

位置制御(Position)指定座標への移動、位置決め動作移動完了後に自動停止Yes速度制御(Velocity)コンベア・連続回転など速度維持Stop() を明示的に呼ぶYesトルク制御(Torque)押し付け・把持など力制御StopTrq() を明示的に呼ぶYes
モード主な用途停止方法Idle必要?

モード切替の典型的なユースケース

組み立て装置での押し付け制御

位置制御でワークを目標位置まで移動させた後、トルクモードに切り替えて一定力で押し付ける、というシーケンスが典型的です。この場合は StartPosToTrq を使うと、切り替え瞬間のトルク抜けを防げます。

コンベア搬送からの位置決め

速度モードでベルトを走らせ、センサーが反応したら位置モードに切り替えて正確に停止させるパターンです。Speed → Position の切り替えは Idle 状態が必要なので、一度 Stop() で速度ゼロにしてからモードを変更します。

モード切替の注意事項まとめ

  • SetAxisCommandMode はIdle状態でのみ有効:動作中に呼ぶとErrorNo=1546が返ります。トルクモードなら StopTrq()、速度モードなら Stop() で停止してから切り替えてください。
  • StartPosToTrq / StartTrqToPos はIdle不要:動作中のスムーズなモード遷移にはこちらを使います。瞬間的なトルク抜けや軌跡ばらつきを防げます。
  • トルクリミットの設定を忘れずに:位置モードへ切り替えた直後はトルクリミットが残っている場合があります。必要に応じて SetPositiveTrqLimit / SetNegativeTrqLimit を再設定してください。
  • サーボ励磁状態を確認する:SetAxisCommandMode 実行後も、SetServoOn でサーボがONになっていることを確認してから移動指令を出してください。

コメント

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