WMX3 C#サンプルコードの説明 JerkRatio制御

コーディング

本記事では、WMXとC# を用いたプログラミング学習の第一歩として、公式サンプルコードの読み解き方を解説します。開発環境はWMX3.6とMicrosoft Visual Studio 2019を想定しており、C#の初心者でも理解しやすいよう、基本的な文法や概念についても補足します。

[1_BasicMotion]07_JerkRatioMotion

サーボモータの制御における Jerk Ratio(ジャーク比 / 躍度比) とは、一言で言えば**「加速・減速のなめらかさを決定する指標」**のことです。

物理学において、速度の変化率が「加速度」であるのに対し、加速度の変化率を「ジャーク(躍度)」と呼びます。このジャークをどのように制御に組み込むかを示すのが Jerk Ratio です。

機械の振動を抑える必要が出たときに検討してください。

サンプルコード

連続で動作させるために、コンソールでの動作切替も変更しています。プログラム起動時に座標0にしています。 数字を押すと座標200000に移動します。

/*****************************************************************************/
/* FILE        : JerkRatioMotion.cs                                          */
/* DESCRIPTION : Sample to change the jerk ratio and operate the servo       */
/*****************************************************************************/
using System;
using System.Threading;
using WMX3ApiCLR;

namespace CSharpAPISample
{
    class JerkRatioMotion
    {
        static WMX3Api          Wmx3Lib    = new WMX3Api();
        static EngineStatus     EnStatus   = new EngineStatus();
        static CoreMotionStatus CmStatus   = new CoreMotionStatus();
        static CoreMotion       Wmx3Lib_cm = new CoreMotion(Wmx3Lib);

        /// <summary>
        /// テストプログラム
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            double jerkRatio;

            Console.WriteLine("Program Start.");
            Thread.Sleep(1000);

            InitializeFunc();

            Wmx3Lib_cm.Home.SetCommandPos(0, 0);

            Console.WriteLine("select jerkratio.");
            Console.WriteLine("1.jerkratio   :0   percent.");
            Console.WriteLine("2.jerkratio   :25  percent.");
            Console.WriteLine("3.jerkratio   :50  percent.");
            Console.WriteLine("4.jerkratio   :75  percent.");
            Console.WriteLine("5.jerkratio   :100 percent.");
            Console.WriteLine("else.jerkratio:0   percent.");
            Console.WriteLine("数字をキーボードで入力してください->");

            int selectNum;

            while (true)
            {
                string line = Console.ReadLine();   // キー入力があるまでここで待機します

                if (line != null && int.TryParse(line, out selectNum))
                {
                    break;
                }

                Console.WriteLine("->");
            }

            StartLog();

            switch (selectNum)
            {
                case 2:
                    Console.WriteLine("jerkratio:25 percent.");
                    jerkRatio = 0.25;
                    break;
                case 3:
                    Console.WriteLine("jerkratio:50 percent.");
                    jerkRatio = 0.50;
                    break;
                case 4:
                    Console.WriteLine("jerkratio:75 percent.");
                    jerkRatio = 0.75;
                    break;
                case 5:
                    Console.WriteLine("jerkratio:100 percent.");
                    jerkRatio = 1.00;   // 完全なS字駆動
                    break;
                case 1:
                default:
                    Console.WriteLine("jerkratio:0 percent.");
                    jerkRatio = 0;      // 台形駆動
                    break;
            }

            Console.WriteLine("Motion Start!");

            // 軸の移動命令
            Motion.PosCommand posCommand = new Motion.PosCommand();
            posCommand.Profile.Type = WMX3ApiCLR.ProfileType.JerkRatio;
            posCommand.Axis                     = 0;
            posCommand.Target                   = 200000;
            posCommand.Profile.Velocity         = 100000;
            posCommand.Profile.StartingVelocity = 0;
            posCommand.Profile.EndVelocity      = 0;
            posCommand.Profile.Acc              = 100000;
            posCommand.Profile.Dec              = 100000;
            posCommand.Profile.JerkAccRatio     = jerkRatio;
            posCommand.Profile.JerkDecRatio     = jerkRatio;

            // 移動開始
            Wmx3Lib_cm.Motion.StartMov(posCommand);

            // 指令が完了するまで待機
            Wmx3Lib_cm.Motion.Wait(0);

            FinalizeFunc();

            Console.WriteLine("Program End");
            Thread.Sleep(3000);
         }

        /// <summary>I/O操作クラス(IOApi_CLRLib.dll)</summary>
        private static Io mIO;

        /// <summary>
        /// グラフ記録開始
        /// </summary>
        private static void StartLog()
        {
            // IOApi_CLRLibの参照が必要です
            mIO = new Io(Wmx3Lib);
            mIO.SetOutBit(0, 0, 1);         // 記録(プロット)開始

            // すぐにフラグをOFFにするとトリガーがかかりません
            System.Threading.Thread.Sleep(200);
            mIO.SetOutBit(0, 0, 0);
            //System.Threading.Thread.Sleep(100);
        }

        // 以下のコードはサンプルコードそのままなので省略
    }
}

実行結果

プログラム起動で、どのジャーク比で移動させるかを聞いてきます。数字を押すと移動します。

1を押したときの波形 台形のプロファイル

オレンジが軸の座標。赤色が軸の移動速度。黄色が加減速を表しています。

加速から等速、等速から減速へと切り替わる瞬間に加速度が不連続に変化するため、機械的な衝撃が発生しやすくなります。

3を押したときの波形

台形とS字の中間のプロファイルです。

5を押したときの波形 S字台形のプロファイル

モータおよび装置への急激な負荷変動を抑えた動作です。実際の動作としても、目視で分かるほど滑らかで衝撃の少ない移動が実現できます。

. Jerk Ratio の具体的な意味

通常、サーボの移動パターン(モーションプロファイル)には大きく分けて2つの形があります。

  • 台形駆動(Jerk Ratio = 0%): 加速度が瞬時に立ち上がる形式。
  • S字駆動(Jerk Ratio > 0%): 加速度を徐々に変化させ、速度グラフを「S字」にする形式。

Jerk Ratio は、加速時間全体のうち、「加速度を変化させている時間(S字のカーブ部分)」が占める割合を指します。

  • 0% の場合: 加速度は一瞬で最大値に達します(台形駆動)。
  • 100% の場合: 加速時間の全域を使って加速度を変化させます(完全なS字駆動)。

. トレードオフ(注意点)

良いことばかりではなく、以下の点に注意が必要です。

  • タクトタイム(動作時間)の増加: Jerk Ratio を大きくする(なめらかにする)ほど、最高速度に達するまでの時間がわずかに長くなります。
  • 最大加速度の増大: 同じ時間で同じ距離を移動しようとして Jerk Ratio を上げると、加速の中間地点での**瞬間の加速度(ピーク加速度)**は、台形駆動よりも高く設定する必要があります。

おわりに

WMXでは、標準的なS字制御にとどまらず、パラボリック(Parabolic)や二速度ジャーク比の指定など、きめ細やかなプロファイル生成をサポートしています。

「搬送時間を短縮したいが、停止時の揺れは抑えたい」「行きと帰りで負荷が異なる」といった具体的な課題に対し、これらのパラメータを組み合わせることで解決策が見えてきます。 ソフトウェアベースである利点を活かし、様々なプロファイルを柔軟に切り替え、実際の装置挙動を確認しながら**「最適解」**を見つけ出していきましょう。

コメント

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