2D円弧モーション動作

コーディング

WMXで2軸の円弧モーションを実行するには、以下の5つの機能があります。

機能 指定方法
機能1 中心点と円弧長(Center and Length)
機能2 中心点と終点(Center and End)
機能3 通過点と終点(Through and End)
機能4 円弧長と終点(Length and End)
機能5 半径と終点(Radius and End)
どの機能も同じ円弧を描けますが、アプリケーションによって「中心座標がわかっている」「通過させたい点がある」など、使いやすいパラメータは異なります。設計や制御の都合に合わせて、コーディングしやすい機能を選択してください。

この記事では、各機能のC#プログラムの書き方と、MotionScopeで確認した実行結果の軌跡を示します。

※WMX3.6で検証したコードです。

紹介しているサンプルコード

実行コードはこちら

https://github.com/WMX-fan/WMX-Sample-2DArc/releases/download/v1.0.0/WMX-Sample-2DArcv1.0.0.zip

コードはこちら

GitHub - WMX-fan/WMX-Sample-2DArc: 円弧補間指令のサンプルコード
円弧補間指令のサンプルコード. Contribute to WMX-fan/WMX-Sample-2DArc development by creating an account on GitHub.

【機能1】中心点と円弧長(Center and Length)

回転方向が時計回りか、反時計回りかを指定する必要があります。中心位置は、絶対位置または相対位置で指定します。

動作結果

現在位置が(0,0)の時、中心点(100,0)、モーション円弧の長さ(45°)、方向0でプロットしました。反時計回りに回ります。

コマンドを実行した位置が開始位置になりますので、4回コマンドを送ると1周します。

検証サンプルコード

        /// <summary>
        /// 中心点と円弧長の移動
        /// </summary>
        /// <param name="AxisNo">制御軸</param>
        /// <returns>true=正常 false=エラー発生</returns>
        private bool Move2次元_中心点と円弧長(int[] AxisNo)
        {
            // 指令
            var ArcPara = new Motion.CenterAndLengthCircularIntplCommand();
            ArcPara.Axis[0] = AxisNo[0];                                        // 制御軸 X
            ArcPara.Axis[1] = AxisNo[1];                                        // 制御軸 Y
            ArcPara.CenterPos[0] = (int)中心点と円弧長_X_nud.Value;             // 中心点
            ArcPara.CenterPos[1] = (int)中心点と円弧長_Y_nud.Value;
            ArcPara.ArcLengthDegree = (double)中心点と円弧長_Length_nud.Value;  // モーション指令の弧の長さ(度)。 
            ArcPara.Clockwise = (byte)中心点と円弧長_Clockwise_nud.Value;       // 動作方向
            ArcPara.Profile.Velocity = Get動作スピード();                       // 移動スピード
            ArcPara.Profile.Acc = Get動作加減速();
            ArcPara.Profile.Dec = Get動作加減速();
            ArcPara.Profile.Type = ProfileType.Trapezoidal;                     // プロファイル
            

            // 移動開始
            int IsErr = CMotion.Motion.StartCircularIntplPos(ArcPara);
            if (IsErr != ErrorCode.None)
            {
                return false;
            }

            // 停止確認軸
            AxisSelection pAxisSelection = new AxisSelection(AxisNo.Length, AxisNo);
            IsErr = CMotion.Motion.Wait(pAxisSelection);
            if (IsErr != ErrorCode.None)
            {
                return false;
            }
            return true;
        }

【機能2】中心点と終点(Center and End)

終端位置は、開始位置と同じ位置でも動作します。実行時のエラーは出ません。中心位置は、絶対位置または相対位置で指定します。

動作結果

現在位置が(0,0)の時、中心点(100,0)、終了点(200,0)、方向0でプロットしました。反時計回りに回ります。

検証サンプルコード

        /// <summary>
        /// 中心点と終点の移動
        /// </summary>
        /// <param name="AxisNo">制御軸</param>
        /// <returns>true=正常 false=エラー発生</returns>
        private bool Move2次元_中心点と終点(int[] AxisNo)
        {
            // 指令
            var ArcPara = new Motion.CenterAndEndCircularIntplCommand();
            ArcPara.Axis[0] = AxisNo[0];                                        // 制御軸 X
            ArcPara.Axis[1] = AxisNo[1];                                        // 制御軸 Y
            ArcPara.CenterPos[0] = (int)中心点と終点_中心X_nud.Value;           // 中心点
            ArcPara.CenterPos[1] = (int)中心点と終点_中心Y_nud.Value;
            ArcPara.EndPos[0] = (int)中心点と終点_終了X_nud.Value;              // 終端位置
            ArcPara.EndPos[1] = (int)中心点と終点_終了Y_nud.Value;
            ArcPara.Profile.Velocity = Get動作スピード();                       // 移動スピード
            ArcPara.Profile.Acc = Get動作加減速();
            ArcPara.Profile.Dec = Get動作加減速();
            ArcPara.Profile.Type = ProfileType.Trapezoidal;                     // プロファイル
            ArcPara.Clockwise = (byte)中心点と終点_方向_nud.Value;                  // 動作方向

            // 移動開始
            int IsErr = CMotion.Motion.StartCircularIntplPos(ArcPara);
            if (IsErr != ErrorCode.None)
            {
                return false;
            }

            // 停止確認軸
            AxisSelection pAxisSelection = new AxisSelection(AxisNo.Length, AxisNo);
            IsErr = CMotion.Motion.Wait(pAxisSelection);
            if (IsErr != ErrorCode.None)
            {
                return false;
            }
            return true;
        }

【機能3】通過点と終点(Through and End)

終端位置および通過位置は、絶対位置または相対位置として指定することができます。現在位置から指定した座標を通ります。

現在位置が(0,0)の時、通過点(30,60)、終了点(60,0)で円弧モーションをプロットしました。

結果

図の横方向が軸0で、縦方向が軸1の図になります。

動作後の座標は下記のようになります。モーション動作中は軸0と1の座標が変わります。

検証サンプルコード

このコードを実行すると、黒いDos画面が出てモーションコントロールが可能な状態で待機しています。キーを押すとコードが進み円弧モーションが行われます。

        /// <summary>
        /// 2D円弧モーション 通過点と終点
        /// </summary>
        private bool 通過点と終点(int[] AxisNo)
        {

            // 指令
            var ArcPara = new Motion.ThroughAndEndCircularIntplCommand();
            ArcPara.Axis[0] = AxisNo[0];                                    // 制御軸 X
            ArcPara.Axis[1] = AxisNo[1];                                    // 制御軸 Y
            ArcPara.ThroughPos[0] = (int)通過点と終点_通過座標X_nud.Value;  // 通過座標
            ArcPara.ThroughPos[1] = (int)通過点と終点_通過座標Y_nud.Value;
            ArcPara.EndPos[0] = (int)通過点と終点_終点X_nud.Value;          // 終端位置
            ArcPara.EndPos[1] = (int)通過点と終点_終点Y_nud.Value;
            ArcPara.Profile.Velocity = Get動作スピード();                   // 移動スピード
            ArcPara.Profile.Acc = Get動作加減速();
            ArcPara.Profile.Dec = Get動作加減速();
            ArcPara.Profile.Type = ProfileType.Trapezoidal;             // 台形プロファイル

            // モーション開始
            int IsErr = CMotion.Motion.StartCircularIntplPos(ArcPara);
            if (IsErr != ErrorCode.None)
            {
                // [エラー番号]65655=指定したパラメータが直線ではない明確に定義された円弧を生成することを確認してください。
                Console.WriteLine("StartCircularIntplPosエラー:" + IsErr);
                return false;
            }

            // 停止確認軸
            AxisSelection pAxisSelection = new AxisSelection(AxisNo.Length, AxisNo);
            IsErr = CMotion.Motion.Wait(pAxisSelection);
            if (IsErr != ErrorCode.None)
            {
                Console.WriteLine("Waitエラー:" + IsErr);
                return false;
            }

            return true;
        }

[モーション実行中のエラー]番号65655

円弧モーションで、経由位置と終端位置が直線を指定した場合にエラーになります。直線になるようにパラメータを設定した時にこのエラーが発生します。

【機能4】円弧長と終点(Length and End)

現在の位置が開始位置で、終端位置、円弧長さ、回転方向を指定すると動作します。終端位置は、絶対位置または相対位置として指定することができます。

動作結果

円弧長は度数になります。

一番計算と目視がしやすい「綺麗な半円」を描かせてみます。開始位置: S1=0, S2=0

終端位置 (絶対): E1=100, E2=0 円弧長 (d): 180

検証サンプルコード

        private bool Move2次元_円弧の長さと終点(int[] AxisNo)
        {

            // 指令
            var ArcPara = new Motion.LengthAndEndCircularIntplCommand();
            ArcPara.Axis[0] = AxisNo[0];                                                  // 制御軸 X
            ArcPara.Axis[1] = AxisNo[1];                                                  // 制御軸 Y
            ArcPara.ArcLengthDegree = (int)円弧長と終点_円弧長さ_nud.Value;               // 円弧セグメントの円弧の長さ(度単位)
            ArcPara.EndPos[0] = (double)円弧長と終点_終点X_nud.Value;                       // 終端位置
            ArcPara.EndPos[1] = (double)円弧長と終点_終点Y_nud.Value;
            ArcPara.Profile.Velocity = Get動作スピード();                                  // 移動スピード
            ArcPara.Profile.Acc = Get動作加減速();
            ArcPara.Profile.Dec = Get動作加減速();
            ArcPara.Profile.Type = ProfileType.Trapezoidal;                                // 台形プロファイル
            ArcPara.Clockwise = (byte)円弧長と終点_方向_nud.Value;                          // 動作方向 0に設定すると、(arcLengthDegree>0だと)反時計回りの方向に動きます。1に設定すると、(arcLengthDegree>0だと)時計回りの方向に動きます。 

            // 移動開始
            int IsErr = CMotion.Motion.StartCircularIntplPos(ArcPara);
            if (IsErr != ErrorCode.None)
            {
                return false;
            }

            // 停止確認軸
            AxisSelection pAxisSelection = new AxisSelection(AxisNo.Length, AxisNo);
            IsErr = CMotion.Motion.Wait(pAxisSelection);                                   // 移動完了待ち
            if (IsErr != ErrorCode.None)
            {
                return false;
            }
            return true;
        }

【機能5】半径と終点(Radius and End)

現在の位置が開始位置で、終端位置、半径、回転方向を指定すると動作します。終端位置は、絶対位置または相対位置として指定することができます。

動作結果

開始位置: S1=0, S2=0 終端位置 (絶対): E1=100, E2=0 半径=50 方向=1

検証サンプルコード

private bool Move2次元円弧補間_半径と終点(int[] AxisNo)
        {

            // 指令
            var ArcPara = new Motion.RadiusAndEndCircularIntplCommand();
            ArcPara.Axis[0] = AxisNo[0];                                          // 制御軸 X
            ArcPara.Axis[1] = AxisNo[1];                                          // 制御軸 Y
            ArcPara.Radius = (int)半径と終点_円弧の半径_nud.Value;                // 円弧セグメントの円弧の長さ(度単位)
            ArcPara.EndPos[0] = (int)半径と終点_終点X_nud.Value;                   // 終端位置
            ArcPara.EndPos[1] = (int)半径と終点_終点Y_nud.Value;
            ArcPara.Clockwise = (byte)半径と終点_方向_nud.Value;                   // 動作方向 0の場合、円弧は反時計回りに回転します。1の場合、円弧は時計回りに回転します
            ArcPara.Profile.Velocity = Get動作スピード();                         // 移動スピード
            ArcPara.Profile.Acc = Get動作加減速();
            ArcPara.Profile.Dec = Get動作加減速();
            ArcPara.Profile.Type = ProfileType.Trapezoidal;                       // 台形プロファイル

            // 移動開始
            int IsErr = CMotion.Motion.StartCircularIntplPos(ArcPara);
            if (IsErr != ErrorCode.None)
            {
                return false;
            }

            // 停止確認軸
            AxisSelection pAxisSelection = new AxisSelection(AxisNo.Length, AxisNo);
            IsErr = CMotion.Motion.Wait(pAxisSelection);                            // 移動完了待ち
            if (IsErr != ErrorCode.None)
            {
                return false;
            }
            return true;
        }

終わりに

移動途中がどのように動いているかを確認する場合MotionScopeを使います。このツールがないとなかなかデバックが難しいですね。

WOSにも円弧動作の機能があります。

開発のヒントにしてください。

コメント

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